summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemi Collet <fedora@famillecollet.com>2010-05-30 19:37:05 +0200
committerRemi Collet <fedora@famillecollet.com>2010-05-30 19:37:05 +0200
commit9a9c61c739c976a9fcbe086e03b5305b0e646d5c (patch)
tree33716a03fd9e88e5b1d2de9bde7efc8603e02d1e
parentb613aa3f99a51e08b16b4402de2b684d3f266b66 (diff)
parent4fe73c547050003599021850f0c6099f7c224f07 (diff)
merge
-rw-r--r--LICENSE661
-rw-r--r--all.php443
-rw-r--r--config.inc.php.dist35
-rw-r--r--css/rpmphp.css7
-rw-r--r--index.php1
-rw-r--r--main.inc.php61
-rw-r--r--refresh.php1094
-rw-r--r--rpm.php463
-rw-r--r--smarty/templates/rpmphp/all.tpl104
-rw-r--r--smarty/templates/rpmphp/index.tpl20
-rw-r--r--smarty/templates/rpmphp/main.tpl20
-rw-r--r--smarty/templates/rpmphp/rpm.tpl106
-rw-r--r--smarty/templates/rpmphp/zoom.tpl21
-rw-r--r--zoom.php1
14 files changed, 2148 insertions, 889 deletions
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..dba13ed
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,661 @@
+ GNU AFFERO GENERAL PUBLIC LICENSE
+ Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+ A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate. Many developers of free software are heartened and
+encouraged by the resulting cooperation. However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+ The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community. It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server. Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+ An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals. This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU Affero General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Remote Network Interaction; Use with the GNU General Public License.
+
+ Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software. This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time. Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source. For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code. There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+<http://www.gnu.org/licenses/>.
diff --git a/all.php b/all.php
index 2b32a5b..32596d3 100644
--- a/all.php
+++ b/all.php
@@ -1,248 +1,213 @@
<?php
+
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Package in Fedora repositories
+ *
+ * PHP version 5
+ *
+ * Copyright © 2010 Remi Collet
+ *
+ * This file is part of rpmphp.
+ *
+ * rpmphp is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * rpmphp is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with rpmphp. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category Main
+ * @package RPMPHP
+ *
+ * @author Remi Collet <unknown@unknwown.com>
+ * @author Johan Cwiklinski <johan@x-tnd.be>
+ * @copyright 2010 Remi Collet
+ * @license http://www.gnu.org/licenses/agpl-3.0-standalone.html AGPL License 3.0 or (at your option) any later version
+ * @link http://github.com/remicollet/rpmphp/
+ * @since The begining of times.
+*/
+require 'main.inc.php';
$what=(isset($_GET["what"]) ? $_GET["what"] : false);
-require "config.inc.php";
-
-function listRepos($db){
- $repos = array();
- $res=$db->query("SELECT * FROM repo WHERE active=1 ORDER BY ID");
- if ($res) while ($repo = $res->fetchObject()) {
- $repos[$repo->main][$repo->sub]=$repo;
- }
- // echo "<pre>"; print_r($repos);echo "</pre>";
- foreach($repos as $repomain) {
- foreach ($repomain as $repo) {
- /*printf ("<th align='left'>%s</th>", $repo->main);*/
- $repos[$repo->main][$repo->sub] = $repo;
- break;
- }
- }
- return $repos;
+$ariane[] = array(
+ 'url' => '#',
+ 'text' => 'Packages in Fedora repositories'
+);
+$smarty->assign('ariane', $ariane);
+
+$smarty->assign('what', $what);
+$smarty->assign('page_title', 'All packages in Fedora repositories');
+
+/**
+* Retrieve packages informations
+*
+* @param Object $db A reference to the database
+*
+* @return array
+*/
+function report ($db)
+{
+ global $what, $smarty;
+ $packages = null;
+ $repos = listRepos($db);
+ $smarty->assign('repos', $repos);
+
+
+ if (substr($what,0,1)=='%') {
+ $sql=sprintf("SELECT DISTINCT name FROM rpm WHERE SUBSTRING(name,1,1)='%s' ORDER BY name", substr($what,1,1));
+ } else {
+ $sql=sprintf("SELECT DISTINCT name FROM acls WHERE owner='%s' ORDER BY name", $what);
+ }
+ //echo "<p>SQL=$sql</p>";
+
+ $i=0;
+ $res=$db->query($sql);
+ if ($res) {
+ while ($desc = $res->fetchObject()) {
+ $package = null;
+ $rpmname = $desc->name;
+
+ $sql2="SELECT DISTINCT owner FROM acls WHERE name LIKE '$rpmname'";
+ $res2=$db->query($sql2);
+ $dispowner="";
+ $owners=array();
+ if ( $res2 ) {
+ while ($owner= $res2->fetchObject()) {
+ $owners[] = $owner->owner;
+ }
+ }
+
+ $sql3 = "SELECT * FROM rpm WHERE name LIKE '$rpmname'";
+ $res3=$db->query($sql3);
+ $rpm = ($res3 ? $res3->fetchObject() : false);
+
+ if ($rpm) {
+ $url = $rpm->url;
+ $des = htmlentities($rpm->summary);
+
+ $rpms=array();
+ do {
+ $rpms[$rpm->repo_main."-".$rpm->repo_sub]=$rpm;
+ } while ($rpm = $res3->fetchObject());
+
+ $package['name'] = $rpmname;
+ $package['description'] = $des;
+ $package['owners'] = $owners;
+
+ $versions = null;
+ foreach($repos as $repomain) {
+ $display="";
+ $class="";
+ foreach ($repomain as $repo) {
+ if (isset($rpms[$repo->main."-".$repo->sub])) {
+ $rpm=$rpms[$repo->main."-".$repo->sub];
+
+ $maxver = (isset($rpms["rawhide-"]) ? $rpms["rawhide-"]->ver : "");
+
+ switch ($repo->sub) {
+ case "base":
+ if (isset($rpms[$repo->main."-updates"])) {
+ $display .= sprintf(
+ "%s-%s<br/>",
+ $rpm->ver,
+ $rpm->rel
+ );
+ } else {
+ $display .= sprintf(
+ "<strong>%s</strong>-%s<br/>",
+ $rpm->ver,
+ $rpm->rel
+ );
+ $class = ($rpm->ver == $maxver ? "check" : "attn");
+ }
+ break;
+ case "":
+ $display .= sprintf(
+ "<strong>%s</strong>-%s<br/>",
+ $rpm->ver,
+ $rpm->rel
+ );
+ break;
+ case "updates":
+ $display .= sprintf(
+ "<strong>%s</strong>-%s <small>(updates)</small><br/>",
+ $rpm->ver,
+ $rpm->rel
+ );
+ $class = ($rpm->ver == $maxver ? "check" : "attn");
+ break;
+ case "testing":
+ $display .= sprintf(
+ "%s-%s <small>(testing)</small><br/>",
+ $rpm->ver,
+ $rpm->rel
+ );
+ $class = ($rpm->ver == $maxver ? "info" : "attn");
+ break;
+ }
+ } // RPM exists
+ } // sub repo
+
+ $versions[] = array(
+ 'class' => ($class && $maxver) ? $class : '',
+ 'display' => $display
+ );
+ $package['versions'] = $versions;
+ } // mainrepo
+
+ $i++;
+ $packages[] = $package;
+ }
+ } // each Line
+ }
+ return $packages;
}
-function Report ($db, $repos) {
- global $what;
-
- /*$repos=array();
- $res=$db->query("SELECT * FROM repo WHERE active=1 ORDER BY ID");
- if ($res) while ($repo = $res->fetchObject()) {
- $repos[$repo->main][$repo->sub]=$repo;
- }*/
-
- if (substr($what,0,1)=='%') {
- $sql=sprintf("SELECT DISTINCT name FROM rpm WHERE SUBSTRING(name,1,1)='%s' ORDER BY name", substr($what,1,1));
- } else {
- $sql=sprintf("SELECT DISTINCT name FROM acls WHERE owner='%s' ORDER BY name", $what);
- }
- //echo "<p>SQL=$sql</p>";
-
- /*echo "<table id='fedora-list-packages'>\n";
- echo "<tr class='odd'><th>Package</th><th>Owner(s)</th>";
-
- foreach($repos as $repomain) {
- foreach ($repomain as $repo) {
- printf ("<th align='left'>%s</th>", $repo->main);
- break;
- }
- }
- echo "</tr>\n";*/
-
- $i=0;
- $res=$db->query($sql);
- if ($res) while ($desc = $res->fetchObject()) {
- $rpmname = $desc->name;
-
- $sql2="SELECT DISTINCT owner FROM acls WHERE name LIKE '$rpmname'";
- $res2=$db->query($sql2);
- $dispowner="";
- if ($res2) while ($owner= $res2->fetchObject()) {
- if ($dispowner) $dispowner .= "<br/>";
- $dispowner .= sprintf ("<a href=\"%s?what=%s\">%s</a>", $_SERVER["PHP_SELF"], $owner->owner, $owner->owner);
- }
-
- $sql3 = "SELECT * FROM rpm WHERE name LIKE '$rpmname'";
- $res3=$db->query($sql3);
- $rpm = ($res3 ? $res3->fetchObject() : false);
-
- if ($rpm) {
- $url = $rpm->url;
- $des = htmlentities($rpm->summary);
-
- $rpms=array();
- do {
- $rpms[$rpm->repo_main."-".$rpm->repo_sub]=$rpm;
- } while ($rpm = $res3->fetchObject());
-
- printf ("<tr class=\"%s\">\n\t<td><a href=\"zoom.php?rpm=%s\" title=\"%s\">%s</a></td>\n\t<td>%s</td>\n",
- ($i%2 ? "odd" : "even"), $rpmname, $des, $rpmname, $dispowner);
-
-
- foreach($repos as $repomain) {
- $display="";
- $class="";
- foreach ($repomain as $repo) {
- if (isset($rpms[$repo->main."-".$repo->sub])) {
- $rpm=$rpms[$repo->main."-".$repo->sub];
-
- $maxver = (isset($rpms["rawhide-"]) ? $rpms["rawhide-"]->ver : "");
-
- switch ($repo->sub) {
- case "base":
- if (isset($rpms[$repo->main."-updates"])) {
- $display .= sprintf("%s-%s<br/>", $rpm->ver, $rpm->rel);
- } else {
- $display .= sprintf("<strong>%s</strong>-%s<br/>", $rpm->ver, $rpm->rel);
- $class = ($rpm->ver == $maxver ? "check" : "attn");
- }
- break;
- case "":
- $display .= sprintf("<strong>%s</strong>-%s<br/>", $rpm->ver, $rpm->rel);
- break;
- case "updates":
- $display .= sprintf("<strong>%s</strong>-%s <small>(updates)</small><br/>", $rpm->ver, $rpm->rel);
- $class = ($rpm->ver == $maxver ? "check" : "attn");
- break;
- case "testing":
- $display .= sprintf("%s-%s <small>(testing)</small><br/>", $rpm->ver, $rpm->rel);
- $class = ($rpm->ver == $maxver ? "info" : "attn");
- break;
- }
- } // RPM exists
- } // sub repo
-
- if ($class && $maxver) {
- printf("\t<td class=\"%s\">%s</td>\n", $class, $display);
- } else if ($display) {
- printf("\t<td>%s</td>\n", $display);
- } else {
- echo "\t<td>&nbsp;</td>\n";
- }
- } // mainrepo
-
- echo "</tr>\n";
- $i++;
- }
- } // each Line
-}
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
- <head>
- <title>Packages in Fedora</title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
- <link rel="stylesheet" type="text/css" media="screen" href="css/rpmphp.css"/>
- <!--<link rel="stylesheet" type="text/css" media="print" href="css/rpmphp-print.css">-->
- <link rel="shortcut icon" href="images/favicon.ico"/>
- <link rel="icon" href="images/favicon.ico"/>
- </head>
-
- <body>
- <div id="wrapper">
-<?php
-include '_header.php';
-?>
- <div id="fedora-content">
- <div id="ariane">
- <p>You are here: </p>
- <ul>
- <li><a href="./">Reports home</a></li>
- <li><a href="#">All packages</a></li>
- </ul>
- </div>
- <div id="filter">
- <form action='<?php echo $_SERVER["PHP_SELF"]; ?>' method='get'>
- <fieldset>
- <legend>Filter packages</legend>
- <label for="what">Criteria: </label>
- <select name="what" id="what">
- <optgroup label="Pakages">
-<?php
try {
- $db = new PDO ("mysql:dbname=" . MYBASE . ";host=" . MYHOST, MYUSER, MYPASS);
-
- $sql="SELECT DISTINCT CONCAT('%',SUBSTRING(name,1,1)) as init FROM rpm ORDER BY init";
- $res=$db->query($sql);
- if ($res)while ($start = $res->fetchObject()) {
- printf("\t\t\t\t\t\t\t\t\t<option value=\"%s\" %s>Start with %s</option>\n", $start->init, ($what==$start->init ? " selected=\"selected\"" : ""), substr($start->init,1));
- } else {
- echo "\t\t\t\t\t\t\t\t\t<option value=\"remi\">remi</option>\n";
- }
-?>
- </optgroup>
- <optgroup label="Owner">
-<?php
- $sql="SELECT DISTINCT owner FROM acls ORDER BY owner";
- $res=$db->query($sql);
- if ($res)while ($owner = $res->fetchObject()) {
- printf("\t\t\t\t\t\t\t\t\t<option value=\"%s\" %s>%s</option>\n", $owner->owner, ($what==$owner->owner ? " selected=\"selected\"" : ""), $owner->owner);
- } else {
- echo "\t\t\t\t\t\t\t\t\t<option value=\"remi\">remi</option>\n";
- }
-?>
- </optgroup>
- </select>
- <input type="submit" value="Filter" />
- </fieldset>
- </form>
- </div>
-<?php
- $sql='SELECT MAX(stamp) AS stamp FROM repo';
- $res=$db->query($sql);
- if ($res && $row=$res->fetchObject()) {
- printf("<p>Repositories last updated %s.</p>", date("r", $row->stamp));
- }
-
-?>
- <h1>Packages in Fedora</h1>
- <table id="list-packages">
- <thead>
- <tr>
- <th>Package</th>
- <th>Owner(s)</th>
-<?php
- $repos = listRepos($db);
- $repos_k = array_keys($repos);
- foreach ( $repos_k as $r ) {
-?>
- <th><?php echo $r; ?></th>
-<?php
- }
-?>
-
- </tr>
- </thead>
- <tbody>
-<?php
- if ($what) Report($db, $repos);
- else echo "<tr><td colspan=\"" . (count($repos) + 3) . "\"><h2>Choose a criteria from the filter menu</h2></td></tr>";
- //echo "<pre>"; print_r($rpms); echo "</pre>";
+ $db = new PDO ("mysql:dbname=" . MYBASE . ";host=" . MYHOST, MYUSER, MYPASS);
+
+ $sql="SELECT DISTINCT CONCAT('%',SUBSTRING(name,1,1)) as init FROM rpm ORDER BY init";
+ $res=$db->query($sql);
+ if ( $res ) {
+ while ( $s = $res->fetchObject() ) {
+ $starts_with[] = $s;
+ }
+ $smarty->assign('starts_with', $starts_with);
+ }
+
+ $sql="SELECT DISTINCT owner FROM acls ORDER BY owner";
+ $res=$db->query($sql);
+ if ( $res ) {
+ while ( $owner = $res->fetchObject() ) {
+ $owners[] = $owner;
+ }
+ $smarty->assign('owners', $owners);
+ }
+
+ $sql='SELECT MAX(stamp) AS stamp FROM repo';
+ $res=$db->query($sql);
+ if ($res && $row=$res->fetchObject()) {
+ $smarty->assign('repositories_update', date("r", $row->stamp));
+ }
+
+ $smarty->assign('packages', report($db));
} catch(PDOException $e) {
-?>
- <tr>
- <td colspan="<?php echo count($repos_k) + 3; ?>">
-<?php
- printf("%s ERREUR : %s\n", date("r"), $e->getMessage());
-?>
- </td>
- </tr>
-<?php
+ $smarty->assign(
+ 'error',
+ sprintf("%s ERREUR : %s\n", date("r"), $e->getMessage())
+ );
}
-?>
- </tbody>
- </table>
- <ul id="legend">
- <li>Legend: </li>
- <li><strong>Upstream</strong>: bold if stable. </li>
- <li><strong>Repo</strong>: bold for latest release.</li>
- <li class='check'>Lastest released (stable if exists)</li>
- <li class='info'>Lastest in testing</li>
- <li class='attn'>Lastest not available</li>
- </ul>
- </div><!-- /fedora-content -->
-<?php
-include '_footer.php';
-?>
- </div>
- </body>
-</html>
+$page_content = $smarty->fetch('all.tpl');
+$smarty->assign('page_content', $page_content);
+$smarty->display('main.tpl');
+
+?> \ No newline at end of file
diff --git a/config.inc.php.dist b/config.inc.php.dist
index 7dc69d4..8895cdc 100644
--- a/config.inc.php.dist
+++ b/config.inc.php.dist
@@ -1,4 +1,39 @@
<?php
+
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Database configuration file template
+ *
+ * PHP version 5
+ *
+ * Copyright © 2010 Remi Collet
+ *
+ * This file is part of rpmphp.
+ *
+ * rpmphp is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * rpmphp is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with rpmphp. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category Main
+ * @package RPMPHP
+ *
+ * @author Remi Collet <unknown@unknwown.com>
+ * @author Johan Cwiklinski <johan@x-tnd.be>
+ * @copyright 2010 Remi Collet
+ * @license http://www.gnu.org/licenses/agpl-3.0-standalone.html AGPL License 3.0 or (at your option) any later version
+ * @link http://github.com/remicollet/rpmphp/
+ * @since The begining of times.
+*/
define("MYHOST", "xxx");
define("MYUSER", "yyy");
define("MYPASS", "zzz");
diff --git a/css/rpmphp.css b/css/rpmphp.css
index d98ead4..aeb81ea 100644
--- a/css/rpmphp.css
+++ b/css/rpmphp.css
@@ -44,6 +44,10 @@ a{
text-decoration:none;
}
+th{
+ vertical-align:top;
+}
+
a:hover{
text-decoration:underline;
}
@@ -174,13 +178,14 @@ p{
display:inline-block;
position:absolute;
right:1em;
+ top:0;
}
#filter fieldset{
padding:.2em;
}
-#count_found{
+#list-packages tfoot td{
text-align:right;
font-size:.9em;
font-style:italic;
diff --git a/index.php b/index.php
index c8cc868..f7a1546 100644
--- a/index.php
+++ b/index.php
@@ -31,7 +31,6 @@
* @author Johan Cwiklinski <johan@x-tnd.be>
* @copyright 2010 Remi Collet
* @license http://www.gnu.org/licenses/agpl-3.0-standalone.html AGPL License 3.0 or (at your option) any later version
- * @version SVN: $Id: ajouter_adherent.php 836 2010-02-27 08:11:44Z trashy $
* @link http://github.com/remicollet/rpmphp/
* @since The begining of times.
*/
diff --git a/main.inc.php b/main.inc.php
index 18c844f..a846e16 100644
--- a/main.inc.php
+++ b/main.inc.php
@@ -1,4 +1,38 @@
<?php
+
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Configuration for each page
+ *
+ * PHP version 5
+ *
+ * Copyright © 2010 Remi Collet
+ *
+ * This file is part of rpmphp.
+ *
+ * rpmphp is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * rpmphp is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with rpmphp. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category Main
+ * @package RPMPHP
+ *
+ * @author Johan Cwiklinski <johan@x-tnd.be>
+ * @copyright 2010 Remi Collet
+ * @license http://www.gnu.org/licenses/agpl-3.0-standalone.html AGPL License 3.0 or (at your option) any later version
+ * @link http://github.com/remicollet/rpmphp/
+ * @since The begining of times.
+*/
define('RPMPHP_VERSION', '1.0.0-dev');
require 'config.inc.php';
@@ -16,4 +50,31 @@ $ariane[] = array (
'url' => './',
'text' => 'Reports home'
);
+
+/**
+* Get repositories list
+*
+* @param object $db a reference to the database
+*
+* @return array
+*/
+function listRepos($db)
+{
+ $repos = array();
+ $res=$db->query("SELECT * FROM repo WHERE active=1 ORDER BY ID");
+ if ( $res ) {
+ while ($repo = $res->fetchObject()) {
+ $repos[$repo->main][$repo->sub]=$repo;
+ }
+ }
+ // echo "<pre>"; print_r($repos);echo "</pre>";
+ foreach ( $repos as $repomain ) {
+ foreach ($repomain as $repo) {
+ $repos[$repo->main][$repo->sub] = $repo;
+ break;
+ }
+ }
+ return $repos;
+}
+
?> \ No newline at end of file
diff --git a/refresh.php b/refresh.php
index eb612de..3be354f 100644
--- a/refresh.php
+++ b/refresh.php
@@ -1,437 +1,695 @@
<?php
+
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * Refresh datas from server
+ *
+ * PHP version 5
+ *
+ * Copyright © 2010 Remi Collet
+ *
+ * This file is part of rpmphp.
+ *
+ * rpmphp is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * rpmphp is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with rpmphp. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category Main
+ * @package RPMPHP
+ *
+ * @author Remi Collet <unknown@unknwown.com>
+ * @author Johan Cwiklinski <johan@x-tnd.be>
+ * @copyright 2010 Remi Collet
+ * @license http://www.gnu.org/licenses/agpl-3.0-standalone.html AGPL License 3.0 or (at your option) any later version
+ * @link http://github.com/remicollet/rpmphp/
+ * @since The begining of times.
+*/
chdir(dirname($_SERVER["SCRIPT_FILENAME"]));
if (isset($_SERVER["SERVER_NAME"])) {
- echo "<pre>";
- ini_set("max_execution_time", "0");
- ini_set("memory_limit", "-1");
+ echo "<pre>";
+ ini_set("max_execution_time", "0");
+ ini_set("memory_limit", "-1");
- die("This script is launched twice a day, be patient");
+ die("This script is launched twice a day, be patient");
}
require "config.inc.php";
-function addUpstream ($db, $type, $channel, $name, $state, $ver, $statename="") {
-
- $sql1 = "INSERT INTO `upstream` SET type='$type', name='$name'";
- $db->exec($sql1);
-
- $sql2 = "UPDATE `upstream` SET channel='$channel', $state='$ver'";
- if ($statename) $sql2 .= ", state='$statename'";
- $sql2 .= " WHERE type='$type' AND name='$name'";
- $nb = $db->exec($sql2);
- if ($nb===false) echo date("r : ") . "SQL ERROR($sql2) = " . implode(" ", $db->errorInfo()) . "\n";
-
- return $nb;
+/**
+* To document
+*
+* @param Object $db Database reference
+* @param string $type type
+* @param string $channel channel
+* @param string $name name
+* @param string $state state
+* @param string $ver version
+* @param string $statename state name
+*
+* @return rows updated
+*/
+function addUpstream ($db, $type, $channel, $name, $state, $ver, $statename="")
+{
+
+ $sql1 = "INSERT INTO `upstream` SET type='$type', name='$name'";
+ $db->exec($sql1);
+
+ $sql2 = "UPDATE `upstream` SET channel='$channel', $state='$ver'";
+ if ($statename) {
+ $sql2 .= ", state='$statename'";
+ }
+ $sql2 .= " WHERE type='$type' AND name='$name'";
+ $nb = $db->exec($sql2);
+ if ($nb===false) {
+ echo date("r : ") . "SQL ERROR($sql2) = " .
+ implode(" ", $db->errorInfo()) . "\n";
+ }
+
+ return $nb;
}
+
if ($_SERVER['argc']>1 && in_array('help', $_SERVER['argv'])) {
- echo "Options in: repo owner R pear pecl old\n";
- echo "Defaults: repo owner R pear pecl\n";
- die("\n");
+ echo "Options in: repo owner R pear pecl old\n";
+ echo "Defaults: repo owner R pear pecl\n";
+ die("\n");
}
try {
- $db = new PDO ("mysql:dbname=" . MYBASE . ";host=" . MYHOST, MYUSER, MYPASS);
-
- // -------------------------------------------------------------------
- // Fedora Packages
- // -------------------------------------------------------------------
- echo date("r : ") . "Refreshing " . MYBASE . " database\n";
-
- if ($_SERVER['argc']==1 || in_array('repo', $_SERVER['argv'])) {
- if (in_array('empty', $_SERVER['argv'])) {
- $res=$db->query("SELECT * FROM repo WHERE stamp IS NULL");
- } else if (in_array('old', $_SERVER['argv'])) {
- $res=$db->query("SELECT * FROM repo");
- } else {
- $res=$db->query("SELECT * FROM repo WHERE active=1");
- }
- if (!$res) echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
- else while ($row = $res->fetchObject()) {
- echo date("r : ") . "REPOSITORY " . $row->main . " " . $row->sub . "\n";
- $TimRemote = 0;
- $repomd = simplexml_load_file($row->url . "repodata/repomd.xml");
- if ($repomd) foreach($repomd->data as $data) if ($data->attributes()=="primary") {
- $TimRemote = $data->timestamp;
- $UrlRemote = $row->url . $data->location->attributes();
- }
- if ($TimRemote > $row->stamp) {
- echo date("r : ") . "Loading $UrlRemote\n";
-
- //$fic=gzopen("primary.xml.gz", "r");
- $fic=gzopen($UrlRemote, "r");
- if ($fic) {
- $txt="";
- while ($buf=gzread($fic,8196))
- $txt .= $buf;
- echo date("r : ") . "Read " . strlen($txt) . " bytes\n";
- gzclose($fic);
-
- $primary = simplexml_load_string($txt);
- echo date("r : ") . "Read " . $primary->attributes() . " packages\n";
- unset($txt);
-
- $sql = sprintf("DELETE FROM rpm WHERE repo_main='%s' AND repo_sub='%s'",
- $row->main, $row->sub);
- $nb=$db->exec($sql);
- if ($nb===false) echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
- else echo date("r : ") . "Delete $nb packages\n";
-
- $tot=0;
- foreach ($primary->package as $package) if ($package->attributes()=='rpm'){
- $ver = $package->version->attributes();
- $sql = sprintf("INSERT INTO rpm SET repo_main='%s', repo_sub='%s', name='%s', epoch='%s', ver='%s', rel='%s', summary='%s', url='%s'",
- $row->main, $row->sub, $package->name, $ver['epoch'], $ver['ver'], $ver['rel'], addslashes($package->summary), $package->url);
- $nb=$db->exec($sql);
- if ($nb) $tot+=$nb;
- else echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
- }
- echo date("r : ") . "Write $tot packages\n";
-
- $sql=sprintf("UPDATE repo SET stamp=%d WHERE ID=%d", $TimRemote, $row->ID);
- $nb=$db->exec($sql);
- if ($nb===false) echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
-
- unset($primary);
- } else {
- echo date("r : ") . "ERROR : can't read $UrlRemote\n";
- }
- } else {
- echo date("r : ") . "no update needed : $TimRemote / " . $row->stamp . "\n";
- }
- }
- } // If ask
-
- // -------------------------------------------------------------------
- // Upstream Version
- // -------------------------------------------------------------------
- $sql="CREATE TABLE IF NOT EXISTS `upstream` (
- `name` varchar(100) NOT NULL,
- `type` varchar(20) NOT NULL,
- `channel` varchar(20) NOT NULL,
- `stable` varchar(20) DEFAULT NULL,
- `unstable` varchar(20) DEFAULT NULL,
- `state` varchar(20) DEFAULT NULL,
- PRIMARY KEY (`name`,`type`),
- KEY `name` (`name`),
- KEY `type` (`type`),
- KEY `channel` (`channel`))";
-
- if ($db->exec($sql)!==false)
- echo date("r : ") . "Check table 'upstream' ok\n";
- else echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
-
- // -------------------------------------------------------------------
- if ($_SERVER['argc']==1 || in_array('pecl', $_SERVER['argv'])) {
- echo date("r : ") . "PECL listLatestReleases - stable\n";
-
- $request = xmlrpc_encode_request("package.listLatestReleases", "stable");
- $context = stream_context_create(array('http' => array(
- 'method' => "POST",
- 'header' => "Content-Type: text/xml",
- 'content' => $request
- )));
- $file = file_get_contents("http://pecl.php.net/xmlrpc.php", false, $context) or die ("Can't file_get_contents(http://pecl.php.net/xmlrpc.php)");
- $stable = xmlrpc_decode($file);
- if (xmlrpc_is_fault($stable)) {
- echo date("r : ") . "ERROR xmlrpc: $stable[faultString] ($stable[faultCode])";
- } else {
- $sql = sprintf("DELETE FROM upstream WHERE type='pecl' AND channel='pecl'");
- $nb=$db->exec($sql);
- if ($nb===false) echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
- else echo date("r : ") . "Delete $nb packages\n";
-
- $nb=0;
- foreach ($stable as $name => $info) {
- $rpmname="php-pecl-".str_replace("_","-",$name);
-
- $nb += addUpstream($db, "pecl", "pecl", $rpmname, "stable", $info["version"]);
- }
- echo date("r : ") . "Write $nb packages\n";
- // echo date("r : ") . "saved " . file_put_contents("cache/pecl-stable", serialize($stable)) . " bytes\n";
- }
-
- // -------------------------------------------------------------------
- echo date("r : ") . "PECL listLatestReleases - unstable\n";
-
- $request = xmlrpc_encode_request("package.listLatestReleases", array());
- $context = stream_context_create(array('http' => array(
- 'method' => "POST",
- 'header' => "Content-Type: text/xml",
- 'content' => $request
- )));
- $file = file_get_contents("http://pecl.php.net/xmlrpc.php", false, $context) or die ("Can't file_get_contents(http://pecl.php.net/xmlrpc.php)");
- $unstable = xmlrpc_decode($file);
- if (xmlrpc_is_fault($unstable)) {
- echo date("r : ") . "ERROR xmlrpc: $stable[faultString] ($stable[faultCode])";
- } else {
- $nb=0;
- foreach ($unstable as $name => $info) {
- $rpmname="php-pecl-".str_replace("_","-",$name);
-
- $nb += addUpstream($db, "pecl", "pecl", $rpmname, "unstable", $info["version"], $info["state"]);
- }
- echo date("r : ") . "Write $nb packages\n";
- //echo date("r : ") . "saved " . file_put_contents("cache/pecl-unstable", serialize($unstable)) . " bytes\n";
- }
- } // if in options
-
- // -------------------------------------------------------------------
- if ($_SERVER['argc']==1 || in_array('pear', $_SERVER['argv'])) {
- echo date("r : ") . "PEAR reading channels\n";
- $channels=array(
- "pear" => "pear.php.net"
- ,"doctrine" => "pear.phpdoctrine.org"
- ,"ezc" => "components.ez.no"
- ,"pdepend" => "pear.pdepend.org"
- ,"phing" => "pear.phing.info"
- ,"phpdb" => "pear.phpdb.org"
- ,"phpmd" => "pear.phpmd.org"
- ,"phpunit" => "pear.phpunit.de"
- ,"swift" => "pear.swiftmailer.org"
- ,"symphony" => "pear.symfony-project.com"
- );
- try {
- $nbtot=0;
-
- foreach ($channels as $channelname => $channelurl) {
-
- $channel = @simplexml_load_file("http://$channelurl/channel.xml");
- if (!$channel) throw new Exception("can't read PEAR site (channel of $channelname)");
-
- $rest = $channel->servers->primary->rest->baseurl[0];
- echo date("r : ") . "PEAR reading channel=$channelname, baseurl = $rest\n";
-
- $categories = @simplexml_load_file($rest."c/categories.xml");
- if (!$categories) throw new Exception("can't read PEAR site (categories)");
-
- $sql = sprintf("DELETE FROM upstream WHERE type='pear' AND channel='$channelname'");
- $nb=$db->exec($sql);
- if ($nb===false) echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
- else echo date("r : ") . "Delete $nb packages\n";
-
- $nb=0;
- if (!isset($categories->c[0])) {
- echo date("r : ") . "Reading ALL\n"; // ezc only
- $pitxt = @file_get_contents($rest."p/packages.xml");
- if (!$pitxt) throw new Exception("can't read PEAR site (".$rest."p/packagesinfo.xml)");
- $allpi = @simplexml_load_string($pitxt);
- foreach ($allpi->p as $name) {
- $pitxt = @file_get_contents($rest."r/".strtolower($name)."/allreleases.xml");
- if (!$pitxt) throw new Exception("can't read PEAR site (".$rest."r/".strtolower($name)."/allreleases.xml");
- $pi = @simplexml_load_string($pitxt);
-
- $rpmname1="php-".$channelname."-".str_replace("_","-",$name);
- $rpmname2="php-".$channelname."-".$name;
-
- //echo $rpmname ."/".(string)$pi->r[0]->v."/". (string)$pi->r[0]->s."\n";
- addUpstream($db, "pear", $channelname, $rpmname1, "unstable", (string)$pi->r[0]->v, (string)$pi->r[0]->s);
- addUpstream($db, "pear", $channelname, $rpmname2, "unstable", (string)$pi->r[0]->v, (string)$pi->r[0]->s);
- foreach($pi->r as $rev) if ($rev->s=='stable') {
- //echo $rpmname ."/".(string)$rev->v."/". (string)$rev->s."\n";
- addUpstream($db, "pear", $channelname, $rpmname1, "stable", (string)$rev->v);
- addUpstream($db, "pear", $channelname, $rpmname2, "stable", (string)$rev->v);
- break;
- }
- $nb++;
- }
-
- } else foreach ($categories->c as $cat) {
- echo date("r : ") . "Reading $cat\n";
-
- $pitxt = @file_get_contents($rest."c/".urlencode($cat)."/packagesinfo.xml");
- if (!$pitxt) throw new Exception("can't read PEAR site (".$rest."c/".urlencode($cat)."/packagesinfo.xml)");
- $pitxt = "<?" . preg_replace("/<\?xml.*?>/U", "", str_replace("\r\n", "\n", substr($pitxt, 2)));
-
- $pi = @simplexml_load_string($pitxt);
- if (!$pi) throw new Exception("can't read response ($cat)");
- foreach ($pi->pi as $ps) if (isset($ps->p->n) && isset($ps->a->r)) {
- $name=(string)$ps->p->n;
-
- if ($channelname=='phing' && $name=='phing') {
- $rpmname1="php-pear-phing";
- } else if ($channelname=='phpunit' && $name=='PHPUnit') {
- $rpmname1="php-pear-PHPUnit";
- } else {
- $rpmname1="php-".$channelname."-".str_replace("_","-",$name);
- }
- $rpmname2="php-".$channelname."-".$name;
-
- addUpstream($db, "pear", $channelname, $rpmname1, "unstable", (string)$ps->a->r[0]->v, (string)$ps->a->r[0]->s);
- addUpstream($db, "pear", $channelname, $rpmname2, "unstable", (string)$ps->a->r[0]->v, (string)$ps->a->r[0]->s);
- foreach($ps->a->r as $rev) if ($rev->s=='stable') {
- addUpstream($db, "pear", $channelname, $rpmname1, "stable", (string)$rev->v);
- addUpstream($db, "pear", $channelname, $rpmname2, "stable", (string)$rev->v);
- break;
- }
- $nb++;
- // echo $ps->p->n."\n";
- }
- }
- echo date("r : ") . "read $nb packages in $channelname\n";
- $nbtot += $nb;
- }
- echo date("r : ") . "read $nbtot packages in all channels\n";
-
- } catch (Exception $e) {
- echo date("r : ") . 'ERROR ' . $e->getMessage(), "\n";
- }
- } // if in options
- // -------------------------------------------------------------------
- if ($_SERVER['argc']==1 || in_array('R', $_SERVER['argv'])) {
-
- $repos = array(
- array("name"=>"R", "state"=>"stable", "url" => "http://cran.at.r-project.org/src/contrib/PACKAGES"),
- //array("name"=>"R-forge","state"=>"unstable", "url" => "http://r-forge.r-project.org/src/contrib/PACKAGES"),
- array("name"=>"biocp", "state"=>"stable", "url" => "http://www.bioconductor.org/packages/release/bioc/src/contrib/PACKAGES"),
- array("name"=>"biocp", "state"=>"unstable", "url" => "http://www.bioconductor.org/packages/devel/bioc/src/contrib/PACKAGES"),
- array("name"=>"bioca", "state"=>"stable", "url" => "http://www.bioconductor.org/packages/release/data/annotation/src/contrib/PACKAGES"),
- array("name"=>"bioca", "state"=>"unstable", "url" => "http://www.bioconductor.org/packages/devel/data/annotation/src/contrib/PACKAGES"),
- array("name"=>"bioce", "state"=>"stable", "url" => "http://www.bioconductor.org/packages/release/data/experiment/src/contrib/PACKAGES"),
- array("name"=>"bioce", "state"=>"unstable", "url" => "http://www.bioconductor.org/packages/devel/data/experiment/src/contrib/PACKAGES")
- );
- $tottot=0;
- foreach ($repos as $repo) {
- echo date("r : ") . "Reading " . $repo["name"] . " (" . $repo["state"] . ")\n";
- $index = @file_get_contents($repo["url"]);
- if (!$index) {
- echo date("r : ") . "Can't read [" . $repo["url"] . "], skip this channel\n";
- continue;
- }
- if ($repo["state"]=="stable") {
- $sql = sprintf("DELETE FROM upstream WHERE type='R' AND channel='%s'", $repo["name"]);
+ $db = new PDO ("mysql:dbname=" . MYBASE . ";host=" . MYHOST, MYUSER, MYPASS);
+
+ // -------------------------------------------------------------------
+ // Fedora Packages
+ // -------------------------------------------------------------------
+ echo date("r : ") . "Refreshing " . MYBASE . " database\n";
+
+ if ($_SERVER['argc']==1 || in_array('repo', $_SERVER['argv'])) {
+ if (in_array('empty', $_SERVER['argv'])) {
+ $res=$db->query("SELECT * FROM repo WHERE stamp IS NULL");
+ } else if (in_array('old', $_SERVER['argv'])) {
+ $res=$db->query("SELECT * FROM repo");
+ } else {
+ $res=$db->query("SELECT * FROM repo WHERE active=1");
+ }
+ if (!$res) {
+ echo date("r : ") . "SQL ERROR = " .
+ implode(" ", $db->errorInfo()) . "\n";
+ } else {
+ while ($row = $res->fetchObject()) {
+ echo date("r : ") . "REPOSITORY " . $row->main . " " .
+ $row->sub . "\n";
+ $TimRemote = 0;
+ $repomd = simplexml_load_file($row->url . "repodata/repomd.xml");
+ if ($repomd) {
+ foreach ($repomd->data as $data) {
+ if ($data->attributes()=="primary") {
+ $TimRemote = $data->timestamp;
+ $UrlRemote = $row->url . $data->location->attributes();
+ }
+ }
+ }
+ if ($TimRemote > $row->stamp) {
+ echo date("r : ") . "Loading $UrlRemote\n";
+
+ //$fic=gzopen("primary.xml.gz", "r");
+ $fic=gzopen($UrlRemote, "r");
+ if ($fic) {
+ $txt="";
+ while ($buf=gzread($fic, 8196)) {
+ $txt .= $buf;
+ }
+ echo date("r : ") . "Read " . strlen($txt) . " bytes\n";
+ gzclose($fic);
+
+ $primary = simplexml_load_string($txt);
+ echo date("r : ") . "Read " . $primary->attributes() .
+ " packages\n";
+ unset($txt);
+
+ $sql = sprintf(
+ "DELETE FROM rpm WHERE repo_main='%s' AND repo_sub='%s'",
+ $row->main,
+ $row->sub
+ );
+ $nb=$db->exec($sql);
+ if ($nb===false) {
+ echo date("r : ") . "SQL ERROR = " .
+ implode(" ", $db->errorInfo()) . "\n";
+ } else {
+ echo date("r : ") . "Delete $nb packages\n";
+ }
+
+ $tot=0;
+ foreach ($primary->package as $package) {
+ if ($package->attributes()=='rpm') {
+ $ver = $package->version->attributes();
+ $sql = sprintf(
+ "INSERT INTO rpm SET repo_main='%s', repo_sub='%s', name='%s', epoch='%s', ver='%s', rel='%s', summary='%s', url='%s'",
+ $row->main,
+ $row->sub,
+ $package->name,
+ $ver['epoch'],
+ $ver['ver'],
+ $ver['rel'],
+ addslashes($package->summary),
+ $package->url
+ );
+ $nb=$db->exec($sql);
+ if ($nb) {
+ $tot+=$nb;
+ } else {
+ echo date("r : ") . "SQL ERROR = " .
+ implode(" ", $db->errorInfo()) . "\n";
+ }
+ }
+ }
+ echo date("r : ") . "Write $tot packages\n";
+
+ $sql=sprintf(
+ "UPDATE repo SET stamp=%d WHERE ID=%d",
+ $TimRemote,
+ $row->ID
+ );
+ $nb=$db->exec($sql);
+ if ($nb===false) {
+ echo date("r : ") . "SQL ERROR = " .
+ implode(" ", $db->errorInfo()) . "\n";
+ }
+
+ unset($primary);
+ } else {
+ echo date("r : ") . "ERROR : can't read $UrlRemote\n";
+ }
+ } else {
+ echo date("r : ") . "no update needed : $TimRemote / " .
+ $row->stamp . "\n";
+ }
+ }
+ }
+ } // If ask
+
+ // -------------------------------------------------------------------
+ // Upstream Version
+ // -------------------------------------------------------------------
+ $sql="CREATE TABLE IF NOT EXISTS `upstream` (
+ `name` varchar(100) NOT NULL,
+ `type` varchar(20) NOT NULL,
+ `channel` varchar(20) NOT NULL,
+ `stable` varchar(20) DEFAULT NULL,
+ `unstable` varchar(20) DEFAULT NULL,
+ `state` varchar(20) DEFAULT NULL,
+ PRIMARY KEY (`name`,`type`),
+ KEY `name` (`name`),
+ KEY `type` (`type`),
+ KEY `channel` (`channel`))";
+
+ if ($db->exec($sql)!==false) {
+ echo date("r : ") . "Check table 'upstream' ok\n";
+ } else {
+ echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
+ }
+
+ // -------------------------------------------------------------------
+ if ($_SERVER['argc']==1 || in_array('pecl', $_SERVER['argv'])) {
+ echo date("r : ") . "PECL listLatestReleases - stable\n";
+
+ $request = xmlrpc_encode_request("package.listLatestReleases", "stable");
+ $context = stream_context_create(
+ array(
+ 'http' => array(
+ 'method' => "POST",
+ 'header' => "Content-Type: text/xml",
+ 'content' => $request
+ )
+ )
+ );
+ $file = file_get_contents("http://pecl.php.net/xmlrpc.php", false, $context) or die ("Can't file_get_contents(http://pecl.php.net/xmlrpc.php)");
+ $stable = xmlrpc_decode($file);
+ if (xmlrpc_is_fault($stable)) {
+ echo date("r : ") . "ERROR xmlrpc: $stable[faultString] ($stable[faultCode])";
+ } else {
+ $sql = sprintf("DELETE FROM upstream WHERE type='pecl' AND channel='pecl'");
$nb=$db->exec($sql);
- if ($nb===false) echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
- else echo date("r : ") . "Delete $nb packages\n";
- }
- $results=array();
- if (preg_match_all('/Package: *(.*)\nVersion: *(.*)\n/i',$index,$results,PREG_SET_ORDER)) {
- $tot=0;
- foreach ($results as $result) {
- //echo $result[1]." = ".$result[2]."\n";
- $rpmname = "R-".$result[1];
- $ver = str_replace('-', '.', $result[2]);
- if (addUpstream($db, "R", $repo["name"], $rpmname, $repo["state"], $ver, ($repo["state"]=="stable"?"":"devel"))) {
- $tot++;
- }
+ if ($nb===false) {
+ echo date("r : ") . "SQL ERROR = " .
+ implode(" ", $db->errorInfo()) . "\n";
+ } else {
+ echo date("r : ") . "Delete $nb packages\n";
}
- echo date("r : ") . "Write $tot packages in this channel\n";
- $tottot += $tot;
- } else {
- echo date("r : ") . "No package in this channel\n";
- }
- }
- echo date("r : ") . "Write $tottot packages in all channels\n";
-/*
- * OLD VERSION parsing the HTML pages
- $repos = array(
- array("name"=>"R", "state"=>"stable", "url" => "http://cran.r-project.org/web/packages/"),
- array("name"=>"biocp", "state"=>"stable", "url" => "http://bioconductor.org/packages/release/bioc/"),
- array("name"=>"biocp", "state"=>"unstable", "url" => "http://bioconductor.org/packages/devel/bioc/"),
- array("name"=>"bioca", "state"=>"stable", "url" => "http://bioconductor.org/packages/release/data/annotation/"),
- array("name"=>"bioca", "state"=>"unstable", "url" => "http://bioconductor.org/packages/devel/data/annotation/"),
- array("name"=>"bioce", "state"=>"stable", "url" => "http://bioconductor.org/packages/release/data/experiment/"),
- array("name"=>"bioce", "state"=>"unstable", "url" => "http://bioconductor.org/packages/devel/data/experiment/")
- );
- $tottot=0;
- foreach ($repos as $repo) {
- echo date("r : ") . "Reading " . $repo["name"] . " (" . $repo["state"] . ")\n";
- $index = @file_get_contents($repo["url"]);
- if (!$index) {
- echo date("r : ") . "Can't read [" . $repo["url"] . "], skip this channel\n";
- continue;
- }
- if ($repo["state"]=="stable") {
- $sql = sprintf("DELETE FROM upstream WHERE type='R' AND channel='%s'", $repo["name"]);
- $nb=$db->exec($sql);
- if ($nb===false) echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
- else echo date("r : ") . "Delete $nb packages\n";
- }
- if ($repo["name"] == "R") {
- $pos = strpos($index, 'ID="available-packages');
- $pat1 = '/<A HREF="(\.\.\/\.\.\/web\/.*)">(.*)<\/A>/iU';
- } else {
- $pos = 0;
- $pat1 = '/<a href="(.*)">(.*)<\/A>/iu';
- }
- $results=array();
- if (preg_match_all($pat1,$index,$results,PREG_SET_ORDER,$pos)) {
- $tot=0;
- foreach ($results as $result) {
- $page = @file_get_contents($repo["url"].$result[1]);
- $name = $result[2];
- $rpmname = "R-".$result[2];
- $ver=array();
- if (!$page) {
- echo date("r : ") . "Can't read [" . $repo["url"].$result[1] . "], skip this package\n";
-
- } else if (preg_match("/".$name."_((\d|-|\.)*)\.tar.gz/", $page, $ver)) {
-
- $ver = str_replace('-', '.', $ver[1]);
- $nb = addUpstream($db, "R", $repo["name"], $rpmname, $repo["state"], $ver, ($repo["state"]=="stable"?"":"devel"));
-
- }
-
- if ($nb) $tot+=$nb;
-
- }
- echo date("r : ") . "Write $tot packages in this channel\n";
- $tottot += $tot;
- } // Each package
- } // Each repo
- echo date("r : ") . "Write $tottot packages in all channels\n";
- */
- } // If R in options
-
- // -------------------------------------------------------------------
- // Package Owners from pkgdb (thanks Smootherfrog)
- // -------------------------------------------------------------------
- if ($_SERVER['argc']==1 || in_array('owner', $_SERVER['argv'])) {
-
- $sql="CREATE TABLE IF NOT EXISTS `acls` (
- `ID` int(11) NOT NULL AUTO_INCREMENT,
- `collection` varchar(100) NOT NULL,
- `name` varchar(100) NOT NULL,
- `summary` varchar(200) NOT NULL,
- `owner` varchar(50) DEFAULT NULL,
- `qa` varchar(50) DEFAULT NULL,
- `cc` varchar(100) DEFAULT NULL,
- PRIMARY KEY (`ID`),
- KEY `name` (`name`),
- KEY `collection` (`collection`),
- KEY `owner` (`owner`)) ENGINE=MyISAM";
-
- if ($db->exec($sql)!==false)
- echo date("r : ") . "Check table 'acls' ok\n";
- else echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
-
- $fic=fopen("https://admin.fedoraproject.org/pkgdb/lists/bugzilla?tg_format=plain", "r");
- if (!$fic) {
- echo date("r : ") . "ERROR reading pkgdb\n";
- } else {
- $sql="TRUNCATE `acls`";
- $nb=$db->exec($sql);
- if ($nb===false) echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
- else echo date("r : ") . "Delete $nb packages\n";
-
- for ($tot=0 ; $line=fgetcsv($fic,1024,'|') ; ) if (count($line)>5 && substr($line[0],0,1)!='#') {
- for ($i=0; $i<6; $i++) $line[$i]=trim($line[$i]);
- $sql=sprintf("INSERT INTO `acls` SET collection='%s', name='%s', summary='%s'", $line[0], $line[1], addslashes($line[2]));
- if (!empty($line[3])) $sql .= sprintf(", owner='%s'", $line[3]);
- if (!empty($line[4])) $sql .= sprintf(", qa='%s'", $line[4]);
- if (!empty($line[5])) $sql .= sprintf(", cc='%s'", $line[5]);
- $nb=$db->exec($sql);
- if ($nb) $tot+=$nb;
- else echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
- }
- fclose($fic);
- echo date("r : ") . "wrote $tot package's owner\n";
- }
- } // If in options
-}
-catch(PDOException $e) {
- printf("%s ERREUR : %s\n", date("r"), $e->getMessage());
+ $nb=0;
+ foreach ($stable as $name => $info) {
+ $rpmname="php-pecl-".str_replace("_", "-", $name);
+
+ $nb += addUpstream(
+ $db,
+ "pecl",
+ "pecl",
+ $rpmname,
+ "stable",
+ $info["version"]
+ );
+ }
+ echo date("r : ") . "Write $nb packages\n";
+ // echo date("r : ") . "saved " . file_put_contents("cache/pecl-stable", serialize($stable)) . " bytes\n";
+ }
+
+ // -------------------------------------------------------------------
+ echo date("r : ") . "PECL listLatestReleases - unstable\n";
+
+ $request = xmlrpc_encode_request("package.listLatestReleases", array());
+ $context = stream_context_create(
+ array(
+ 'http' => array(
+ 'method' => "POST",
+ 'header' => "Content-Type: text/xml",
+ 'content' => $request
+ )
+ )
+ );
+ $file = file_get_contents("http://pecl.php.net/xmlrpc.php", false, $context) or die ("Can't file_get_contents(http://pecl.php.net/xmlrpc.php)");
+ $unstable = xmlrpc_decode($file);
+ if (xmlrpc_is_fault($unstable)) {
+ echo date("r : ") . "ERROR xmlrpc: $stable[faultString] ".
+ "($stable[faultCode])";
+ } else {
+ $nb=0;
+ foreach ($unstable as $name => $info) {
+ $rpmname="php-pecl-".str_replace("_", "-", $name);
+
+ $nb += addUpstream(
+ $db,
+ "pecl",
+ "pecl",
+ $rpmname,
+ "unstable",
+ $info["version"],
+ $info["state"]
+ );
+ }
+ echo date("r : ") . "Write $nb packages\n";
+ //echo date("r : ") . "saved " .
+ // file_put_contents("cache/pecl-unstable", serialize($unstable)) .
+ // " bytes\n";
+ }
+ } // if in options
+
+ // -------------------------------------------------------------------
+ if ($_SERVER['argc']==1 || in_array('pear', $_SERVER['argv'])) {
+ echo date("r : ") . "PEAR reading channels\n";
+ $channels=array(
+ "pear" => "pear.php.net"
+ ,"doctrine" => "pear.phpdoctrine.org"
+ ,"ezc" => "components.ez.no"
+ ,"pdepend" => "pear.pdepend.org"
+ ,"phing" => "pear.phing.info"
+ ,"phpdb" => "pear.phpdb.org"
+ ,"phpmd" => "pear.phpmd.org"
+ ,"phpunit" => "pear.phpunit.de"
+ ,"swift" => "pear.swiftmailer.org"
+ ,"symphony" => "pear.symfony-project.com"
+ );
+ try {
+ $nbtot=0;
+
+ foreach ($channels as $channelname => $channelurl) {
+ $channel = @simplexml_load_file("http://$channelurl/channel.xml");
+ if (!$channel) {
+ throw new Exception(
+ "can't read PEAR site (channel of $channelname)"
+ );
+ }
+
+ $rest = $channel->servers->primary->rest->baseurl[0];
+ echo date("r : ") . "PEAR reading channel=$channelname" .
+ ", baseurl = $rest\n";
+
+ $categories = @simplexml_load_file($rest."c/categories.xml");
+ if (!$categories) {
+ throw new Exception("can't read PEAR site (categories)");
+ }
+
+ $sql = "DELETE FROM upstream WHERE type='pear' AND channel='".
+ $channelname."'";
+ $nb=$db->exec($sql);
+ if ($nb===false) {
+ echo date("r : ") . "SQL ERROR = " . implode(
+ " ",
+ $db->errorInfo()
+ ) . "\n";
+ } else {
+ echo date("r : ") . "Delete $nb packages\n";
+ }
+
+ $nb=0;
+ if (!isset($categories->c[0])) {
+ echo date("r : ") . "Reading ALL\n"; // ezc only
+ $pitxt = @file_get_contents($rest."p/packages.xml");
+ if (!$pitxt) {
+ throw new Exception(
+ "can't read PEAR site (".$rest."p/packagesinfo.xml)"
+ );
+ }
+ $allpi = @simplexml_load_string($pitxt);
+ foreach ($allpi->p as $name) {
+ $pitxt = @file_get_contents(
+ $rest."r/".strtolower($name)."/allreleases.xml"
+ );
+ if (!$pitxt) {
+ throw new Exception(
+ "can't read PEAR site (".$rest."r/".
+ strtolower($name)."/allreleases.xml"
+ );
+ }
+ $pi = @simplexml_load_string($pitxt);
+
+ $rpmname1="php-".$channelname."-".
+ str_replace("_", "-", $name);
+ $rpmname2="php-".$channelname."-".$name;
+
+ //echo $rpmname ."/".(string)$pi->r[0]->v."/".
+ // (string)$pi->r[0]->s."\n";
+ addUpstream(
+ $db,
+ "pear",
+ $channelname,
+ $rpmname1,
+ "unstable",
+ (string)$pi->r[0]->v,
+ (string)$pi->r[0]->s
+ );
+ addUpstream(
+ $db,
+ "pear",
+ $channelname,
+ $rpmname2,
+ "unstable",
+ (string)$pi->r[0]->v,
+ (string)$pi->r[0]->s
+ );
+ foreach ($pi->r as $rev) {
+ if ($rev->s=='stable') {
+ //echo $rpmname ."/".(string)$rev->v."/".
+ // (string)$rev->s."\n";
+ addUpstream(
+ $db,
+ "pear",
+ $channelname,
+ $rpmname1,
+ "stable",
+ (string)$rev->v
+ );
+ addUpstream(
+ $db,
+ "pear",
+ $channelname,
+ $rpmname2,
+ "stable",
+ (string)$rev->v
+ );
+ break;
+ }
+ }
+ $nb++;
+ }
+
+ } else {
+ foreach ($categories->c as $cat) {
+ echo date("r : ") . "Reading $cat\n";
+
+ $pitxt = @file_get_contents(
+ $rest."c/".urlencode($cat)."/packagesinfo.xml"
+ );
+ if (!$pitxt) {
+ throw new Exception(
+ "can't read PEAR site (".$rest."c/".
+ urlencode($cat)."/packagesinfo.xml)"
+ );
+ }
+ $pitxt = "<?" . preg_replace(
+ "/<\?xml.*?>/U",
+ "",
+ str_replace("\r\n", "\n", substr($pitxt, 2))
+ );
+
+ $pi = @simplexml_load_string($pitxt);
+ if (!$pi) {
+ throw new Exception("can't read response ($cat)");
+ }
+ foreach ($pi->pi as $ps) {
+ if (isset($ps->p->n) && isset($ps->a->r)) {
+ $name=(string)$ps->p->n;
+
+ if ($channelname=='phing' && $name=='phing') {
+ $rpmname1="php-pear-phing";
+ } else if ($channelname=='phpunit'
+ && $name=='PHPUnit'
+ ) {
+ $rpmname1="php-pear-PHPUnit";
+ } else {
+ $rpmname1="php-".$channelname."-".
+ str_replace("_", "-", $name);
+ }
+ $rpmname2="php-".$channelname."-".$name;
+
+ addUpstream(
+ $db,
+ "pear",
+ $channelname,
+ $rpmname1,
+ "unstable",
+ (string)$ps->a->r[0]->v,
+ (string)$ps->a->r[0]->s
+ );
+ addUpstream(
+ $db,
+ "pear",
+ $channelname,
+ $rpmname2,
+ "unstable",
+ (string)$ps->a->r[0]->v,
+ (string)$ps->a->r[0]->s
+ );
+ foreach ($ps->a->r as $rev) {
+ if ($rev->s=='stable') {
+ addUpstream(
+ $db, "pear",
+ $channelname,
+ $rpmname1,
+ "stable",
+ (string)$rev->v
+ );
+ addUpstream(
+ $db,
+ "pear",
+ $channelname,
+ $rpmname2,
+ "stable",
+ (string)$rev->v
+ );
+ break;
+ }
+ }
+ $nb++;
+ // echo $ps->p->n."\n";
+ }
+ }
+ }
+ }
+ echo date("r : ") . "read $nb packages in $channelname\n";
+ $nbtot += $nb;
+ }
+ echo date("r : ") . "read $nbtot packages in all channels\n";
+
+ } catch (Exception $e) {
+ echo date("r : ") . 'ERROR ' . $e->getMessage(), "\n";
+ }
+ } // if in options
+
+ // -------------------------------------------------------------------
+ if ($_SERVER['argc']==1 || in_array('R', $_SERVER['argv'])) {
+
+ $repos = array(
+ array(
+ "name" => "R",
+ "state" => "stable",
+ "url" => "http://cran.at.r-project.org/src/contrib/PACKAGES"
+ ),
+ //array("name"=>"R-forge","state"=>"unstable", "url" => "http://r-forge.r-project.org/src/contrib/PACKAGES"),
+ array(
+ "name" => "biocp",
+ "state" => "stable",
+ "url" => "http://www.bioconductor.org/packages/release/bioc/src/contrib/PACKAGES"
+ ),
+ array(
+ "name" => "biocp",
+ "state" => "unstable",
+ "url" => "http://www.bioconductor.org/packages/devel/bioc/src/contrib/PACKAGES"
+ ),
+ array(
+ "name" => "bioca",
+ "state" => "stable",
+ "url" => "http://www.bioconductor.org/packages/release/data/annotation/src/contrib/PACKAGES"
+ ),
+ array(
+ "name" => "bioca",
+ "state" => "unstable",
+ "url" => "http://www.bioconductor.org/packages/devel/data/annotation/src/contrib/PACKAGES"
+ ),
+ array(
+ "name" => "bioce",
+ "state" => "stable",
+ "url" => "http://www.bioconductor.org/packages/release/data/experiment/src/contrib/PACKAGES"
+ ),
+ array(
+ "name" => "bioce",
+ "state" => "unstable",
+ "url" => "http://www.bioconductor.org/packages/devel/data/experiment/src/contrib/PACKAGES"
+ )
+ );
+ $tottot=0;
+ foreach ($repos as $repo) {
+ echo date("r : ") . "Reading " . $repo["name"] . " (" .
+ $repo["state"] . ")\n";
+ $index = @file_get_contents($repo["url"]);
+ if (!$index) {
+ echo date("r : ") . "Can't read [" . $repo["url"] .
+ "], skip this channel\n";
+ continue;
+ }
+ if ($repo["state"]=="stable") {
+ $sql = sprintf(
+ "DELETE FROM upstream WHERE type='R' AND channel='%s'",
+ $repo["name"]
+ );
+ $nb=$db->exec($sql);
+ if ($nb===false) {
+ echo date("r : ") . "SQL ERROR = " .
+ implode(" ", $db->errorInfo()) . "\n";
+ } else {
+ echo date("r : ") . "Delete $nb packages\n";
+ }
+ }
+ $results=array();
+ if (preg_match_all('/Package: *(.*)\nVersion: *(.*)\n/i', $index, $results, PREG_SET_ORDER)) {
+ $tot=0;
+ foreach ($results as $result) {
+ //echo $result[1]." = ".$result[2]."\n";
+ $rpmname = "R-".$result[1];
+ $ver = str_replace('-', '.', $result[2]);
+ $add_upstream = addUpstream(
+ $db,
+ "R",
+ $repo["name"],
+ $rpmname,
+ $repo["state"],
+ $ver,
+ ($repo["state"]=="stable"?"":"devel")
+ );
+
+ if ($add_upstream) {
+ $tot++;
+ }
+ }
+ echo date("r : ") . "Write $tot packages in this channel\n";
+ $tottot += $tot;
+ } else {
+ echo date("r : ") . "No package in this channel\n";
+ }
+ }
+ echo date("r : ") . "Write $tottot packages in all channels\n";
+
+ } // If R in options
+
+ // -------------------------------------------------------------------
+ // Package Owners from pkgdb (thanks Smootherfrog)
+ // -------------------------------------------------------------------
+ if ($_SERVER['argc']==1 || in_array('owner', $_SERVER['argv'])) {
+
+ $sql="CREATE TABLE IF NOT EXISTS `acls` (
+ `ID` int(11) NOT NULL AUTO_INCREMENT,
+ `collection` varchar(100) NOT NULL,
+ `name` varchar(100) NOT NULL,
+ `summary` varchar(200) NOT NULL,
+ `owner` varchar(50) DEFAULT NULL,
+ `qa` varchar(50) DEFAULT NULL,
+ `cc` varchar(100) DEFAULT NULL,
+ PRIMARY KEY (`ID`),
+ KEY `name` (`name`),
+ KEY `collection` (`collection`),
+ KEY `owner` (`owner`)) ENGINE=MyISAM";
+
+ if ($db->exec($sql)!==false) {
+ echo date("r : ") . "Check table 'acls' ok\n";
+ } else {
+ echo date("r : ") . "SQL ERROR = " .
+ implode(" ", $db->errorInfo()) . "\n";
+ }
+
+ $fic=fopen(
+ "https://admin.fedoraproject.org/pkgdb/lists/bugzilla?tg_format=plain",
+ "r"
+ );
+ if (!$fic) {
+ echo date("r : ") . "ERROR reading pkgdb\n";
+ } else {
+ $sql="TRUNCATE `acls`";
+ $nb=$db->exec($sql);
+ if ($nb===false) {
+ echo date("r : ") . "SQL ERROR = " .
+ implode(" ", $db->errorInfo()) . "\n";
+ } else {
+ echo date("r : ") . "Delete $nb packages\n";
+ }
+
+ for ($tot=0 ; $line=fgetcsv($fic, 1024, '|'); ) {
+ if (count($line)>5 && substr($line[0], 0, 1)!='#') {
+ for ($i=0; $i<6; $i++) {
+ $line[$i]=trim($line[$i]);
+ }
+ $sql=sprintf(
+ "INSERT INTO `acls` SET collection='%s', name='%s', summary='%s'",
+ $line[0],
+ $line[1],
+ addslashes($line[2])
+ );
+ if (!empty($line[3])) {
+ $sql .= sprintf(", owner='%s'", $line[3]);
+ }
+ if (!empty($line[4])) {
+ $sql .= sprintf(", qa='%s'", $line[4]);
+ }
+ if (!empty($line[5])) {
+ $sql .= sprintf(", cc='%s'", $line[5]);
+ }
+ $nb=$db->exec($sql);
+ if ($nb) {
+ $tot+=$nb;
+ } else {
+ echo date("r : ") . "SQL ERROR = " .
+ implode(" ", $db->errorInfo()) . "\n";
+ }
+ }
+ }
+ fclose($fic);
+ echo date("r : ") . "wrote $tot package's owner\n";
+ }
+ } // If in options
+
+} catch(PDOException $e) {
+ printf("%s ERREUR : %s\n", date("r"), $e->getMessage());
}
-if (isset($_SERVER["SERVER_NAME"])) echo "</pre>";
+if (isset($_SERVER["SERVER_NAME"])) {
+ echo "</pre>";
+}
?>
diff --git a/rpm.php b/rpm.php
index edad029..5073f9f 100644
--- a/rpm.php
+++ b/rpm.php
@@ -1,256 +1,261 @@
<?php
+
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * RPMs listing
+ *
+ * PHP version 5
+ *
+ * Copyright © 2010 Remi Collet
+ *
+ * This file is part of rpmphp.
+ *
+ * rpmphp is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * rpmphp is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with rpmphp. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @category Main
+ * @package RPMPHP
+ *
+ * @author Remi Collet <unknown@unknwown.com>
+ * @author Johan Cwiklinski <johan@x-tnd.be>
+ * @copyright 2010 Remi Collet
+ * @license http://www.gnu.org/licenses/agpl-3.0-standalone.html AGPL License 3.0 or (at your option) any later version
+ * @link http://github.com/remicollet/rpmphp/
+ * @since The begining of times.
+*/
+require 'main.inc.php';
+
$what=(isset($_GET["what"]) ? $_GET["what"] : "%fedora");
$type=(isset($_GET["type"]) ? $_GET["type"] : "pecl");
-require "config.inc.php";
+$ariane[] = array(
+ 'url' => '#',
+ 'text' => strtoupper($type). ' extensions in Fedora'
+);
+$smarty->assign('ariane', $ariane);
-function listRepos($db){
- $repos = array();
- $res=$db->query("SELECT * FROM repo WHERE active=1 ORDER BY ID");
- if ($res) while ($repo = $res->fetchObject()) {
- $repos[$repo->main][$repo->sub]=$repo;
- }
- // echo "<pre>"; print_r($repos);echo "</pre>";
- foreach($repos as $repomain) {
- foreach ($repomain as $repo) {
- /*printf ("<th align='left'>%s</th>", $repo->main);*/
- $repos[$repo->main][$repo->sub] = $repo;
- break;
- }
- }
- return $repos;
-}
+$smarty->assign('type', $type);
+$smarty->assign('what', $what);
+$smarty->assign('page_title', strtoupper($type). ' extensions in Fedora');
-function Report ($db, $type, $repos) {
- global $what;
+/**
+* Retrieve packages informations
+*
+* @param Object $db A reference to the database
+* @param string $type The current type
+*
+* @return array
+*/
+function report($db, $type)
+{
+ global $what, $smarty;
+ $packages = null;
+ $repos = listRepos($db);
+ $smarty->assign('repos', $repos);
- $i=0;
- $resup=$db->query("SELECT * FROM upstream WHERE type='$type' ORDER BY name");
- if ($resup) while ($upstream = $resup->fetchObject()) {
- $rpmname = $upstream->name;
+ $i=0;
+ $resup=$db->query("SELECT * FROM upstream WHERE type='$type' ORDER BY name");
+ if ($resup) {
+ while ($upstream = $resup->fetchObject()) {
+ $package = null;
+ $rpmname = $upstream->name;
- $sql2="SELECT DISTINCT owner FROM acls WHERE name = '$rpmname'";
- $res2=$db->query($sql2);
- $owners=array();
- if ($res2) while ($owner= $res2->fetchObject()) $owners[] = $owner->owner;
+ $sql2="SELECT DISTINCT owner FROM acls WHERE name = '$rpmname'";
+ $res2=$db->query($sql2);
+ $owners=array();
+ if ( $res2 ) {
+ while ($owner= $res2->fetchObject()) {
+ $owners[] = $owner->owner;
+ }
+ }
- $sql = "SELECT * FROM rpm WHERE name = '$rpmname'";
+ $sql = "SELECT * FROM rpm WHERE name = '$rpmname'";
- $res=$db->query($sql);
- $rpm = ($res ? $res->fetchObject() : false);
+ $res=$db->query($sql);
+ $rpm = ($res ? $res->fetchObject() : false);
- switch ($what) {
- case '%fedora':
- $display = ($rpm !== false);
- break;
- case '%stable':
- $display = !empty($upstream->stable);
- break;
- case '%all':
- $display = true;
- break;
- default: // owner
- $display = (array_search($what, $owners) !== false);
- break;
- }
+ switch ($what) {
+ case '%fedora':
+ $display = ($rpm !== false);
+ break;
+ case '%stable':
+ $display = !empty($upstream->stable);
+ break;
+ case '%all':
+ $display = true;
+ break;
+ default: // owner
+ $display = (array_search($what, $owners) !== false);
+ break;
+ }
- if ($display) {
- if ($rpm) {
- $dispname = "<a href=\"zoom.php?rpm=" . $rpmname . "\" title=\"" . htmlentities($rpm->summary) . "\">$rpmname</a>";
- } else {
- $dispname = $rpmname;
- }
- $rpms=array();
- if ($rpm) do {
- $rpms[$rpm->repo_main."-".$rpm->repo_sub]=$rpm;
- } while ($rpm = $res->fetchObject());
+ if ($display) {
+ if ($rpm) {
+ $package['name'] = '<a href="zoom.php?rpm=' . $rpmname .
+ '" title="' . htmlentities($rpm->summary) . '">' .
+ $rpmname . '</a>';
+ } else {
+ $package['name'] = $rpmname;
+ }
+ if ( $upstream->channel != $upstream->type ) {
+ $package['channel'] = $upstream->channel;
+ }
+ $rpms=array();
+ if ( $rpm ) {
+ do {
+ $rpms[$rpm->repo_main."-".$rpm->repo_sub]=$rpm;
+ } while ($rpm = $res->fetchObject());
+ }
- $dispowner="";
- foreach ($owners as $owner) {
- if ($dispowner) $dispowner .= "<br/>";
- $dispowner .= sprintf ("<a href=\"%s?type=$type&amp;what=%s\">%s</a>", $_SERVER["PHP_SELF"], $owner, $owner);
- }
- printf ("<tr class=\"%s\">\n\t<td>%s<br/><small>%s</small></td>\n\t<td>%s</td>\n\t<td>%s%s</td>\n",
- ($i%2 ? "odd" : "even"), $dispname,
- ($upstream->channel != $upstream->type ? "channel: " . $upstream->channel : ""),
- $dispowner,
- ($upstream->stable ? "<strong>".$upstream->stable."</strong><br />" : "&nbsp;"),
- ($upstream->unstable && (!$upstream->stable || $upstream->stable!=$upstream->unstable) ? $upstream->unstable." <small>(".$upstream->state.")</small>" : "&nbsp;"));
+ $dispowner="";
+ $package['owners'] = $owners;
+ if ( $upstream->stable ) {
+ $package['upstream_stable'] = $upstream->stable;
+ }
+ if ( $upstream->unstable
+ && (!$upstream->stable
+ || $upstream->stable!=$upstream->unstable)
+ ) {
+ $package['upstream_unstable'] = $upstream->unstable .
+ ' <small>(' . $upstream->state . ')</small>';
+ }
- $verup = strtolower($upstream->stable ? $upstream->stable : $upstream->unstable);
+ $verup = strtolower($upstream->stable ? $upstream->stable : $upstream->unstable);
- foreach($repos as $repomain) {
- $display="";
- $class="";
- foreach ($repomain as $repo) {
- if (isset($rpms[$repo->main."-".$repo->sub])) {
- $rpm=$rpms[$repo->main."-".$repo->sub];
+ $versions = null;
+ foreach ( $repos as $repomain ) {
+ $display="";
+ $class="";
+ foreach ( $repomain as $k=>$repo ) {
+ if ( isset($rpms[$repo->main."-".$repo->sub]) ) {
+ $rpm=$rpms[$repo->main."-".$repo->sub];
- $verpm=$rpm->ver;
- if (preg_match("/\.((beta|RC)\d*)\./i", $rpm->rel, $res)) {
- $verpm .= strtolower($res[1]);
- }
+ $verpm=$rpm->ver;
+ if (preg_match("/\.((beta|RC)\d*)\./i", $rpm->rel, $res)) {
+ $verpm .= strtolower($res[1]);
+ }
- switch ($repo->sub) {
- case "base":
- if (isset($rpms[$repo->main."-updates"])) {
- $display .= sprintf("%s-%s<br/>", $rpm->ver, $rpm->rel);
- } else {
- $display .= sprintf("<strong>%s</strong>-%s<br/>", $rpm->ver, $rpm->rel);
- }
- if ($verup==$verpm) $class="check";
- break;
- case "":
- $display .= sprintf("<strong>%s</strong>-%s<br/>", $rpm->ver, $rpm->rel);
- if ($verup==$verpm) $class="check";
- break;
- case "updates":
- $display .= sprintf("<strong>%s</strong>-%s <small>(updates)</small><br/>", $rpm->ver, $rpm->rel);
- if ($verup==$verpm) $class="check";
- break;
- case "testing":
- $display .= sprintf("%s-%s <small>(testing)</small><br/>", $rpm->ver, $rpm->rel);
- if ($verup==$verpm) $class="info";
- break;
- }
- } // RPM exists
- } // sub repo
- if ($display && empty($class)) $class="attn";
- if ($display) {
- printf("\t<td class=\"%s\">%s</td>\n", $class, $display);
- } else {
- echo "\t<td>&nbsp;</td>\n";
- }
- } // mainrepo
+ switch ($repo->sub) {
+ case "base":
+ if ( isset($rpms[$repo->main."-updates"]) ) {
+ $display .= sprintf(
+ "%s-%s<br/>",
+ $rpm->ver,
+ $rpm->rel
+ );
+ } else {
+ $display .= sprintf(
+ "<strong>%s</strong>-%s<br/>",
+ $rpm->ver,
+ $rpm->rel
+ );
+ }
+ if ( $verup==$verpm ) {
+ $class="check";
+ }
+ break;
+ case "":
+ $display .= sprintf(
+ "<strong>%s</strong>-%s<br/>",
+ $rpm->ver,
+ $rpm->rel
+ );
+ if ( $verup==$verpm ) {
+ $class="check";
+ }
+ break;
+ case "updates":
+ $display .= sprintf(
+ "<strong>%s</strong>-%s <small>(updates)</small><br/>",
+ $rpm->ver,
+ $rpm->rel
+ );
+ if ( $verup==$verpm ) {
+ $class="check";
+ }
+ break;
+ case "testing":
+ $display .= sprintf(
+ "%s-%s <small>(testing)</small><br/>",
+ $rpm->ver,
+ $rpm->rel
+ );
+ if ( $verup==$verpm ) {
+ $class="info";
+ }
+ break;
+ }
+ } // RPM exists
+ } // sub repo
+ if ( $display && empty($class) ) {
+ $class="attn";
+ }
+ $versions[] = array(
+ 'class' => $class,
+ 'display' => $display
+ );
+ $package['versions'] = $versions;
+ } // mainrepo
- echo "</tr>\n";
- $i++;
- }
- } // each $unstable
- echo "<tr id=\"count_found\"><td colspan=\"" . (count(array_keys($repos)) + 3) . "\">$i packages found</td></tr>\n";
+ $i++;
+ $packages[] = $package;
+ }
+ } // each $unstable
+ }
+ return $packages;
}
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
- <head>
- <title><?php echo $type; ?> extensions in Fedora</title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
- <link rel="stylesheet" type="text/css" media="screen" href="css/rpmphp.css"/>
- <!--<link rel="stylesheet" type="text/css" media="print" href="css/rpmphp-print.css">-->
- <link rel="shortcut icon" href="images/favicon.ico"/>
- <link rel="icon" href="images/favicon.ico"/>
- </head>
- <body>
- <div id="wrapper">
-<?php
-include '_header.php';
-?>
- <!-- content BEGIN -->
- <div id="fedora-content">
- <div id="ariane">
- <p>You are here: </p>
- <ul>
- <li><a href="./">Reports home</a></li>
- <li><a href="#"><?php echo strtoupper($type) . ' extensions'; ?></a></li>
- </ul>
- </div>
-
- <div id="filter">
- <form action="rpm.php" method="get">
- <fieldset>
- <legend>Filter <?php echo strtoupper($type); ?> packages</legend>
- <input type="hidden" name='type' value="<?php echo $type; ?>" />
- <label for="what">Criteria: </label>
- <select name="what" id="what">
- <optgroup label="Pakages">
- <option value="%fedora"<?php if ($what=='%fedora') echo " selected=\"selected\""; ?>>In fedora</option>
- <option value="%stable"<?php if ($what=='%stable') echo " selected=\"selected\""; ?>>All stable</option>
- <option value="%all"<?php if ($what=='%all') echo " selected=\"selected\""; ?>>All</option>
- </optgroup>
- <optgroup label="Owner">
-<?php
try {
- switch ($type) {
- case "pecl": $filter = "WHERE name LIKE 'php-pecl-%' "; break;
- case "pear": $filter = "WHERE name LIKE 'php-%' "; break;
- case "R": $filter = "WHERE name LIKE 'R-%' "; break;
- default: $filter = "";
- }
+ switch ($type) {
+ case "pecl":
+ $filter = "WHERE name LIKE 'php-pecl-%' ";
+ break;
+ case "pear":
+ $filter = "WHERE name LIKE 'php-%' ";
+ break;
+ case "R":
+ $filter = "WHERE name LIKE 'R-%' ";
+ break;
+ default:
+ $filter = "";
+ }
- $db = new PDO ("mysql:dbname=" . MYBASE . ";host=" . MYHOST, MYUSER, MYPASS);
- $sql="SELECT DISTINCT owner FROM acls $filter ORDER BY owner";
- $res=$db->query($sql);
- if ($res)while ($owner = $res->fetchObject()) {
- printf("\t\t\t\t\t\t\t\t\t<option value=\"%s\" %s>%s</option>\n", $owner->owner, ($what==$owner->owner ? " selected=\"selected\"" : ""), $owner->owner);
- } else {
- echo "\t\t\t\t\t\t\t\t\t<option value=\"remi\">remi</option>\n";
- }
-?>
- </optgroup>
- </select>
- <input type="submit" value="Filter" />
- </fieldset>
- </form>
- </div>
-<?php
+ $db = new PDO ("mysql:dbname=" . MYBASE . ";host=" . MYHOST, MYUSER, MYPASS);
+ $sql="SELECT DISTINCT owner FROM acls $filter ORDER BY owner";
+ $res=$db->query($sql);
+ if ( $res ) {
+ while ( $owner = $res->fetchObject() ) {
+ $owners[] = $owner;
+ }
+ $smarty->assign('owners', $owners);
+ }
- $sql='SELECT MAX(stamp) AS stamp FROM repo';
- $res=$db->query($sql);
- if ($res && $row=$res->fetchObject()) {
- printf("<p>Repositories last updated %s.</p>", date("r", $row->stamp));
- }
+ $sql='SELECT MAX(stamp) AS stamp FROM repo';
+ $res=$db->query($sql);
+ if ($res && $row=$res->fetchObject()) {
+ $smarty->assign('repositories_update', date("r", $row->stamp));
+ }
-?>
- <h1><?php echo strtoupper($type). ' extensions in Fedora'; ?></h1>
- <table id="list-packages">
- <thead>
- <tr>
- <th>Package</th>
- <th>Owner(s)</th>
- <th>Upstream</th>
-<?php
-$repos = listRepos($db);
-$repos_k = array_keys($repos);
-foreach ( $repos_k as $r ) {
-?>
- <th><?php echo $r; ?></th>
-<?php
-}
-?>
- </tr>
- </thead>
- <tbody>
-<?php
- Report($db, $type, $repos);
+ $smarty->assign('packages', report($db, $type));
} catch(PDOException $e) {
-?>
- <tr>
- <td colspan="<?php echo count($repos_k) + 3; ?>">
-<?php
- printf("%s ERREUR : %s\n", date("r"), $e->getMessage());
-?>
- </td>
- </tr>
-<?php
+ $smarty->assign(
+ 'error',
+ sprintf("%s ERREUR : %s\n", date("r"), $e->getMessage())
+ );
}
-?>
- </tbody>
- </table>
- <ul id="legend">
- <li>Legend: </li>
- <li><strong>Upstream</strong>: bold if stable. </li>
- <li><strong>Repo</strong>: bold for latest release.</li>
- <li class='check'>Lastest released (stable if exists)</li>
- <li class='info'>Lastest in testing</li>
- <li class='attn'>Lastest not available</li>
- </ul>
- </div><!-- /fedora-content -->
-
-<?php
-include '_footer.php';
-?>
- </div>
- </body>
-</html>
+$page_content = $smarty->fetch('rpm.tpl');
+$smarty->assign('page_content', $page_content);
+$smarty->display('main.tpl');
+?> \ No newline at end of file
diff --git a/smarty/templates/rpmphp/all.tpl b/smarty/templates/rpmphp/all.tpl
new file mode 100644
index 0000000..8d9c20a
--- /dev/null
+++ b/smarty/templates/rpmphp/all.tpl
@@ -0,0 +1,104 @@
+{*
+ * All page template
+ *
+ * Copyright © 2010 Remi Collet
+ *
+ * This file is part of rpmphp.
+ *
+ * rpmphp is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * rpmphp is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with rpmphp. If not, see <http://www.gnu.org/licenses/>.
+*}
+ <p id="repositories_update">Repositories last updated {$repositories_update}.</p>
+ <div id="filter">
+ <form action="all.php" method="get">
+ <fieldset>
+ <legend>Filter {$type|upper} packages</legend>
+ <label for="what">Criteria: </label>
+ <select name="what" id="what">
+ <optgroup label="Pakages">
+{foreach from=$starts_with item=s}
+ <option value="{$s->init}"{if $what eq $s->init} selected="selected"{/if}>Start with {$s->init|substr:1:2}</option>
+{foreachelse}
+ <option value="remi">remi</option>
+{/foreach}
+ </optgroup>
+ <optgroup label="Owner">
+{foreach from=$owners item=o}
+ <option value="{$o->owner}"{if $what eq $o->owner} selected="selected"{/if}>{$o->owner}</option>
+{foreachelse}
+ <option value="remi">remi</option>
+{/foreach}
+ </optgroup>
+ </select>
+ <input type="submit" value="Filter" />
+ </fieldset>
+ </form>
+ </div><!-- /filter -->
+
+{if $error}
+ <p id="error"><strong>Ooops, an error occured:</strong><br/>{$error}</p>
+{/if}
+
+ <table id="list-packages">
+ <thead>
+ <tr>
+ <th>Package</th>
+ <th>Owner(s)</th>
+{foreach from=$repos key=k item=v}
+ <th>{$k}</th>
+{/foreach}
+ </tr>
+ </thead>
+ <tfoot>
+ <tr>
+ <td colspan="{math equation="x+2" x=$repos|@count}">{$packages|@count} packages found</td>
+ </tr>
+ </tfoot>
+ <tbody>
+{foreach from=$packages item=p name=plist}
+ <tr class="{if $smarty.foreach.plist.iteration % 2 eq 0}even{else}odd{/if}">
+ <td>
+ <a href="zoom.php?rpm={$p.name}" title="{$p.description}">{$p.name}</a>
+ </td>
+ <td>
+ {foreach from=$p.owners item=owner name=ow_it}
+ <a href="?what={$owner}">{$owner}</a>
+ {if not $smarty.foreach.ow_it.last}
+ <br/>
+ {/if}
+ {/foreach}
+ </td>
+ {foreach from=$p.versions key=k item=version}
+ <td{if $version.class} class="{$version.class}"{/if}>
+ {$version.display}
+ </td>
+ {/foreach}
+ </tr>
+{foreachelse}
+ <tr>
+ <td colspan="{math equation="x+2" x=$repos|@count}">
+ <h2>Choose a criteria from the filter menu</h2>
+ </td>
+ </tr>
+{/foreach}
+ </tbody>
+ </table>
+
+ <ul id="legend">
+ <li>Legend: </li>
+ <li><strong>Upstream</strong>: bold if stable. </li>
+ <li><strong>Repo</strong>: bold for latest release.</li>
+ <li class='check'>Lastest released (stable if exists)</li>
+ <li class='info'>Lastest in testing</li>
+ <li class='attn'>Lastest not available</li>
+ </ul>
diff --git a/smarty/templates/rpmphp/index.tpl b/smarty/templates/rpmphp/index.tpl
index ae65b48..3cd47b0 100644
--- a/smarty/templates/rpmphp/index.tpl
+++ b/smarty/templates/rpmphp/index.tpl
@@ -1,3 +1,23 @@
+{*
+ * Index page template
+ *
+ * Copyright © 2010 Remi Collet
+ *
+ * This file is part of rpmphp.
+ *
+ * rpmphp is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * rpmphp is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with rpmphp. If not, see <http://www.gnu.org/licenses/>.
+*}
<h2>Package reports</h2>
<ul id="reports">
<li><a href="rpm.php?type=pecl">PECL Extensions in Fedora</a> with upstream information</li>
diff --git a/smarty/templates/rpmphp/main.tpl b/smarty/templates/rpmphp/main.tpl
index 6f12fdf..ace37c9 100644
--- a/smarty/templates/rpmphp/main.tpl
+++ b/smarty/templates/rpmphp/main.tpl
@@ -1,3 +1,23 @@
+{*
+ * Main page template
+ *
+ * Copyright © 2010 Remi Collet
+ *
+ * This file is part of rpmphp.
+ *
+ * rpmphp is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * rpmphp is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with rpmphp. If not, see <http://www.gnu.org/licenses/>.
+*}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
diff --git a/smarty/templates/rpmphp/rpm.tpl b/smarty/templates/rpmphp/rpm.tpl
new file mode 100644
index 0000000..32af685
--- /dev/null
+++ b/smarty/templates/rpmphp/rpm.tpl
@@ -0,0 +1,106 @@
+{*
+ * RPM page template
+ *
+ * Copyright © 2010 Remi Collet
+ *
+ * This file is part of rpmphp.
+ *
+ * rpmphp is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * rpmphp is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with rpmphp. If not, see <http://www.gnu.org/licenses/>.
+*}
+ <p id="repositories_update">Repositories last updated {$repositories_update}.</p>
+ <div id="filter">
+ <form action="rpm.php" method="get">
+ <fieldset>
+ <legend>Filter {$type|upper} packages</legend>
+ <input type="hidden" name='type' value="{$type}" />
+ <label for="what">Criteria: </label>
+ <select name="what" id="what">
+ <optgroup label="Pakages">
+ <option value="%fedora"{if $what eq '%fedora'} selected="selected"{/if}>In fedora</option>
+ <option value="%stable"{if $what eq '%stable'} selected="selected"{/if}>All stable</option>
+ <option value="%all"{if $what eq '%all'} selected="selected"{/if}>All</option>
+ </optgroup>
+ <optgroup label="Owner">
+{foreach from=$owners item=o}
+ <option value="{$o->owner}">{$o->owner}</option>
+{foreachelse}
+ <option value="remi">remi</option>
+{/foreach}
+ </optgroup>
+ </select>
+ <input type="submit" value="Filter" />
+ </fieldset>
+ </form>
+ </div><!-- /filter -->
+
+ <table id="list-packages">
+ <thead>
+ <tr>
+ <th>Package</th>
+ <th>Owner(s)</th>
+ <th>Upstream</th>
+
+{foreach from=$repos key=k item=v}
+ <th>{$k}</th>
+{/foreach}
+ </tr>
+ </thead>
+ <tfoot>
+ <tr>
+ <td colspan="{math equation="x+3" x=$repos|@count}">{$packages|@count} packages found</td>
+ </tr>
+ </tfoot>
+ <tbody>
+{foreach from=$packages item=p name=plist}
+ <tr class="{if $smarty.foreach.plist.iteration % 2 eq 0}even{else}odd{/if}">
+ <td>
+ {$p.name}
+ {if $p.channel}
+ <br/><small>channel: {$p.channel}</small>
+ {/if}
+ </td>
+ <td>
+ {foreach from=$p.owners item=owner name=ow_it}
+ <a href="?what={$owner}">{$owner}</a>
+ {if not $smarty.foreach.ow_it.last}
+ <br/>
+ {/if}
+ {/foreach}
+ </td>
+ <td>
+ {if $p.upstream_stable}
+ <strong>{$p.upstream_stable}</strong>
+ {/if}
+ {if $p.upstream_unstable}
+ <br/>{$p.upstream_unstable}
+ {/if}
+ </td>
+ {foreach from=$p.versions key=k item=version}
+ <td{if $version.class} class="{$version.class}"{/if}>
+ {$version.display}
+ </td>
+ {/foreach}
+ </tr>
+{/foreach}
+ </tbody>
+ </table>
+
+ <ul id="legend">
+ <li>Legend: </li>
+ <li><strong>Upstream</strong>: bold if stable. </li>
+ <li><strong>Repo</strong>: bold for latest release.</li>
+ <li class='check'>Lastest released (stable if exists)</li>
+ <li class='info'>Lastest in testing</li>
+ <li class='attn'>Lastest not available</li>
+ </ul>
diff --git a/smarty/templates/rpmphp/zoom.tpl b/smarty/templates/rpmphp/zoom.tpl
index ff79602..704c6b7 100644
--- a/smarty/templates/rpmphp/zoom.tpl
+++ b/smarty/templates/rpmphp/zoom.tpl
@@ -1,3 +1,24 @@
+{*
+ * Zoom page template
+ *
+ * Copyright © 2010 Remi Collet
+ *
+ * This file is part of rpmphp.
+ *
+ * rpmphp is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * rpmphp is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with rpmphp. If not, see <http://www.gnu.org/licenses/>.
+*}
+
{if $error}
{if $error eq 'missing_name'}
<h1>Missing package name</h1>
diff --git a/zoom.php b/zoom.php
index 995c7fd..0ea20cf 100644
--- a/zoom.php
+++ b/zoom.php
@@ -31,7 +31,6 @@
* @author Johan Cwiklinski <johan@x-tnd.be>
* @copyright 2010 Remi Collet
* @license http://www.gnu.org/licenses/agpl-3.0-standalone.html AGPL License 3.0 or (at your option) any later version
- * @version SVN: $Id: ajouter_adherent.php 836 2010-02-27 08:11:44Z trashy $
* @link http://github.com/remicollet/rpmphp/
* @since The begining of times.
*/