diff options
author | Remi Collet <fedora@famillecollet.com> | 2010-05-30 19:37:05 +0200 |
---|---|---|
committer | Remi Collet <fedora@famillecollet.com> | 2010-05-30 19:37:05 +0200 |
commit | 9a9c61c739c976a9fcbe086e03b5305b0e646d5c (patch) | |
tree | 33716a03fd9e88e5b1d2de9bde7efc8603e02d1e | |
parent | b613aa3f99a51e08b16b4402de2b684d3f266b66 (diff) | |
parent | 4fe73c547050003599021850f0c6099f7c224f07 (diff) |
merge
-rw-r--r-- | LICENSE | 661 | ||||
-rw-r--r-- | all.php | 443 | ||||
-rw-r--r-- | config.inc.php.dist | 35 | ||||
-rw-r--r-- | css/rpmphp.css | 7 | ||||
-rw-r--r-- | index.php | 1 | ||||
-rw-r--r-- | main.inc.php | 61 | ||||
-rw-r--r-- | refresh.php | 1094 | ||||
-rw-r--r-- | rpm.php | 463 | ||||
-rw-r--r-- | smarty/templates/rpmphp/all.tpl | 104 | ||||
-rw-r--r-- | smarty/templates/rpmphp/index.tpl | 20 | ||||
-rw-r--r-- | smarty/templates/rpmphp/main.tpl | 20 | ||||
-rw-r--r-- | smarty/templates/rpmphp/rpm.tpl | 106 | ||||
-rw-r--r-- | smarty/templates/rpmphp/zoom.tpl | 21 | ||||
-rw-r--r-- | zoom.php | 1 |
14 files changed, 2148 insertions, 889 deletions
@@ -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/>. @@ -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> </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; @@ -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>"; +} ?> @@ -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&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 />" : " "), - ($upstream->unstable && (!$upstream->stable || $upstream->stable!=$upstream->unstable) ? $upstream->unstable." <small>(".$upstream->state.")</small>" : " ")); + $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> </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> @@ -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. */ |