portage-hs (empty) → 0.1.0.0
raw patch · 17 files changed
+2833/−0 lines, 17 filesdep +QuickCheckdep +basedep +conduit
Dependencies added: QuickCheck, base, conduit, containers, directory, filepath, hashable, mtl, parsable, parsable-test, portage-hs, pretty-simple, process, tasty, tasty-hunit, text, transformers
Files
- CHANGELOG.md +5/−0
- LICENSE +661/−0
- portage-hs.cabal +164/−0
- src-internal/Internal/Distribution/Portage/Types.hs +590/−0
- src/Distribution/Portage/Emerge.hs +73/−0
- src/Distribution/Portage/Emerge/Parser.hs +87/−0
- src/Distribution/Portage/PkgDb.hs +20/−0
- src/Distribution/Portage/PkgDb/Contents.hs +2/−0
- src/Distribution/Portage/Types.hs +38/−0
- test/Emerge/GentooTests.hs +25/−0
- test/Emerge/ParserTests.hs +75/−0
- test/Main.hs +45/−0
- test/PkgDb/GentooTests.hs +15/−0
- test/Types/GentooTests.hs +79/−0
- test/Types/UnitTests.hs +214/−0
- test/Types/ValidityTests.hs +277/−0
- test/data/2022-07-16/emerge-world-test.stdout +463/−0
+ CHANGELOG.md view
@@ -0,0 +1,5 @@+# Revision history for portage-hs++## 0.1.0.0 -- YYYY-mm-dd++* First version. Released on an unsuspecting world.
+ LICENSE view
@@ -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/>.
+ portage-hs.cabal view
@@ -0,0 +1,164 @@+cabal-version: 3.0+name: portage-hs+version: 0.1.0.0+synopsis: Data structures and functions for interacting with the Portage package manager++tested-with: GHC == { 9.0.2, 9.2.8, 9.4.8, 9.6.6, 9.8.4, 9.10.1, 9.12.1 }++description:+ Currently, this includes:++ * data structures for package atoms+ * parsers for atoms, emerge output, and CONTENTS files+ * functions for running emerge+ * lots of tests++homepage: https://github.com/gentoo-haskell/cabal-portage/tree/main/portage-hs+bug-reports: https://github.com/gentoo-haskell/cabal-portage/issues++license: AGPL-3.0-only+license-file: LICENSE+author: Gentoo Authors+maintainer: hololeap@protonmail.com++copyright: Copyright (C) 2022-2025 Gentoo Authors+category: System+extra-doc-files: CHANGELOG.md++extra-source-files:+ test/data/**/*.stdout++source-repository head+ type: git+ location: https://github.com/hololeap/cabal-portage.git+ branch: main+ subdir: portage-hs++flag gentoo-tests+ description: Enable tests that depend on a working Gentoo environment+ default: False+ manual: True++flag pedantic+ description: Enable -Werror+ default: False+ manual: True++common all+ ghc-options: -Wall+ -foptimal-applicative-do+ if flag(pedantic)+ ghc-options: -Werror++ default-extensions:+ , StrictData++common fast+ ghc-options: -threaded+ -with-rtsopts=-N++library+ import: all+ exposed-modules:+ , Distribution.Portage.Types+ , Distribution.Portage.PkgDb+ , Distribution.Portage.PkgDb.Contents+ , Distribution.Portage.Emerge+ , Distribution.Portage.Emerge.Parser++ hs-source-dirs: src+ default-language: Haskell2010++ build-depends:+ , base >=4.13 && <4.22+ , containers <0.8+ , directory <1.4+ , filepath <1.6+ , mtl <2.4+ , process <1.7+ , text <2.2+ , transformers <0.7+ , parsable <0.2+ , portage-hs-internal <0.2++ other-extensions:+ , ApplicativeDo+ , FlexibleContexts+ , LambdaCase+ , NoImplicitPrelude+ , OverloadedStrings+ , ScopedTypeVariables+ , TypeFamilies++library portage-hs-internal+ import: all+ exposed-modules:+ , Internal.Distribution.Portage.Types++ build-depends:+ , base >=4.13 && <4.22+ , hashable <1.6+ , parsable <0.2+ hs-source-dirs: src-internal+ default-language: Haskell2010+ other-extensions:+ , DeriveDataTypeable+ , DeriveGeneric+ , DerivingVia+ , FlexibleContexts+ , FlexibleInstances+ , GeneralizedNewtypeDeriving+ , LambdaCase+ , MultiParamTypeClasses+ , OverloadedStrings+ , ScopedTypeVariables+ , TypeApplications+ , TypeFamilies+ , UndecidableInstances++test-suite portage-hs-test+ import: all, fast+ default-language: Haskell2010+ type: exitcode-stdio-1.0+ hs-source-dirs: test+ main-is: Main.hs+ other-modules:+ , Emerge.ParserTests+ , Types.ValidityTests+ , Types.UnitTests+ , Paths_portage_hs+ autogen-modules:+ , Paths_portage_hs+ build-depends:+ , parsable <0.2+ , parsable-test <0.2+ , portage-hs <0.2+ , portage-hs-internal <0.2+ , base >=4.13 && <4.22+ , conduit <1.4+ , containers <0.8+ , directory <1.4+ , filepath <1.6+ , QuickCheck <2.16+ , tasty <1.6+ , tasty-hunit <0.11+ , text <2.2+ , transformers <0.7++ other-extensions:+ , CPP+ , FlexibleContexts+ , LambdaCase+ , ScopedTypeVariables+ , TypeApplications+ , ViewPatterns++ if flag(gentoo-tests)+ build-depends:+ , pretty-simple+ CPP-Options:+ -DGENTOO_TESTS+ other-modules:+ , Emerge.GentooTests+ , PkgDb.GentooTests+ , Types.GentooTests
+ src-internal/Internal/Distribution/Portage/Types.hs view
@@ -0,0 +1,590 @@+{-|+Module : Distribution.Portage.Internal.Types++Types for internal use+-}++{-# Language DeriveAnyClass #-}+{-# Language DeriveDataTypeable #-}+{-# Language DeriveGeneric #-}+{-# Language DerivingVia #-}+{-# Language FlexibleContexts #-}+{-# Language FlexibleInstances #-}+{-# Language GeneralizedNewtypeDeriving #-}+{-# Language LambdaCase #-}+{-# Language MultiParamTypeClasses #-}+{-# Language OverloadedStrings #-}+{-# Language ScopedTypeVariables #-}+{-# Language TypeApplications #-}+{-# Language TypeFamilies #-}+{-# Language UndecidableInstances #-}++module Internal.Distribution.Portage.Types+ (+ -- * Types+ Package(..)+ , Category(..)+ , PkgName(..)+ , Slot(..)+ , SubSlot(..)+ , Repository(..)+-- , EBuildFileName (..)+ -- ** Versions+ , Version(..)+ , VersionNum(..)+ , VersionLetter(..)+ , VersionSuffix(..)+ , VersionSuffixNum(..)+ , VersionRevision(..)+ -- ** Constraints+ , ConstrainedDep(..)+ , toConstrainedDep+ , fromConstrainedDep+ , doesConstraintMatch+ , Operator(..)+ -- * Internal+ , FauxVersion(..)+ , FauxVersionNum(..)+ ) where++import Control.Applicative (Alternative, some)+import Data.Data (Data)+import Data.Function (on)+import Data.Hashable+import qualified Data.List as L+import Data.List.NonEmpty (NonEmpty(..))+import qualified Data.List.NonEmpty as NE+import GHC.Exts (IsList(..))+import GHC.Generics (Generic)+import GHC.Natural (Natural)++import Data.Parsable++newtype Category = Category+ { unwrapCategory :: String }+ deriving stock (Show, Eq, Ord, Data, Generic)+ deriving newtype (IsString, Printable)+ deriving anyclass Hashable++instance Stream s m Char => Parsable Category m u s where+ parserName = "portage category"+ parser = Category <$> wordAllowed wordStart wordRest+ where+ wordStart =+ [ isAsciiUpper+ , isAsciiLower+ , isDigit+ , (== '_')+ ]+ wordRest = wordStart +++ [ (== '+')+ , (== '-')+ , (== '.')+ ]++newtype PkgName = PkgName+ { unwrapPkgName :: String }+ deriving stock (Show, Eq, Ord, Data, Generic)+ deriving newtype (IsString, Printable)+ deriving anyclass Hashable++instance forall m u s. Stream s m Char => Parsable PkgName m u s where+ parserName = "portage package name"+ parser = PkgName <$> pkgParser wordStart wordRest+ where+ wordStart =+ [ isAsciiUpper+ , isAsciiLower+ , isDigit+ , (== '_')+ ]+ wordRest = (== '+') : (== '-') : wordStart++newtype VersionNum = VersionNum+ { unwrapVersionNum :: NonEmpty (NonEmpty Char) }+ deriving stock (Show, Eq, Data, Generic)+ deriving anyclass Hashable++-- See section 3.3 "Version Comparison" of the Package Manager Specification+instance Ord VersionNum where+ VersionNum (s1 :| ss1) `compare` VersionNum (s2 :| ss2)+ = toNat s1 `compare` toNat s2 -- Algorithm 3.2+ <> mconcat ((zipWith compRest `on` fmap trim) ss1 ss2) -- Algorithm 3.3+ <> length ss1 `compare` length ss2+ where+ compRest :: (Bool, NonEmpty Char) -> (Bool, NonEmpty Char) -> Ordering+ -- Neither side had a leading zero so we use numeric comparison+ compRest (False, c1) (False, c2) = toNat c1 `compare` toNat c2+ -- At least one side a had leading zero so we use string comparison+ compRest (_ , c1) (_ , c2) = c1 `compare` c2++ -- If a component starts with a '0', mark it True and remove any+ -- trailing 0s+ trim :: NonEmpty Char -> (Bool, NonEmpty Char)+ trim = \case+ ('0' :| xs) -> (True, '0' :| foldr skipTrailing0s [] xs)+ xs -> (False, xs)+ where+ skipTrailing0s '0' [] = []+ skipTrailing0s c cs = c:cs++ toNat :: NonEmpty Char -> Natural+ toNat = read . toList++instance IsList VersionNum where+ type instance Item VersionNum = NonEmpty Char+ fromList = VersionNum . fromList+ toList = toList . unwrapVersionNum++instance Printable VersionNum where+ toString = L.intercalate "." . NE.toList . fmap NE.toList . unwrapVersionNum++instance Stream s m Char => Parsable VersionNum m u s where+ parserName = "portage version number"+ parser = versionNumParser (`sepBy1` char '.') (NE.fromList <$>)++newtype VersionLetter = VersionLetter+ { unwrapVersionLetter :: Char }+ deriving stock (Show, Eq, Ord, Data, Generic)+ deriving anyclass Hashable++instance Printable VersionLetter where+ toString (VersionLetter l) = [l]++instance Stream s m Char => Parsable VersionLetter m u s where+ parserName = "portage version letter"+ parser = VersionLetter <$> satisfy isAsciiLower++data VersionSuffix+ = SuffixAlpha+ | SuffixBeta+ | SuffixPre+ | SuffixRC+ | SuffixP+ deriving stock (Show, Eq, Ord, Data, Generic, Bounded, Enum)+ deriving anyclass Hashable++instance Printable VersionSuffix where+ toString = \case+ SuffixAlpha -> "alpha"+ SuffixBeta -> "beta"+ SuffixPre -> "pre"+ SuffixRC -> "rc"+ SuffixP -> "p"++instance Stream s m Char => Parsable VersionSuffix m u s where+ parserName = "portage version suffix"+ parser = choice+ [ SuffixAlpha <$ try (string "alpha")+ , SuffixBeta <$ try (string "beta")+ , SuffixPre <$ try (string "pre")+ , SuffixRC <$ try (string "rc")+ , SuffixP <$ string "p"+ ]++newtype VersionSuffixNum = VersionSuffixNum+ { unwrapVersionSuffixNum :: NonEmpty Char }+ deriving stock (Show, Eq, Ord, Data, Generic)+ deriving anyclass Hashable++instance Printable VersionSuffixNum where+ toString = NE.toList . unwrapVersionSuffixNum++instance Stream s m Char => Parsable VersionSuffixNum m u s where+ parserName = "portage version suffix number"+ parser = VersionSuffixNum . NE.fromList <$> some (satisfy isDigit)++newtype VersionRevision = VersionRevision+ { unwrapVersionRevision :: NonEmpty Char }+ deriving stock (Show, Eq, Ord, Data, Generic)+ deriving anyclass Hashable++instance Printable VersionRevision where+ toString (VersionRevision r) = "r" ++ NE.toList r++instance Stream s m Char => Parsable VersionRevision m u s where+ parserName = "portage version revision"+ parser = do+ _ <- char 'r'+ VersionRevision . NE.fromList <$> some (satisfy isDigit)++data Version = Version+ { getVersionNum :: VersionNum+ , getVersionLetter :: Maybe VersionLetter+ , getVersionSuffixes :: [(VersionSuffix, Maybe VersionSuffixNum)]+ , getVersionRevision :: Maybe VersionRevision+ } deriving stock (Show, Eq, Data, Generic)+ deriving anyclass Hashable++-- See section 3.3 "Version Comparison" of the Package Manager Specification+instance Ord Version where+ Version n1 l1 s1 r1 `compare` Version n2 l2 s2 r2+ = n1 `compare` n2+ <> l1 `compare` l2+ <> s1 `compareSuffixes` s2+ <> r1 `compareRevisions` r2+ where+ -- Algorithm 3.5+ compareSuffixes [] [] = EQ+ compareSuffixes ((SuffixP,_):_) [] = GT+ compareSuffixes ((_,_):_) [] = LT+ compareSuffixes [] ((SuffixP,_):_) = LT+ compareSuffixes [] ((_,_):_) = GT+ compareSuffixes (u1:us1) (u2:us2) =+ (compare `on` fmap toNat) u1 u2+ <> us1 `compareSuffixes` us2+ where+ toNat :: Maybe VersionSuffixNum -> Natural+ toNat = maybe (0 :: Natural) (read . toList . unwrapVersionSuffixNum)++ compareRevisions = compare `on`+ maybe (0 :: Natural) (read . NE.toList . unwrapVersionRevision)++instance Printable Version where+ toString (Version n l s r)+ = toString n+ ++ foldMap toString l+ ++ (s >>= suffixString)+ ++ foldMap (\x -> "-" ++ toString x) r+ where+ suffixString (ss,sn) = "_" ++ toString ss ++ foldMap toString sn++instance Stream s m Char => Parsable Version m u s where+ parserName = "portage version"+ parser = versionParser parser++data Operator+ = Lesser+ | LesserOrEqual+ | Equal+ | EqualAsterisk+ | EqualIgnoreRevision+ | GreaterOrEqual+ | Greater+ deriving stock (Show, Eq, Ord, Bounded, Enum, Data, Generic)+ deriving anyclass Hashable++data ConstrainedDep = ConstrainedDep+ { constrainedOperator :: Operator+ , constrainedCategory :: Category+ , constrainedPkgName :: PkgName+ , constrainedVersion :: Version+ , constrainedSlot :: Maybe Slot+ , constrainedRepository :: Maybe Repository+ } deriving stock (Show, Eq, Ord, Data, Generic)+ deriving anyclass Hashable++instance Printable ConstrainedDep where+ toString (ConstrainedDep o c n v ms mr)+ = operStr+ ++ toString c+ ++ "/"+ ++ toString n+ ++ "-"+ ++ toString v+ ++ asterisk+ ++ foldMap (\s -> ":" ++ toString s) ms+ ++ foldMap (\r -> "::" ++ toString r) mr+ where+ asterisk = case o of+ EqualAsterisk -> "*"+ _ -> ""++ operStr :: String+ operStr = case o of+ Lesser -> "<"+ LesserOrEqual -> "<="+ Greater -> ">"+ GreaterOrEqual -> ">="+ Equal -> "="+ EqualAsterisk -> "="+ EqualIgnoreRevision -> "~"++instance Stream s m Char => Parsable ConstrainedDep m u s where+ parserName = "portage package with version constraint"+ parser = do+ o <- operParser+ c <- parser+ _ <- char '/'+ n <- parser+ _ <- char '-'+ v <- parser+ o' <- option o $ try $ case o of+ Equal -> EqualAsterisk <$ char '*'+ _ -> char '*' *> fail "Unexpected asterisk (not Equal operator)"+ s <- optionMaybe $ try $ string ":" *> parser+ r <- optionMaybe $ try $ string "::" *> parser+ pure $ ConstrainedDep o' c n v s r+ where+ operParser = choice+ [ char '>' *> option Greater (try (GreaterOrEqual <$ char '='))+ , char '<' *> option Lesser (try (LesserOrEqual <$ char '='))+ , Equal <$ char '='+ , EqualIgnoreRevision <$ char '~'+ ]++toConstrainedDep :: Operator -> Package -> Maybe ConstrainedDep+toConstrainedDep o (Package c n mv ms mr) =+ (\v -> ConstrainedDep o c n v ms mr) <$> mv++fromConstrainedDep :: ConstrainedDep -> Package+fromConstrainedDep (ConstrainedDep _ c p v ms mr) =+ Package c p (Just v) ms mr++-- | Uses "optimistic" matching, meaning: if a package does not provide+-- information that the constraint requires, it is assumed to be a match.+--+-- For example, the constraint @<dev-haskell/text-2.2:0::haskell@ matches+-- @dev-haskell/text@ but not @dev-haskell/text-2.3@.+doesConstraintMatch :: ConstrainedDep -> Package -> Bool+doesConstraintMatch (ConstrainedDep co cc cn cv cs cr) (Package pc pn pv ps pr)+ | cc /= pc = False+ | cn /= pn = False+ | otherwise+ = checkConstrained cs ps+ && checkConstrained cr pr+ && case pv of+ Nothing -> True -- No version info on the package means it matches+ Just v -> case co of+ Lesser -> v < cv+ LesserOrEqual -> v <= cv+ Equal -> v == cv+ GreaterOrEqual -> v >= cv+ Greater -> v > cv+ EqualIgnoreRevision ->+ v { getVersionRevision = Nothing }+ == cv { getVersionRevision = Nothing }+ EqualAsterisk ->+ checkEqAst+ (toList (getVersionNum cv))+ (toList (getVersionNum v))+ where+ checkEqAst [] [] = True+ checkEqAst (_cv:_cvs) [] = False+ checkEqAst [] (_v:_vs) = True+ checkEqAst (cv':cvs) (v:vs) = cv' == v && checkEqAst cvs vs++ checkConstrained :: Eq a => Maybe a -> Maybe a -> Bool+ checkConstrained m1 m2 = case (m1, m2) of+ -- Constraint specifies, package provides+ (Just x1, Just x2) -> x1 == x2+ -- Package does not specifiy+ _ -> True++data Slot = Slot+ { unwrapSlot :: String+ , getSubSlot :: Maybe SubSlot+ }+ deriving stock (Show, Eq, Ord, Data, Generic)+ deriving anyclass Hashable++instance Printable Slot where+ toString (Slot s mss)+ = s+ ++ foldMap (\ss -> "/" ++ toString ss) mss++instance Stream s m Char => Parsable Slot m u s where+ parserName = "portage slot"+ parser = do+ s <- slotParser+ mss <- optionMaybe $ try $ char '/' *> parser+ pure $ Slot s mss++newtype SubSlot = SubSlot { unwrapSubSlot :: String }+ deriving stock (Show, Eq, Ord, Data, Generic)+ deriving newtype (IsString, Printable)+ deriving anyclass Hashable++instance Stream s m Char => Parsable SubSlot m u s where+ parserName = "portage sub-slot"+ parser = SubSlot <$> slotParser++slotParser :: Stream s m Char => ParsecT s u m String+slotParser = wordAllowed wordStart wordRest+ where+ wordStart =+ [ isAsciiUpper+ , isAsciiLower+ , isDigit+ , (== '_')+ ]+ wordRest = wordStart +++ [ (== '+')+ , (== '.')+ , (== '-')+ ]+++newtype Repository = Repository { unwrapRepository :: String }+ deriving stock (Show, Eq, Ord, Data, Generic)+ deriving newtype (IsString, Printable)+ deriving anyclass Hashable++instance Stream s m Char => Parsable Repository m u s where+ parserName = "portage repository"+ parser = Repository <$> pkgParser wordStart wordRest+ where+ wordStart =+ [ isAsciiUpper+ , isAsciiLower+ , isDigit+ , (== '_')+ ]++ wordRest = (== '-') : wordStart++data Package = Package+ { getCategory :: Category+ , getPkgName :: PkgName+ , getVersion :: Maybe Version+ , getSlot :: Maybe Slot+ , getRepository :: Maybe Repository+ }+ deriving stock (Show, Eq, Ord, Data, Generic)+ deriving anyclass Hashable++instance Printable Package where+ toString (Package c n mv ms mr)+ = toString c+ ++ "/"+ ++ toString n+ ++ foldMap (\v -> "-" ++ toString v) mv+ ++ foldMap (\s -> ":" ++ toString s) ms+ ++ foldMap (\r -> "::" ++ toString r) mr++instance Stream s m Char => Parsable Package m u s where+ parserName = "portage package"+ parser = do+ c <- parser+ _ <- char '/'+ n <- parser+ v <- optionMaybe $ try $ string "-" *> parser+ s <- optionMaybe $ try $ string ":" *> parser+ r <- optionMaybe $ try $ string "::" *> parser+ pure $ Package c n v s r++-- data EBuildFileName = EBuildFileName+-- { ebuildName :: PkgName+-- , ebuildVersion :: Version+-- }+-- deriving stock (Show, Eq, Ord, Data, Generic)+-- deriving anyclass Hashable+--+-- instance Printable EBuildFileName where+-- toString (EBuildFileName n v)+-- = toString n+-- ++ "-"+-- ++ toString v+-- ++ ".ebuild"+--+-- instance Stream s m Char => Parsable EBuildFileName m u s where+-- parserName = "portage ebuild file name"+-- parser = do+-- n <- parser+-- _ <- char '-'+-- v <- parser+-- _ <- string ".ebuild"+-- pure $ EBuildFileName n v++-- | A type of Version that also forms valid PkgName and Repository strings:+--+-- "[A PkgName] must not end in a hyphen followed by anything matching the [Version]+-- syntax"+-- <https://projects.gentoo.org/pms/8/pms.html#x1-180003.1.2>+newtype FauxVersion = FauxVersion+ { unwrapFauxVersion :: Version }+ deriving stock (Show, Eq, Ord, Data, Generic)+ deriving newtype Printable+ deriving anyclass Hashable++instance Stream s m Char => Parsable FauxVersion m u s where+ parserName = "faux portage version"+ parser = FauxVersion <$> versionParser (unwrapFauxVersionNum <$> parser)++-- | A type of VersionNum which always has one digit. This avoids having '.' in+-- the resulting string, as this is an invalid character for both PkgName and+-- Category.+newtype FauxVersionNum = FauxVersionNum+ { unwrapFauxVersionNum :: VersionNum }+ deriving stock (Show, Eq, Ord, Data, Generic)+ deriving newtype Printable+ deriving anyclass Hashable++instance Stream s m Char => Parsable FauxVersionNum m u s where+ parserName = "faux portage version number"+ parser = FauxVersionNum <$> versionNumParser id pure++versionParser :: Stream s m Char+ => ParsecT s u m VersionNum -> ParsecT s u m Version+versionParser pn = do+ n <- pn+ l <- optionMaybe $ try parser+ s <- many $ do+ _ <- char '_'+ ss <- parser+ sn <- optionMaybe $ try parser+ pure (ss, sn)+ r <- optionMaybe $ try $ string "-" *> parser+ pure $ Version n l s r++versionNumParser :: Stream s m Char+ => (ParsecT s u m [Char] -> ParsecT s u m [a])+ -> (NonEmpty a -> NonEmpty (NonEmpty Char))+ -> ParsecT s u m VersionNum+versionNumParser f g = do+ ns <- f $ some $ satisfy isDigit+ pure $ VersionNum $ g $ NE.fromList ns++-- | Both 'PkgName' and 'Repository' have similar parsers+pkgParser :: forall s u m. Stream s m Char+ => [Char -> Bool]+ -> [Char -> Bool]+ -> ParsecT s u m String+pkgParser wordStart wordRest = (:) <$> satisfyAny wordStart <*> goOrEnd+ where+ goOrEnd :: ParsecT s u m String+ goOrEnd = try go <|> end++ -- If 'fauxV' gives back a 'Nothing', it means the wole parse ended with+ -- a Version string and we need to throw the error 'e'.+ go :: ParsecT s u m String+ go = do+ m <- choice+ [ try fauxV+ , Just <$> nextChar -- 'fauxV' did not match at all :)+ ]+ maybe e pure m++ -- Check for a hyphen followed by something that parses as a 'FauxVersion'.+ -- If this is matched, but there isn't a successful 'go' parser after it,+ -- the parser aborts.+ fauxV :: ParsecT s u m (Maybe String)+ fauxV = do+ h <- char '-'+ v <- parser @FauxVersion+ choice+ [ try $ do+ rest <- go -- Don't accept 'end' as a choice at this point+ pure $ Just $ h : toString v ++ rest+ , abort+ ]++ nextChar :: ParsecT s u m String+ nextChar = do+ c <- satisfyAny wordRest+ rest <- goOrEnd+ pure $ c : rest++ end :: ParsecT s u m String+ end = pure ""++ -- 'show' is used here to wrap the string in quotes+ e :: ParsecT s u m String+ e = fail $+ "ends in a hyphen followed by anything "+ ++ "matching the version syntax"++ -- This is a trick to abort without jumping to the next 'Alternative'+ -- choice.+ abort :: Alternative f => f (Maybe a)+ abort = pure Nothing
+ src/Distribution/Portage/Emerge.hs view
@@ -0,0 +1,73 @@+++module Distribution.Portage.Emerge+ ( EmergeArgs+ , StdOut+ , StdErr+ , emergeExe+ , upgradeWorldArgs+ , singleArgs+ , pretendArgs+ , stripPackageVersion+ , emergeProcess+ ) where++import Data.Text (Text)+import qualified Data.Text as T+import System.Exit+import System.Process++import Data.Parsable+import Distribution.Portage.Types++type EmergeArgs = [String]+type StdOut = Text+type StdErr = Text+++emergeExe :: FilePath+emergeExe = "/usr/bin/emerge"++upgradeWorldArgs :: EmergeArgs+upgradeWorldArgs = commonEmergeArgs +++ [ "--deep"+ , "--changed-use"+ , "--update"+ , "--complete-graph"+ , "@world"+ ]++singleArgs :: [Package] -> EmergeArgs+singleArgs ps = commonEmergeArgs +++ [ "--oneshot"+ , "--complete-graph"+ ] +++ (packageString <$> ps)++pretendArgs :: EmergeArgs+pretendArgs = [ "--pretend" ]++-- | Add a @'='@ character to the front of the string if the version is+-- specified.+packageString :: Package -> String+packageString p@(Package _ _ v _ _) =+ let pre = case v of+ Just _ -> "="+ Nothing -> ""+ in pre ++ toString p++stripPackageVersion :: Package -> Package+stripPackageVersion (Package c n _ s r) = Package c n Nothing s r++commonEmergeArgs :: EmergeArgs+commonEmergeArgs =+ [ "--ignore-default-opts"+ , "--color=n"+ , "--nospinner"+ , "--verbose"+ ]++emergeProcess :: FilePath -> EmergeArgs -> IO (ExitCode, StdOut, StdErr)+emergeProcess p a = do+ (c, o, e) <- readProcessWithExitCode p a ""+ pure (c, T.pack o, T.pack e)
+ src/Distribution/Portage/Emerge/Parser.hs view
@@ -0,0 +1,87 @@+{-# Language ApplicativeDo #-}+{-# Language FlexibleContexts #-}+{-# Language LambdaCase #-}+{-# Language OverloadedStrings #-}+{-# Language ScopedTypeVariables #-}+{-# Language TypeFamilies #-}++module Distribution.Portage.Emerge.Parser+ ( emergeParser+ ) where++import Control.Applicative (some)+-- import Control.Monad.Combinators+import Data.Coerce+import Data.Monoid (Last(..))+-- import qualified Data.List.NonEmpty as NE+import qualified Data.Set as S+import Data.Set (Set)+-- import Text.Parsec.Language (haskell)+-- import Text.Parsec.Token (GenTokenParser(decimal))+import Text.Read (readMaybe)++import Data.Parsable hiding (space)+import Distribution.Portage.Types++-- | Returns a set of packages and the count as reported by the emerge output+emergeParser :: (Stream s m Char, Parsable Package m u s)+ => ParsecT s u m (Integer, Set Package)+emergeParser = do+ r <- sepEndBy lineParser newline+ case coerce $ foldMap go r of+ (Nothing, _) -> fail e+ (Just i , s) -> pure (i, s)+ where+ go :: EmergeLine -> (Last Integer, Set Package)+ go = coerce . \case+ PackageLine p -> (Nothing, S.singleton p)+ TotalLine i -> (Just i , S.empty )+ OtherLine -> (Nothing, S.empty )++ e :: String+ e = "emerge output contains a package total"++data EmergeLine+ = PackageLine Package+ | TotalLine Integer+ | OtherLine+ deriving (Show, Eq, Ord)+++lineParser :: (Stream s m Char, Parsable Package m u s)+ => ParsecT s u m EmergeLine+lineParser = choice+ [ PackageLine <$> try packageLine+ , TotalLine <$> try totalLine+ , OtherLine <$ skipRest+ ]++packageLine :: (Stream s m Char, Parsable Package m u s) => ParsecT s u m Package+packageLine = do+ _ <- space+ _ <- char '['+ _ <- many $ satisfy (\c -> c /= ']' && c /= '\n')+ _ <- char ']'+ _ <- space+ pkg <- parser+ _ <- space+ _ <- skipRest+ pure pkg++totalLine :: Stream s m Char => ParsecT s u m Integer+totalLine = do+ _ <- string "Total:"+ _ <- space+ ds <- some digit+ _ <- space+ _ <- string "packages"+ _ <- skipRest+ case readMaybe ds of+ Just n -> pure n+ Nothing -> fail $ "Could not parse as Integer: " ++ show ds++skipRest :: Stream s m Char => ParsecT s u m ()+skipRest = void $ many $ satisfy (/= '\n')++space :: Stream s m Char => ParsecT s u m ()+space = void $ many $ satisfy (\c -> c == ' ' || c == '\t')
+ src/Distribution/Portage/PkgDb.hs view
@@ -0,0 +1,20 @@+{-# Language FlexibleContexts #-}+{-# Language ScopedTypeVariables #-}++module Distribution.Portage.PkgDb+ ( PkgDbEntry(..)+ , pkgDbDirectory+ ) where++import System.FilePath.Posix++import Distribution.Portage.Types++data PkgDbEntry = PkgDbEntry+ { pkgDbEntryPackage :: Package+ , pkgDbEntryPath :: FilePath+ }+ deriving (Show, Eq, Ord)++pkgDbDirectory :: FilePath+pkgDbDirectory = "/var" </> "db" </> "pkg"
+ src/Distribution/Portage/PkgDb/Contents.hs view
@@ -0,0 +1,2 @@+module Distribution.Portage.PkgDb.Contents where+
+ src/Distribution/Portage/Types.hs view
@@ -0,0 +1,38 @@+{-|+Module : Distribution.Portage.Types++Types for Portage atoms, etc.+-}++{-# Language NoImplicitPrelude #-}++module Distribution.Portage.Types+ (+ -- * Types+ Package(..)+ , Category(..)+ , PkgName(..)+ , Slot(..)+ , SubSlot(..)+ , Repository(..)+ -- ** Versions+ , Version(..)+ , VersionNum(..)+ , VersionLetter(..)+ , VersionSuffix(..)+ , VersionSuffixNum(..)+ , VersionRevision(..)+ -- ** Constraints+ , ConstrainedDep(..)+ , toConstrainedDep+ , fromConstrainedDep+ , doesConstraintMatch+ , Operator(..)+ -- * Internal+ , FauxVersion(..)+ , FauxVersionNum(..)+ ) where++import Internal.Distribution.Portage.Types++
+ test/Emerge/GentooTests.hs view
@@ -0,0 +1,25 @@+{-# Language ScopedTypeVariables #-}++module Emerge.GentooTests (gentooTests) where++import qualified Data.Text.IO as T+import Test.Tasty+import Test.Tasty.HUnit++import Distribution.Portage.Emerge++gentooTests :: TestTree+gentooTests = testGroup "gentoo system tests"+ [ emergeWorldTest+ ]++-- | Emerge world "test". Currently just writes to+-- @/tmp/emerge-world-test.stdout@,+-- @/tmp/emerge-world-test.stderr@,+-- @/tmp/emerge-world-test.exitcode@+emergeWorldTest :: TestTree+emergeWorldTest = testCase "emerge world \"test\"" $ do+ (c, o, e) <- emergeProcess emergeExe $ upgradeWorldArgs ++ pretendArgs+ T.writeFile "/tmp/emerge-world-test.stdout" o+ T.writeFile "/tmp/emerge-world-test.stderr" e+ writeFile "/tmp/emerge-world-test.exitcode" $ show c
+ test/Emerge/ParserTests.hs view
@@ -0,0 +1,75 @@+{-# Language LambdaCase #-}+{-# Language TupleSections #-}++module Emerge.ParserTests+ ( parserTests+ ) where++import Conduit+import Data.Set (Set)+import qualified Data.Set as S+import qualified Data.Text.IO as T+import System.Directory+import System.FilePath+import Test.Tasty+import Test.Tasty.HUnit++import Data.Parsable+import Distribution.Portage.Types+import Distribution.Portage.Emerge+import Distribution.Portage.Emerge.Parser+import Test.Parsable++import Paths_portage_hs (getDataFileName)++parserTests :: IO TestTree+parserTests = do+ stdouts <- emergeStdOuts+ pure $ testGroup "test against recorded emerge output" $+ map (uncurry stdoutTest) stdouts++stdoutTest :: FilePath -> StdOut -> TestTree+stdoutTest d o =+ case ecis of+ Left e ->+ testCase d $ assertFailure $+ "Could not parse recorded emerge ouptut:\n"+ ++ "Error:\n" ++ show e+ Right (c, (i,ps)) -> testGroup d+ [ testCase "complete coverage" (checkPC c)+ , testCase "package count" (checkCount i ps)+ , testGroup "round-trip on extracted packages" $+ printableHUnit <$> S.toList ps+ ]+ where+ checkPC :: ParseCoverage -> Assertion+ checkPC = \case+ c@(PartialParse _) ->+ assertFailure $+ "Got a PartialParse when it should be a CompleteParse:\n"+ ++ show c ++ "\n"+ _ -> pure ()++ checkCount :: Integer -> Set Package -> Assertion+ checkCount i ps = assertEqual "reported package count should equal set size" (fromInteger i) (S.size ps)++ ecis :: Either ParseError (ParseCoverage, (Integer, Set Package))+ ecis = runParser (checkCoverage emergeParser) () f o++ f = "test" </> "data" </> d </> "emerge-world-test.stdout"++emergeStdOuts :: IO [(FilePath, StdOut)]+emergeStdOuts = do+ dataDir <- getDataFileName ("test" </> "data") >>= canonicalizePath+ runConduitRes+ $ sourceDirectoryDeep False dataDir+ .| filterC (\f -> takeFileName f == validFile)+ .| (await >>= mapM_ readFileC)+ .| sinkList+ where+ validFile = "emerge-world-test" <.> "stdout"++ readFileC :: FilePath -> ConduitT i (FilePath, StdOut) (ResourceT IO) ()+ readFileC f = do+ o <- liftIO $ T.readFile f+ yield (f, o)
+ test/Main.hs view
@@ -0,0 +1,45 @@+{-# Language CPP #-}++module Main (main) where++import Test.Tasty++import Test.Parsable++import qualified Emerge.ParserTests as Emerge+import qualified Types.ValidityTests as Types+import qualified Types.UnitTests as Types+#if defined(GENTOO_TESTS)+import qualified Emerge.GentooTests as Emerge+import qualified PkgDb.GentooTests as PkgDb+import qualified Types.GentooTests as Types+#endif++main :: IO ()+main = do+ typesTests <- sequenceA+ [ atomically Types.validityTests+ , pure Types.unitTests+#if defined(GENTOO_TESTS)+ , Types.gentooTests+#endif+ ]++ emergeTests <- sequenceA+ [ Emerge.parserTests+#if defined(GENTOO_TESTS)+-- , pure Emerge.gentooTests+#endif+ ]++ let pkgDBTests = [+#if defined(GENTOO_TESTS)+-- PkgDb.gentooTests+#endif+ ]++ defaultMain $ testGroup "portage-hs tests"+ [ testGroup "portage types" typesTests+ , testGroup "emerge" emergeTests+ , testGroup "pkgdb" pkgDBTests+ ]
+ test/PkgDb/GentooTests.hs view
@@ -0,0 +1,15 @@++module PkgDb.GentooTests+ where+-- ( gentooTests+-- ) where++import Distribution.Portage.PkgDb++import Test.Tasty+import Test.Tasty.HUnit+import Text.Pretty.Simple++-- gentooTests :: TestTree+-- gentooTests = testCase "walk /var/db/pkg" $+-- pkgDbEntries >>= pPrintForceColor
+ test/Types/GentooTests.hs view
@@ -0,0 +1,79 @@+{-# Language ScopedTypeVariables #-}+{-# Language TypeApplications #-}++{-# Options_GHC -Wno-deprecations #-} -- Don't nag me about ListT++module Types.GentooTests (gentooTests) where++import Control.Applicative+import Control.Monad.Trans.Class+import Control.Monad.Trans.List+import Data.Proxy+import System.Directory+import System.FilePath.Posix+import Test.Tasty+import Test.Tasty.HUnit++import Internal.Distribution.Portage.Types+import Data.Parsable+import Test.Parsable++gentooTests :: IO TestTree+gentooTests = testGroup "strings from live Gentoo system" <$> sequenceA+ [ gentooParseTests "/var/db/repos parse tests" <$> repoTree+ , gentooParseTests "/var/db/pkg parse tests" <$> pkgTree+ ]++-- | Check all package atoms and make sure they are parsed successfully and+-- pass the "roundtrip" test.+gentooParseTests :: TestName -> [String] -> TestTree+gentooParseTests n pkgStrings = testGroup n $+ parsableHUnit (Proxy @Package) <$> pkgStrings++-- | Scan the entire @/var/db/repos@ tree for ebuilds and form these into+-- pacakge atoms.+repoTree :: IO [String]+repoTree = runListT $ do+ let reposDir = "/var/db/repos"+ checkDir reposDir $ do++ repo <- listDir reposDir+ cat <- listDir $ reposDir </> repo+ n <- listDir $ reposDir </> repo </> cat+ eb <- listDir $ reposDir </> repo </> cat </> n++ let (nv,ext) = splitExtension eb++ guard $ ext == ".ebuild"++ pure $ cat ++ "/" ++ nv ++ "::" ++ repo++-- | Scan the entire @/var/db/pkg@ tree for package atoms in the form+-- @<category>/<pkg-name>-<version>@. This is inherently part of the directory+-- structure inside @/var/db/pkg@.+pkgTree :: IO [String]+pkgTree = runListT $ do+ let portagePkgDir = "/var/db/pkg"+ checkDir portagePkgDir $ do++ cat <- listDir portagePkgDir -- Scan for categories+ nv <- listDir $ portagePkgDir </> cat -- Scan for names/versions++ case nv of+ '.' : _ -> empty+ '-' : _ -> empty+ [] -> empty+ _ -> pure $ cat ++ "/" ++ nv++listDir :: FilePath -> ListT IO FilePath+listDir d = do+ lift (doesDirectoryExist d) >>= guard+ ListT $ listDirectory d++checkDir :: FilePath -> ListT IO a -> ListT IO a+checkDir d rest = do+ b <- lift $ doesDirectoryExist d+ if b+ then rest+ else lift $ assertFailure $+ show d ++ " is not a directory. Is this really a Gentoo system?"
+ test/Types/UnitTests.hs view
@@ -0,0 +1,214 @@+{-# Language FlexibleContexts #-}+{-# Language ScopedTypeVariables #-}+{-# Language TypeApplications #-}++module Types.UnitTests (unitTests) where++import Data.List.NonEmpty (NonEmpty(..))+import Test.Tasty+import Test.Tasty.HUnit++import Internal.Distribution.Portage.Types+import Data.Parsable+import Test.Parsable++unitTests :: TestTree+unitTests = testGroup "unit tests"+ [ testGroup "basic tests"+ [ "dev-python/nose" `parserTest`+ Package+ (Category "dev-python")+ (PkgName "nose")+ Nothing+ Nothing+ Nothing+ , "dev-python/nose-1" `parserTest`+ Package+ (Category "dev-python")+ (PkgName "nose")+ (Just (Version+ (VersionNum (('1':|[]):|[]))+ Nothing+ []+ Nothing+ ))+ Nothing+ Nothing+ , "dev-python/nose-1.23a-r123" `parserTest`+ Package+ (Category "dev-python")+ (PkgName "nose")+ (Just (Version+ (VersionNum (('1':|[]):|['2':|"3"]))+ (Just (VersionLetter 'a'))+ []+ (Just (VersionRevision ('1':|"23")))+ ))+ Nothing+ Nothing+ , "dev-python/nose:1337" `parserTest`+ Package+ (Category "dev-python")+ (PkgName "nose")+ Nothing+ (Just (Slot "1337" Nothing))+ Nothing+ , "dev-python/nose::uberRepo" `parserTest`+ Package+ (Category "dev-python")+ (PkgName "nose")+ Nothing+ Nothing+ (Just (Repository "uberRepo"))+ , "dev-python/nose-1.23a-r123:1337::uberRepo" `parserTest`+ Package+ (Category "dev-python")+ (PkgName "nose")+ (Just (Version+ (VersionNum (('1':|[]):|['2':|"3"]))+ (Just (VersionLetter 'a'))+ []+ (Just (VersionRevision ('1':|"23")))+ ))+ (Just (Slot "1337" Nothing))+ (Just (Repository "uberRepo"))+ , "=dev-python/nose-1.23*:1337::uberRepo" `parserTest`+ ConstrainedDep+ EqualAsterisk+ (Category "dev-python")+ (PkgName "nose")+ (Version+ (VersionNum (('1':|[]):|['2':|"3"]))+ Nothing+ []+ Nothing+ )+ (Just (Slot "1337" Nothing))+ (Just (Repository "uberRepo"))+ ]+ , testGroup "tricky tests"+ [ "dev-python/nose-1.3.7_p20211111_p1" `parserTest`+ Package+ (Category "dev-python")+ (PkgName "nose")+ (Just (Version+ (VersionNum+ (('1':|[]) :| ['3':|[],'7':|[]])+ )+ Nothing+ [ (SuffixP, Just (VersionSuffixNum ('2' :| "0211111")))+ , (SuffixP, Just (VersionSuffixNum ('1' :| [])))+ ]+ Nothing+ ))+ Nothing+ Nothing+ , "app-text/xdvik-22.87.03-r3" `parserTest`+ Package+ (Category "app-text")+ (PkgName "xdvik")+ (Just (Version+ (VersionNum+ (('2':|"2") :|+ ['8':|"7"+ ,'0':|"3"+ ]+ )+ )+ Nothing+ []+ (Just (VersionRevision ('3':|[])))+ ))+ Nothing+ Nothing+ , "dev-java/log4j-12-api-2.17.2" `parserTest`+ Package+ (Category "dev-java")+ (PkgName "log4j-12-api")+ (Just (Version+ (VersionNum+ (('2':|[]) :|+ ['1':|"7"+ ,'2':|[]+ ]+ )+ )+ Nothing+ []+ Nothing+ ))+ Nothing+ Nothing+ , "sec-keys/openpgp-keys-gawk-20220407" `parserTest`+ Package+ (Category "sec-keys")+ (PkgName "openpgp-keys-gawk")+ (Just (Version+ (VersionNum (('2':|"0220407"):|[]))+ Nothing+ []+ Nothing+ ))+ Nothing+ Nothing+ , "app-derp/f--98---54.321x_pre1:gawk--::goo" `parserTest`+ Package+ (Category "app-derp")+ (PkgName "f--98--")+ (Just (Version+ (VersionNum (('5':|"4") :| ['3':|"21"]))+ (Just (VersionLetter 'x'))+ [ (SuffixPre, Just (VersionSuffixNum ('1' :| []))) ]+ Nothing+ ))+ (Just (Slot "gawk--" Nothing))+ (Just (Repository "goo"))+ , "app-office/hledger-web-1.26.1:0/1.26.1::haskell" `parserTest`+ Package+ (Category "app-office")+ (PkgName "hledger-web")+ (Just (Version+ (VersionNum (('1':|[]) :| ['2':|"6", '1':|[]]))+ Nothing+ []+ Nothing+ ))+ (Just (Slot "0" (Just (SubSlot "1.26.1"))))+ (Just (Repository "haskell"))+ ]+ , testGroup "failed QuickCheck tests"+ [ "7-r2b" `parserTest` Repository "7-r2b"+ , "7-r2b" `parserTest` PkgName "7-r2b"+ , "1.3.7_p20211111_p1" `parserTest` Version+ (VersionNum+ (('1':|[]) :| ['3':|[],'7':|[]])+ )+ Nothing+ [ (SuffixP, Just (VersionSuffixNum ('2' :| "0211111")))+ , (SuffixP, Just (VersionSuffixNum ('1' :| [])))+ ]+ Nothing+ , "p" `parserTest` SuffixP+-- , "7-r4-8y-r3-o-7-r0-a-4.ebuild" `parserTest` EBuildFileName+-- (PkgName "7-r4-8y-r3-o-7-r0-a")+-- (Version+-- (VersionNum+-- (('4' :| "") :| [])+-- )+-- Nothing+-- []+-- Nothing+-- )+ ]+ ]++-- Takes a string and an expected result, and creates a TestTree from them+parserTest :: forall a.+ ( Parsable a Identity () String+ , Eq a+ , Show a+ ) => String+ -> a+ -> TestTree+parserTest s x = testCase (show s) $+ Right (CompleteParse, x) @=? runParser (checkParsable @a) () "" s
+ test/Types/ValidityTests.hs view
@@ -0,0 +1,277 @@+{-# Language LambdaCase #-}+{-# Language TypeApplications #-}+{-# Language ViewPatterns #-}++{-# Options_GHC -Wno-orphans #-}++module Types.ValidityTests (validityTests) where++import Data.Either (isLeft)+import qualified Data.List as L+import qualified Data.List.NonEmpty as NE+import Data.Proxy+import GHC.Natural+import Test.QuickCheck+import Test.Tasty++import Data.Parsable+import Test.Parsable+import Internal.Distribution.Portage.Types+++validityTests :: STM TestTree+validityTests =+ testGroup "parsable validity tests" <$> sequenceA+ [ parsableQuickCheck (Proxy @Category)+ , parsableQuickCheck (Proxy @PkgName)+ , parsableQuickCheck (Proxy @VersionNum)+ , parsableQuickCheck (Proxy @VersionLetter)+ , parsableQuickCheck (Proxy @VersionSuffix)+ , parsableQuickCheck (Proxy @VersionSuffixNum)+ , parsableQuickCheck (Proxy @VersionRevision)+ , parsableQuickCheck (Proxy @Version)+-- , parsableQuickCheck (Proxy @Operator) -- lossy round-trip+ , parsableQuickCheck (Proxy @ConstrainedDep)+ , parsableQuickCheck (Proxy @Slot)+ , parsableQuickCheck (Proxy @SubSlot)+ , parsableQuickCheck (Proxy @Repository)+ , parsableQuickCheck (Proxy @Package)+-- , parsableQuickCheck (Proxy @EBuildFileName) -- removed+ , parsableQuickCheck (Proxy @FauxVersion)+ , parsableQuickCheck (Proxy @FauxVersionNum)+ ]++-- Arbitrary instances --+-- Based off Gentoo PMS 8 --++instance Arbitrary Natural where+ arbitrary = arbitrarySizedNatural++-- > 3.1.1 Category names+-- > A category name may contain any of the characters [A-Za-z0-9+_.-].+-- > It must not begin with a hyphen, a dot or a plus sign.+instance Arbitrary Category where+ arbitrary = Category <$> wordGen wordStart wordRest+ where+ wordStart =+ [ isAsciiUpper+ , isAsciiLower+ , isDigit+ , (== '_')+ ]+ wordRest = (== '+') : (== '-') : (== '.') : wordStart++-- > 3.1.2 Package names+-- > A package name may contain any of the characters [A-Za-z0-9+_-]. It must+-- > not begin with a hyphen or a plus sign, and must not end in a hyphen+-- > followed by anything matching the version syntax described in section 3.2.+-- >+-- > Note: A package name does not include the category. The term qualified+-- > package name is used where a category/package pair is meant.+instance Arbitrary PkgName where+ arbitrary = PkgName <$> pkgGen wordStart wordRest+ where+ wordStart = [isAsciiUpper, isAsciiLower, isDigit, (== '_')]+ wordRest = (== '+') : (== '-') : wordStart++-- > 3.1.3 Slot names+-- > A slot name may contain any of the characters [A-Za-z0-9+_.-].+-- > It must not begin with a hyphen, a dot or a plus sign.+instance Arbitrary Slot where+ arbitrary = Slot+ <$> slotGen+ <*> liftArbitrary arbitrary++instance Arbitrary SubSlot where+ arbitrary = SubSlot <$> slotGen++slotGen :: Gen String+slotGen = wordGen wordStart wordRest+ where+ wordStart =+ [ isAsciiUpper+ , isAsciiLower+ , isDigit+ , (== '_')+ ]+ wordRest = wordStart +++ [ (== '+')+ , (== '.')+ , (== '-')+ ]+++-- TODO+-- > 3.1.4 USE flag names+-- > A USE flag name may contain any of the characters [A-Za-z0-9+_@-].+-- > It must begin with an alphanumeric character. Underscores should be+-- > considered reserved for USE_EXPAND, as described in section 11.1.1.+-- >+-- > Note: Usage of the at-sign is deprecated. It was previously required for+-- > LINGUAS.+++-- > 3.1.5 Repository names+-- > A repository name may contain any of the characters [A-Za-z0-9_-].+-- > It must not begin with a hyphen. In addition, every repository+-- > name must also be a valid package name.+instance Arbitrary Repository where+ arbitrary = Repository <$> pkgGen wordStart wordRest+ where+ wordStart =+ [ isAsciiUpper+ , isAsciiLower+ , isDigit+ , (== '_')+ ]+ wordRest = (== '-') : wordStart+++-- TODO+-- > 3.1.6 License names+-- > A license name may contain any of the characters [A-Za-z0-9+_.-].+-- > It must not begin with a hyphen, a dot or a plus sign.+++-- TODO+-- > 3.1.7 Keyword names+-- > A keyword name may contain any of the characters [A-Za-z0-9_-].+-- > It must not begin with a hyphen. In contexts where it makes sense to do so,+-- > a keyword name may be prefixed by a tilde or a hyphen.+-- > In KEYWORDS, -* is also acceptable as a keyword.+++-- TODO+-- > 3.1.8 EAPI names+-- > An EAPI name may contain any of the characters [A-Za-z0-9+_.-].+-- > It must not begin with a hyphen, a dot or a plus sign.+++-- > 3.2 Version Specifications+-- > The package manager must neither impose fixed limits upon the number of+-- > version components, nor upon the length of any component. Package managers+-- > should indicate or reject any version that is invalid according to the+-- > rules below.++-- > A version starts with the number part, which is in the form+-- > [0-9]+(\.[0-9]+)* (an unsigned integer, followed by zero or more+-- > dot-prefixed unsigned integers).+instance Arbitrary VersionNum where+ arbitrary = VersionNum <$> nonEmptyGen nonEmptyDigitGen++-- > This may optionally be followed by one of [a-z] (a lowercase letter).+instance Arbitrary VersionLetter where+ arbitrary = VersionLetter <$> arbitrary `suchThat` isAsciiLower++-- > This may be followed by zero or more of the suffixes+-- > _alpha, _beta, _pre, _rc or _p [...]+instance Arbitrary VersionSuffix where+ arbitrary = arbitraryBoundedEnum++-- > [...] each of which may optionally be followed by an unsigned integer.+-- > Suffix and integer count as separate version components.+instance Arbitrary VersionSuffixNum where+ arbitrary = VersionSuffixNum <$> nonEmptyDigitGen++-- > This may optionally be followed by the suffix -r followed immediately by an+-- > unsigned integer (the “revision number”). If this suffix is not present, it+-- > is assumed to be -r0.+instance Arbitrary VersionRevision where+ arbitrary = VersionRevision <$> nonEmptyDigitGen++-- The composite of an entire version string+instance Arbitrary Version where+ arbitrary = Version+ <$> arbitrary+ <*> liftArbitrary arbitrary+ <*> liftArbitrary (liftArbitrary arbitrary)+ <*> liftArbitrary arbitrary++instance Arbitrary Operator where+ arbitrary = arbitraryBoundedEnum++instance Arbitrary ConstrainedDep where+ arbitrary = ConstrainedDep+ <$> arbitrary+ <*> arbitrary+ <*> arbitrary+ <*> arbitrary+ <*> liftArbitrary arbitrary+ <*> liftArbitrary arbitrary++-- The composite of an entire package atom+instance Arbitrary Package where+ arbitrary = Package+ <$> arbitrary+ <*> arbitrary+ <*> liftArbitrary arbitrary+ <*> liftArbitrary arbitrary+ <*> liftArbitrary arbitrary++-- instance Arbitrary EBuildFileName where+-- arbitrary = EBuildFileName+-- <$> arbitrary+-- <*> arbitrary++-- Generates version numbers with exactly one component. For use with+-- FauxVersion.+instance Arbitrary FauxVersionNum where+ arbitrary = FauxVersionNum . VersionNum . pure <$> nonEmptyDigitGen++-- Generates Versions that are both valid Versions and also valid+-- parts of PkgNames. This helps test the critera from "3.1.2 Package names":+--+-- > It [...] must not end in a hyphen followed by anything matching the+-- > version syntax described in section 3.2.+instance Arbitrary FauxVersion where+ arbitrary = fmap FauxVersion $ Version+ <$> (unwrapFauxVersionNum <$> arbitrary)+ <*> liftArbitrary arbitrary+ <*> liftArbitrary (liftArbitrary arbitrary)+ <*> liftArbitrary arbitrary++nonEmptyGen :: Gen a -> Gen (NE.NonEmpty a)+nonEmptyGen = fmap NE.fromList . listOf1++nonEmptyDigitGen :: Gen (NE.NonEmpty Char)+nonEmptyDigitGen = nonEmptyGen $ arbitrary `suchThat` isDigit++-- | PkgName and Repository share a similar generator+pkgGen :: [Char -> Bool] -> [Char -> Bool] -> Gen String+pkgGen+ (removeHyphens -> wordStart)+ (removeHyphens -> wordRest ) = do+ ls <- oneof+ [ do+ s <- oneof startChoices+ -- This generator can get out of hand if we don't limit the size+ -- of the list+ k <- choose (0,5)+ rest <- vectorOf k $ oneof restChoices+ pure $ s : rest+ , pure []+ ]+ end <- nonVersion+ pure $ L.intercalate "-" $ ls ++ [end]+ where+ nonVersion =+ wordGen wordStart wordRest+ `suchThat` (isLeft . runParsable @Version "")++ -- Don't start with @pure ""@ or it will end up creating a string that+ -- starts with @'-'@ (an invalid Package/Repository string)+ startChoices =+ [ nonVersion+-- Currently not behaving correctly; we're getting invalid package/repository names+-- , toString . unwrapFauxVersion <$> arbitrary+ ]++ restChoices = pure "" : startChoices++-- Sometimes hyphens are handled specially and should not be generated with+-- 'wordGen'. This removes hyphens which would normally be generated when+-- following specifcations.+removeHyphens :: [Char -> Bool] -> [Char -> Bool]+removeHyphens = map $ \f -> \case+ '-' -> False+ c -> f c
+ test/data/2022-07-16/emerge-world-test.stdout view
@@ -0,0 +1,463 @@++These are the packages that would be merged, in order:++Calculating dependencies ...... ..... .. .. ..... done!+[ebuild R ~] dev-haskell/th-abstraction-0.4.2.0:0/0.4.2.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/file-embed-0.0.15.0:0/0.0.15.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/inspection-testing-0.4.5.0:0/0.4.5.0::haskell USE="doc hoogle hscolour test -profile" 22 KiB+[ebuild N ~] dev-haskell/nanospec-0.2.2:0/0.2.2::haskell USE="doc hoogle hscolour -profile" 4 KiB+[ebuild R ~] dev-haskell/some-1.0.4:0/1.0.4::haskell USE="doc hoogle hscolour newtype-unsafe test* -profile" 0 KiB+[ebuild R ~] dev-haskell/singletons-3.0.1:0/3.0.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/hostname-1.0-r1:0/1.0::haskell USE="doc hoogle hscolour -profile" 2 KiB+[ebuild R ~] dev-haskell/ghc-byteorder-4.11.0.0.10:0/4.11.0.0.10::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/simple-reflect-0.3.3:0/0.3.3::haskell USE="doc hoogle hscolour -profile" 5 KiB+[ebuild R ~] dev-haskell/first-class-families-0.8.0.1:0/0.8.0.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/generic-monoid-0.1.0.1:0/0.1.0.1::haskell USE="doc hoogle hscolour -profile" 4 KiB+[ebuild N ~] dev-haskell/code-page-0.2.1:0/0.2.1::haskell USE="doc hoogle hscolour test -profile" 7 KiB+[ebuild N ~] dev-haskell/pretty-hex-1.1:0/1.1::haskell USE="doc hoogle hscolour -profile" 4 KiB+[ebuild N ~] dev-haskell/sop-core-0.5.0.2:0/0.5.0.2::haskell USE="doc hoogle hscolour -profile" 28 KiB+[ebuild N ~] dev-haskell/patience-0.1.1-r1:0/0.1.1::haskell USE="doc hoogle hscolour -profile" 5 KiB+[ebuild N ~] dev-haskell/monads-tf-0.1.0.3:0/0.1.0.3::haskell USE="doc hoogle hscolour -profile" 14 KiB+[ebuild R ~] dev-haskell/lift-type-0.1.0.1:0/0.1.0.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/groups-0.5.3:0/0.5.3::haskell USE="doc hoogle hscolour -profile" 4 KiB+[ebuild N ~] dev-haskell/prettyclass-1.0.0.0-r1:0/1.0.0.0::haskell USE="doc hoogle hscolour -profile" 2 KiB+[ebuild N ~] dev-haskell/dec-0.0.4:0/0.0.4::haskell USE="doc hoogle hscolour -profile" 3 KiB+[ebuild N ~] dev-haskell/managed-1.0.9:0/1.0.9::haskell USE="doc hoogle hscolour -profile" 6 KiB+[ebuild N ~] dev-haskell/optional-args-1.0.2-r2:0/1.0.2::haskell USE="doc hoogle hscolour -profile" 4 KiB+[ebuild N ~] dev-haskell/ieee754-0.8.0:0/0.8.0::haskell USE="doc hoogle hscolour -profile" 18 KiB+[ebuild R ~] dev-haskell/compact-0.2.0.0:0/0.2.0.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/named-0.3.0.1:0/0.3.0.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/show-combinators-0.2.0.0:0/0.2.0.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/utf8-light-0.4.2:0/0.4.2::haskell USE="doc hoogle hscolour -profile" 6 KiB+[ebuild R ~] dev-haskell/js-dgtable-0.5.2:0/0.5.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/call-stack-0.3.0:0/0.3.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/th-lift-0.8.2:0/0.8.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/microlens-th-0.4.3.10:0/0.4.3.10::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/generics-sop-0.5.1.1:0/0.5.1.1::haskell USE="doc hoogle hscolour test -profile" 30 KiB+[ebuild N ~] dev-haskell/options-1.2.1.1:0/1.2.1.1::haskell USE="doc hoogle hscolour -profile" 25 KiB+[ebuild N ~] dev-haskell/singleton-bool-0.1.5-r1:0/0.1.5::haskell USE="doc hoogle hscolour -profile" 4 KiB+[ebuild R ~] dev-haskell/ap-normalize-0.1.0.1:0/0.1.0.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/quickcheck-2.14.2-r1:2/2.14.2::haskell USE="doc hoogle hscolour template-haskell test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hunit-1.6.2.0:0/1.6.2.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/chell-0.4.0.2:0/0.4.0.2::haskell USE="color-output doc hoogle hscolour -profile" 13 KiB+[ebuild R ~] dev-haskell/unagi-chan-0.4.1.3:0/0.4.1.3::haskell USE="doc hoogle hscolour test* -compare-benchmarks -profile" 0 KiB+[ebuild R ~] dev-haskell/optics-th-0.4:0/0.4::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/optparse-applicative-0.16.1.0-r1:0/0.16.1.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/utf8-string-1.0.2:0/1.0.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/safe-0.3.19:0/0.3.19::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/dlist-1.0:0/1.0::haskell USE="doc hoogle hscolour test* -profile -werror" 0 KiB+[ebuild R ~] dev-haskell/split-0.2.3.4:0/0.2.3.4::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hspec-expectations-0.8.2:0/0.8.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/tagsoup-0.14.8:0/0.14.8::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/emojis-0.1.2:0/0.1.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/utility-ht-0.0.14:0/0.0.14::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/string-qq-0.0.4:0/0.0.4::haskell USE="doc hoogle hscolour test -profile" 2 KiB+[ebuild R ~] dev-haskell/raw-strings-qq-1.1:0/1.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/pcre-light-0.4.1.0:0/0.4.1.0::haskell USE="doc hoogle hscolour test -profile" 29 KiB+[ebuild N ~] dev-haskell/selective-0.5:0/0.5::haskell USE="doc hoogle hscolour test -profile" 34 KiB+[ebuild R ~] dev-haskell/pqueue-1.4.1.4:0/1.4.1.4::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/quickcheck-text-0.1.2.1:0/0.1.2.1::haskell USE="doc hoogle hscolour test -profile" 4 KiB+[ebuild R ~] dev-haskell/regex-tdfa-1.3.1.1:0/1.3.1.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/hspec-meta-2.9.3:0/2.9.3::haskell USE="doc hoogle hscolour -profile" 68 KiB+[ebuild U ] dev-libs/openssl-1.1.1q:0/1.1::gentoo [1.1.1o:0/1.1::gentoo] USE="asm sctp verify-sig -rfc3779 -sslv3 -static-libs -test -tls-compression -tls-heartbeat -vanilla -weak-ssl-ciphers" ABI_X86="32 (64) (-x32)" CPU_FLAGS_X86="(sse2)" 9,634 KiB+[ebuild R ] dev-lang/python-3.10.5:3.10::gentoo USE="bluetooth gdbm hardened* libedit lto ncurses pgo readline sqlite ssl tk verify-sig xml -build -examples -test -wininst" 0 KiB+[ebuild R ] dev-lang/python-3.8.13_p2:3.8::gentoo USE="bluetooth gdbm hardened* ncurses readline sqlite ssl tk verify-sig xml -build -examples -test -wininst" 0 KiB+[ebuild U ] dev-python/setuptools-62.6.0::gentoo [62.3.3::gentoo] USE="-test" PYTHON_TARGETS="python3_8 python3_10 (-pypy3) -python3_9 (-python3_11)" 2,539 KiB+[ebuild U ] sys-apps/systemd-251.2:0/2::gentoo [250.7:0/2::gentoo] USE="acl apparmor audit cryptsetup dns-over-tls gcrypt http idn kmod lz4 lzma openssl pam pcre (policykit) qrcode resolvconf seccomp (split-usr) sysv-utils xkb zstd -build -cgroup-hybrid -curl -elfutils -fido2 -gnuefi -gnutls -homed -importd -iptables -pkcs11 -pwquality (-selinux) -test -tpm -vanilla (-hostnamed-fallback%)" ABI_X86="32 (64) (-x32)" 11,167 KiB+[ebuild U ] dev-python/docutils-0.18.1-r1::gentoo [0.17.1-r1::gentoo] PYTHON_TARGETS="python3_8 python3_10 (-pypy3) -python3_9 (-python3_11)" 0 KiB+[ebuild U ] net-libs/rpcsvc-proto-1.4.3-r1::gentoo [1.4.3::gentoo] 165 KiB+[ebuild R ] dev-lang/python-3.9.13:3.9::gentoo USE="bluetooth gdbm hardened* lto ncurses pgo readline sqlite ssl tk verify-sig xml -build -examples -test -wininst" 0 KiB+[ebuild N ] dev-ruby/mini_portile2-2.8.0:2.8::gentoo USE="-doc -test" RUBY_TARGETS="ruby27 -ruby26 -ruby30 -ruby31" 0 KiB+[ebuild N ~] dev-ruby/rexical-1.0.7-r1::gentoo USE="-doc -test" RUBY_TARGETS="ruby27 -ruby26 -ruby30 -ruby31" 0 KiB+[ebuild U ] sys-apps/pciutils-3.8.0-r1::gentoo [3.8.0::gentoo] USE="kmod udev zlib -dns -static-libs" ABI_X86="32 (64) (-x32)" 0 KiB+[ebuild U ] dev-python/PyQt5-sip-12.10.1:0/12::gentoo [12.9.0:0/12::gentoo] PYTHON_TARGETS="python3_8 python3_10 -python3_9 (-python3_11)" 119 KiB+[ebuild U ] app-eselect/eselect-timidity-20110513-r1::gentoo [20110513::gentoo] 0 KiB+[ebuild R ~] dev-haskell/happy-1.20.0::haskell USE="doc test*" 0 KiB+[ebuild R ~] dev-haskell/alex-3.2.7.1::haskell USE="doc test*" 0 KiB+[ebuild R ~] dev-haskell/config-value-0.8.1:0/0.8.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ] dev-util/spirv-headers-1.3.211::gentoo 0 KiB+[ebuild R ~] dev-haskell/postgresql-libpq-0.9.4.3-r1:0/0.9.4.3::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild U ~] dev-ruby/nokogiri-1.13.7::gentoo [1.13.6::gentoo] USE="-doc -test" RUBY_TARGETS="ruby27 -ruby26 -ruby30 -ruby31" 6,105 KiB+[ebuild U ] www-client/brave-bin-1.41.96::brave-overlay [1.41.94::brave-overlay] USE="-gnome-keyring" L10N="en-US -am -ar -bg -bn -ca -cs -da -de -el -en-GB -es -es-419 -et -fa -fi -fil -fr -gu -he -hi -hr -hu -id -it -ja -kn -ko -lt -lv -ml -mr -ms -nb -nl -pl -pt-BR -pt-PT -ro -ru -sk -sl -sr -sv -sw -ta -te -th -tr -uk -vi -zh-CN -zh-TW" 131,689 KiB+[ebuild U ] media-libs/phonon-4.11.1-r2::gentoo [4.11.1-r1::gentoo] USE="designer gstreamer pulseaudio vlc -debug" 0 KiB+[ebuild U ] dev-python/sphinx-5.0.2::gentoo [4.5.0-r1::gentoo] USE="latex -doc -test" PYTHON_TARGETS="python3_8 python3_10 (-pypy3) -python3_9 (-python3_11)" 6,572 KiB+[ebuild U ] net-fs/cifs-utils-6.15::gentoo [6.13-r1::gentoo] USE="acl ads caps pam python systemd -creds" PYTHON_SINGLE_TARGET="python3_10 -python3_8 -python3_9 (-python3_11)" 407 KiB+[ebuild N ] media-sound/strawberry-1.0.5::gentoo USE="cdda gstreamer mtp pulseaudio udisks vlc -debug -ipod -moodbar" 10,950 KiB+[ebuild R ~] dev-haskell/tasty-quickcheck-0.10.1.2:0/0.10.1.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/syb-0.7.2.1:0/0.7.2.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/lua-2.1.0:0/2.1.0::haskell USE="allow-unsafe-gc doc export-dynamic hardcode-reg-keys hoogle hscolour test* -apicheck -lua-32bits -profile" 0 KiB+[ebuild R ~] dev-haskell/monad-loops-0.4.3:0/0.4.3::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/wl-pprint-annotated-0.1.0.1-r1:0/0.1.0.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/logict-0.7.0.3:0/0.7.0.3::haskell USE="doc hoogle hscolour test -profile" 6 KiB+[ebuild N ~] dev-haskell/tasty-travis-0.2.0.2:0/0.2.0.2::haskell USE="doc hoogle hscolour test -profile" 8 KiB+[ebuild R ~] dev-haskell/jira-wiki-markup-1.4.0:0/1.4.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/doctest-0.20.0:0/0.20.0::haskell USE="doc hoogle hscolour -profile" 50 KiB+[ebuild R ~] dev-haskell/zlib-0.6.2.3:0/0.6.2.3::haskell USE="doc hoogle hscolour test* -bundled-c-zlib -non-blocking-ffi -profile" 0 KiB+[ebuild R ~] dev-haskell/cookie-0.4.5:0/0.4.5::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hourglass-0.2.12:0/0.2.12::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/lua-arbitrary-1.0.1:0/1.0.1::haskell USE="doc hoogle hscolour -profile" 3 KiB+[ebuild R ~] dev-haskell/rope-utf16-splay-0.3.2.0:0/0.3.2.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/tasty-kat-0.0.3:0/0.0.3::haskell USE="doc hoogle hscolour test -profile" 7 KiB+[ebuild R ~] dev-haskell/hsyaml-0.2.1.1:0/0.2.1.1::haskell USE="doc hoogle hscolour test* -exe -profile" 0 KiB+[ebuild R ~] dev-haskell/th-expand-syns-0.4.8.0:0/0.4.8.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/lpeg-1.0.3:0/1.0.3::haskell USE="doc hoogle hscolour test* -profile -rely-on-shared-lpeg-library" 0 KiB+[ebuild N ~] dev-haskell/haskell-src-1.0.3.1:0/1.0.3.1::haskell USE="doc hoogle hscolour -profile" 30 KiB+[ebuild R ~] dev-haskell/ghc-source-gen-0.4.2.0:0/0.4.2.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/asn1-encoding-0.9.6:0/0.9.6::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/th-reify-many-0.1.9:0/0.1.9::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/foundation-0.0.26.1:0/0.0.26.1::haskell USE="doc hoogle hscolour test* -experimental -profile" 0 KiB+[ebuild R ~] dev-haskell/network-byte-order-0.1.6:0/0.1.6::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/type-errors-0.2.0.0:0/0.2.0.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/pcg-random-0.1.3.7:0/0.1.3.7::haskell USE="doc hoogle hscolour test -profile" 25 KiB+[ebuild R ~] dev-haskell/memory-0.15.0:0/0.15.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/crypto-pubkey-types-0.4.3:0/0.4.3::haskell USE="doc hoogle hscolour -profile" 11 KiB+[ebuild R ~] dev-haskell/cryptonite-0.28-r1:0/0.28::haskell USE="doc hoogle hscolour integer-gmp target-attributes test* -profile" CPU_FLAGS_X86="sse -aes -rdrand -sse4_1" 0 KiB+[ebuild R ~] dev-haskell/uuid-types-1.0.5-r1:0/1.0.5::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/text-short-0.1.5:0/0.1.5::haskell USE="doc hoogle hscolour test* -asserts -profile" 0 KiB+[ebuild R ~] dev-haskell/psqueues-0.2.7.3:0/0.2.7.3::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/nats-1.1.2-r1:0/1.1.2::haskell USE="binary hashable template-haskell -profile" 11 KiB+[ebuild N ~] dev-haskell/smallcheck-1.2.1:0/1.2.1::haskell USE="doc hoogle hscolour -profile" 19 KiB+[ebuild R ~] dev-haskell/primitive-unlifted-0.1.3.1:0/0.1.3.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/tasty-smallcheck-0.8.2:0/0.8.2::haskell USE="doc hoogle hscolour -profile" 3 KiB+[ebuild R ~] dev-haskell/regex-applicative-0.3.3.1:0/0.3.3.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/resourcet-1.2.5:0/1.2.5::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/base-orphans-0.8.6:0/0.8.6::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/generic-deriving-1.14.1:0/1.14.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/th-compat-0.1.3:0/0.1.3::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/constraints-0.13.3:0/0.13.3::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/reflection-2.1.6:0/2.1.6::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/path-pieces-0.2.1:0/0.2.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/validity-0.12.0.0:0/0.12.0.0::haskell USE="doc hoogle hscolour test -profile" 9 KiB+[ebuild R ~] dev-haskell/word8-0.1.3:0/0.1.3::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/css-text-0.1.3.0:0/0.1.3.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/http-date-0.0.11:0/0.0.11::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/unix-time-0.4.7:0/0.4.7::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/should-not-typecheck-2.1.0:0/2.1.0::haskell USE="doc hoogle hscolour test -profile" 6 KiB+[ebuild N ~] dev-haskell/logging-facade-0.3.0:0/0.3.0::haskell USE="doc hoogle hscolour test -profile" 4 KiB+[ebuild N ~] dev-haskell/stringbuilder-0.5.1:0/0.5.1::haskell USE="doc hoogle hscolour test -profile" 3 KiB+[ebuild R ~] dev-haskell/zlib-bindings-0.1.1.5:0/0.1.1.5::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/quickcheck-assertions-0.3.0:0/0.3.0::haskell USE="doc hoogle hscolour test -profile" 6 KiB+[ebuild R ~] dev-haskell/newtype-generics-0.6:0/0.6::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hlibsass-0.1.10.1:0/0.1.10.1::haskell USE="doc hoogle hscolour test* -externallibsass -profile -sharedlibsass" 0 KiB+[ebuild R ~] dev-haskell/word-wrap-0.4.1:0/0.4.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/ini-0.4.1-r1:0/0.4.1::haskell USE="doc hoogle hscolour test -profile" 5 KiB+[ebuild R ~] dev-haskell/indexed-list-literals-0.2.1.3:0/0.2.1.3::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/unicode-data-0.3.0:0/0.3.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/email-validate-2.3.2.15:0/2.3.2.15::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/hspec-attoparsec-0.1.0.2-r1:0/0.1.0.2::haskell USE="doc hoogle hscolour test -profile" 4 KiB+[ebuild R ~] dev-haskell/fgl-5.7.0.3-r1:0/5.7.0.3::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/vector-0.12.3.1-r1:0/0.12.3.1::haskell USE="boundschecks doc hoogle hscolour test* -internalchecks -profile -unsafechecks" 0 KiB+[ebuild N ~] dev-haskell/test-framework-0.8.2.0-r3:0/0.8.2.0::haskell USE="doc hoogle hscolour -profile" 21 KiB+[ebuild R ~] dev-haskell/bifunctors-5.5.11:0/5.5.11::haskell USE="doc hoogle hscolour semigroups tagged test* -profile" 0 KiB+[ebuild R ~] dev-haskell/distributive-0.6.2.1:0/0.6.2.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/time-compat-1.9.6.1:0/1.9.6.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/onetuple-0.3.1:0/0.3.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/errorcall-eq-instance-0.3.0:0/0.3.0::haskell USE="doc hoogle hscolour test -profile" 2 KiB+[ebuild R ~] dev-haskell/deriving-compat-0.6:0/0.6::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/recursion-schemes-5.2.2.1:0/5.2.2.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/validated-literals-0.3.1:0/0.3.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/test-framework-hunit-0.3.0.2-r1:0/0.3.0.2::haskell USE="doc hoogle hscolour -profile" 3 KiB+[ebuild N ~] dev-haskell/test-framework-quickcheck2-0.3.0.5-r2:0/0.3.0.5::haskell USE="doc hoogle hscolour -profile" 4 KiB+[ebuild R ~] dev-haskell/th-lift-instances-0.1.19:0/0.1.19::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/base-compat-batteries-0.12.1:0/0.12.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/text-metrics-0.3.0:0/0.3.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/vector-algorithms-0.8.0.4:0/0.8.0.4::haskell USE="bench boundschecks doc hoogle hscolour properties test* -internalchecks -profile -unsafechecks" 0 KiB+[ebuild R ~] dev-haskell/text-zipper-0.11:0/0.11::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/barbies-2.0.3.0:0/2.0.3.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/xss-sanitize-0.3.6:0/0.3.6::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/hashable-time-0.3:0/0.3::haskell USE="doc hoogle hscolour test -profile" 3 KiB+[ebuild R ~] dev-haskell/listlike-4.7.4:0/4.7.4::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/test-framework-smallcheck-0.2:0/0.2::haskell USE="doc hoogle hscolour -profile" 3 KiB+[ebuild N ~] dev-haskell/pgp-wordlist-0.1.0.3:0/0.1.0.3::haskell USE="doc hoogle hscolour test -profile" 10 KiB+[ebuild R ~] dev-haskell/streaming-0.2.3.1:0/0.2.3.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/nonempty-vector-0.2.1.0:0/0.2.1.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/vector-th-unbox-0.2.1.9:0/0.2.1.9::haskell USE="doc hoogle hscolour test -profile" 5 KiB+[ebuild R ~] dev-haskell/async-2.2.4-r1:0/2.2.4::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/exceptions-0.10.4:0/0.10.4::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/case-insensitive-1.2.1.0:0/1.2.1.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/base64-bytestring-1.2.1.0:0/1.2.1.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/blaze-builder-0.4.2.1:0/0.4.2.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/base16-bytestring-1.0.2.0:0/1.0.2.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/cereal-0.5.8.2:0/0.5.8.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/diff-0.4.0:0/0.4.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/lifted-base-0.2.3.12:0/0.2.3.12::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/glob-0.10.2:0/0.10.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/foldl-1.4.12:0/1.4.12::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/sha-1.6.4.4:0/1.6.4.4::haskell USE="doc hoogle hscolour test* -exe -profile" 0 KiB+[ebuild R ~] dev-haskell/pem-0.2.4:0/0.2.4::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/adjunctions-4.4:0/4.4::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/invariant-0.5.5:0/0.5.5::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/th-orphans-0.13.11:0/0.13.11::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/fingertree-0.1.4.2:0/0.1.4.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/decimal-0.5.2:0/0.5.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/exception-transformers-0.4.0.9:0/0.4.0.9::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/math-functions-0.3.4.2:0/0.3.4.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/either-5.0.1.1:0/5.0.1.1::haskell USE="doc hoogle hscolour test -profile" 10 KiB+[ebuild N ~] dev-haskell/keys-3.12.3-r1:0/3.12.3::haskell USE="doc hoogle hscolour -profile" 17 KiB+[ebuild R ~] dev-haskell/infer-license-0.2.0:0/0.2.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/bindings-glfw-3.3.2.0:0/3.3.2.0::haskell USE="X doc hoogle hscolour test* -exposenative -osmesa -profile" 0 KiB+[ebuild R ~] dev-haskell/edit-distance-0.2.2.1-r1:0/0.2.2.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/double-conversion-2.0.2.0:0/2.0.2.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/crypto-cipher-tests-0.0.11-r1:0/0.0.11::haskell USE="doc hoogle hscolour test -profile" 7 KiB+[ebuild N ~] dev-haskell/checkers-0.5.6-r1:0/0.5.6::haskell USE="doc hoogle hscolour -profile" 18 KiB+[ebuild R ~] dev-haskell/enummapset-0.6.0.3:0/0.6.0.3::haskell USE="doc hoogle hscolour test* -debug -profile" 0 KiB+[ebuild R ~] dev-haskell/iso-deriving-0.0.8:0/0.0.8::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/process-extras-0.7.4:0/0.7.4::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/half-0.3.1:0/0.3.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/temporary-1.3:0/1.3::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/blaze-markup-0.8.2.8:0/0.8.2.8::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/unliftio-0.2.18:0/0.2.18::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/x509-1.7.7:0/1.7.7::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/safe-exceptions-0.1.7.1:0/0.1.7.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/vty-5.35.1:0/5.35.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/polysemy-1.7.1.0:0/1.7.1.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/mono-traversable-1.0.15.3:0/1.0.15.3::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/crypto-api-tests-0.3-r1:0/0.3::haskell USE="doc hoogle hscolour -profile" 3,551 KiB+[ebuild R ~] dev-haskell/text-conversions-0.3.1:0/0.3.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/haskeline-0.8.2:0/0.8.2::haskell USE="doc hoogle hscolour terminfo test* -profile" 0 KiB+[ebuild R ~] dev-haskell/filelock-0.1.1.5:0/0.1.1.5::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/cryptohash-sha256-0.11.102.0:0/0.11.102.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/th-desugar-1.12:0/1.12::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/mwc-random-0.15.0.2-r1:0/0.15.0.2::haskell USE="doc hoogle hscolour test -profile" 30 KiB+[ebuild R ~] dev-haskell/cipher-aes-0.2.11:0/0.2.11::haskell USE="doc hoogle hscolour test* -profile" CPU_FLAGS_X86="-aes -ssse3" 0 KiB+[ebuild R ~] dev-haskell/lucid-2.11.0:0/2.11.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/concurrent-extra-0.7.0.12:0/0.7.0.12::haskell USE="doc hoogle hscolour test -profile" 16 KiB+[ebuild N ~] dev-haskell/cipher-aes128-0.7.0.5-r2:0/0.7.0.5::haskell USE="doc hoogle hscolour -profile" 26 KiB+[ebuild N ~] dev-haskell/cryptohash-cryptoapi-0.1.4:0/0.1.4::haskell USE="doc hoogle hscolour -profile" 4 KiB+[ebuild R ~] dev-haskell/bimap-0.4.0:0/0.4.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hinotify-0.4.1:0/0.4.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/enclosed-exceptions-1.0.3:0/1.0.3::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/blaze-textual-0.2.1.0:0/0.2.1.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/reducers-3.12.3-r1:0/3.12.3::haskell USE="doc hoogle hscolour -profile" 14 KiB+[ebuild R ~] dev-haskell/language-javascript-0.7.0.0:0/0.7.0.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/skein-1.0.9.4:0/1.0.9.4::haskell USE="doc hoogle hscolour test* (-big-endian) -force-endianness -profile -reference" 0 KiB+[ebuild N ~] dev-haskell/xmlgen-0.6.2.2:0/0.6.2.2::haskell USE="doc hoogle hscolour -profile" 10 KiB+[ebuild R ~] dev-haskell/filestore-0.6.5:0/0.6.5::haskell USE="doc hoogle hscolour maxcount test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hstringtemplate-0.8.8-r1:0/0.8.8::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/glfw-b-3.3.0.0:0/3.3.0.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/refinery-0.4.0.0:0/0.4.0.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/network-3.1.2.5:0/3.1.2.5::haskell USE="doc hoogle hscolour test* -devel -profile" 0 KiB+[ebuild R ~] dev-haskell/http-types-0.12.3:0/0.12.3::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/extra-1.7.10:2/1.7.10::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/blaze-html-0.9.1.2:0/0.9.1.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hslua-core-2.1.0:0/2.1.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/silently-1.2.5.1:0/1.2.5.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/mockery-0.3.5:0/0.3.5::haskell USE="doc hoogle hscolour test -profile" 4 KiB+[ebuild R ~] dev-haskell/x509-store-1.6.7:0/1.6.7::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/indexed-traversable-instances-0.1:0/0.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/prettyprinter-1.7.0:0/1.7.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/typed-process-0.2.9.0:0/0.2.9.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/zip-archive-0.4.2.1:0/0.4.2.1::haskell USE="doc executable hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/githash-0.1.6.1:0/0.1.6.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/puremd5-2.1.3:0/2.1.3::haskell USE="doc hoogle hscolour test -profile" 7 KiB+[ebuild N ~] dev-haskell/system-fileio-0.3.16.4:0/0.3.16.4::haskell USE="doc hoogle hscolour test -profile" 16 KiB+[ebuild R ~] dev-haskell/hashtables-1.3:0/1.3::haskell USE="doc hoogle hscolour test* -bounds-checking -debug -detailed-profiling -profile" CPU_FLAGS_X86="-sse4_2" 0 KiB+[ebuild R ~] dev-haskell/clientsession-0.9.1.2:0/0.9.1.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/cassava-0.5.2.0-r1:0/0.5.2.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/monoid-subclasses-0.4.6.1:0/0.4.6.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/polysemy-plugin-0.4.3.0:0/0.4.3.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/threads-0.5.1.6:0/0.5.1.6::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/weigh-0.0.16:0/0.0.16::haskell USE="doc hoogle hscolour test -profile" 9 KiB+[ebuild N ~] dev-haskell/drbg-0.5.5:0/0.5.5::haskell USE="doc hoogle hscolour test -profile" 1,511 KiB+[ebuild R ~] dev-haskell/lukko-0.1.1.3:0/0.1.1.3::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/direct-sqlite-2.3.26-r1:0/2.3.26::haskell USE="doc fulltextsearch hoogle hscolour json1 test* urifilenames -profile" 0 KiB+[ebuild N ~] dev-haskell/random-bytestring-0.1.4:0/0.1.4::haskell USE="doc hoogle hscolour pcg -profile" 79 KiB+[ebuild R ~] dev-haskell/config-schema-1.2.2.0:0/1.2.2.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/aeson-1.5.6.0-r2:0/1.5.6.0::haskell USE="cffi doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/conduit-1.3.4.2:0/1.3.4.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/lens-5.1.1:0/5.1.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/wai-3.2.3:0/3.2.3::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/streaming-commons-0.2.2.1:0/0.2.2.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/haskell-src-exts-1.23.1:1.22/1.23.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/rio-0.1.21.0:0/0.1.21.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hspec-core-2.9.4:0/2.9.4::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hspec-discover-2.9.4:0/2.9.4::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/tasty-hslua-1.0.2:0/1.0.2::haskell USE="doc hoogle hscolour -profile" 4 KiB+[ebuild R ~] dev-haskell/ghc-exactprint-0.6.4:0/0.6.4::haskell USE="doc hoogle hscolour test* -profile -roundtrip" 0 KiB+[ebuild R ~] dev-haskell/witherable-0.4.2:0/0.4.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/iproute-1.7.12:0/1.7.12::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/doclayout-0.3.1.1:0/0.3.1.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/io-streams-1.5.2.1-r1:0/1.5.2.1::haskell USE="doc hoogle hscolour network test* zlib -profile" 0 KiB+[ebuild R ~] dev-haskell/prettyprinter-ansi-terminal-1.1.2:0/1.1.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/sqlite-simple-0.4.18.2:0/0.4.18.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/cryptohash-md5-0.11.101.0:0/0.11.101.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/x509-validation-1.6.11:0/1.6.11::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/markdown-unlit-0.5.1-r1:0/0.5.1::haskell USE="doc executable hoogle hscolour test -profile" 5 KiB+[ebuild R ~] dev-haskell/hjsmin-0.2.0.4:0/0.2.0.4::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/filepattern-0.1.2:0/0.1.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/optparse-simple-0.1.1.4:0/0.1.1.4::haskell USE="doc hoogle hscolour test* -build-example -profile" 0 KiB+[ebuild N ~] dev-haskell/getopt-generics-0.13.0.4:0/0.13.0.4::haskell USE="doc hoogle hscolour test -profile" 19 KiB+[ebuild N ~] dev-haskell/vector-instances-3.4:0/3.4::haskell USE="doc hashable hoogle hscolour -profile" 6 KiB+[ebuild N ~] dev-haskell/rsa-2.3.1:0/2.3.1::haskell USE="doc hoogle hscolour test -profile" 15 KiB+[ebuild N ~] dev-haskell/port-utils-0.2.1.0:0/0.2.1.0::haskell USE="doc hoogle hscolour test -profile" 7 KiB+[ebuild R ~] dev-haskell/base64-0.4.2.3:0/0.4.2.3::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/algebraic-graphs-0.6:0/0.6::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/polysemy-zoo-0.8.0.0:0/0.8.0.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/fuzzy-0.1.0.0:0/0.1.0.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/conduit-extra-1.3.6:0/1.3.6::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hslua-marshalling-2.1.0:0/2.1.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/http-client-0.7.11:0/0.7.11::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hslogger-1.3.1.0-r2:0/1.3.1.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/shakespeare-2.0.25:0/2.0.25::haskell USE="doc hoogle hscolour test* test-coffee test-export test-roy -profile" 0 KiB+[ebuild R ~] dev-haskell/pandoc-types-1.22.2:0/1.22.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/unicode-transforms-0.3.7.1:0/0.3.7.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/beam-core-0.9.2.1:0/0.9.2.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/tls-1.5.8:0/1.5.8::haskell USE="compat doc hoogle hscolour network test* -profile" 0 KiB+[ebuild N ~] dev-haskell/genvalidity-1.0.0.1:0/1.0.0.1::haskell USE="doc hoogle hscolour test -profile" 12 KiB+[ebuild R ~] dev-haskell/hiedb-0.4.1.0:0/0.4.1.0::haskell USE="doc executable hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/tasty-th-0.1.7:0/0.1.7::haskell USE="doc hoogle hscolour test -profile" 5 KiB+[ebuild R ~] dev-haskell/snap-core-1.0.5.0:0/1.0.5.0::haskell USE="doc hoogle hscolour test* -debug -profile" 0 KiB+[ebuild R ~] dev-haskell/websockets-0.12.7.3:0/0.12.7.3::haskell USE="doc examples hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hackage-security-0.6.1.0:0/0.6.1.0::haskell USE="doc hoogle hscolour lukko test* -profile" 0 KiB+[ebuild R ~] dev-haskell/haskell-src-meta-0.8.7:0/0.8.7::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/generic-lens-2.2.1.0:0/2.2.1.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/postgresql-simple-0.6.4-r1:0/0.6.4::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/tasty-hspec-1.2:0/1.2::haskell USE="doc hoogle hscolour -profile" 7 KiB+[ebuild R ~] dev-haskell/pretty-simple-4.1.1.0:0/4.1.1.0::haskell USE="doc examples executable hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/quickcheck-classes-0.6.5.0:0/0.6.5.0::haskell USE="aeson binary-laws doc hoogle hscolour semigroupoids semirings test* unary-laws vector -profile" 0 KiB+[ebuild R ~] dev-haskell/doctemplates-0.10:0/0.10::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/httpd-shed-0.4.1.1-r1:0/0.4.1.1::haskell USE="doc hoogle hscolour -buildexamples -profile" 5 KiB+[ebuild R ~] dev-haskell/io-streams-haproxy-1.0.1.0-r2:0/1.0.1.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hi-file-parser-0.1.2.0:0/0.1.2.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/rebase-1.15.0.3:0/1.15.0.3::haskell USE="doc hoogle hscolour -profile" 21 KiB+[ebuild N ~] dev-haskell/turtle-1.5.24:0/1.5.24::haskell USE="doc hoogle hscolour test -profile" 57 KiB+[ebuild N ~] dev-haskell/hspec-contrib-0.5.1:0/0.5.1::haskell USE="doc hoogle hscolour -profile" 3 KiB+[ebuild N ~] dev-haskell/microlens-aeson-2.3.1:0/2.3.1::haskell USE="doc hoogle hscolour test -profile" 430 KiB+[ebuild N ~] dev-haskell/trifecta-2.1.2:0/2.1.2::haskell USE="doc hoogle hscolour test -profile" 59 KiB+[ebuild N ~] dev-haskell/htf-0.14.0.6:0/0.14.0.6::haskell USE="doc hoogle hscolour -profile" 79 KiB+[ebuild R ~] dev-haskell/apply-refact-0.9.3.0:0/0.9.3.0::haskell USE="doc executable hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/clay-0.13.3-r1:0/0.13.3::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/optics-0.4:0/0.4::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-util/shellcheck-0.8.0:0/0.8.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hsass-0.8.0:0/0.8.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/linear-1.21.8:0/1.21.8::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/yaml-0.11.8.0:0/0.11.8.0::haskell USE="doc examples executable hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/http-client-tls-0.3.6.1:0/0.3.6.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/xml-conduit-1.9.1.1:0/1.9.1.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/rerebase-1.15.0.3:0/1.15.0.3::haskell USE="doc hoogle hscolour -profile" 18 KiB+[ebuild N ~] dev-haskell/tasty-lua-1.0.2:0/1.0.2::haskell USE="doc hoogle hscolour test -profile" 11 KiB+[ebuild R ~] dev-haskell/cryptonite-conduit-0.2.2:0/0.2.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/http-4000.3.16-r1:0/4000.3.16::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/lifted-async-0.10.2:0/0.10.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/commonmark-0.2.2:0/0.2.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/genvalidity-property-1.0.0.0:0/1.0.0.0::haskell USE="doc hoogle hscolour test -profile" 10 KiB+[ebuild R ~] dev-haskell/unicode-collation-0.1.3.1:0/0.1.3.1::haskell USE="doc executable hoogle hscolour test* -doctests -profile" 0 KiB+[ebuild R ~] dev-haskell/hslua-objectorientation-2.1.0:0/2.1.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/mod-0.1.2.2:0/0.1.2.2::haskell USE="doc hoogle hscolour semirings test* vector -profile" 0 KiB+[ebuild R ~] dev-haskell/simple-sendfile-0.2.30:0/0.2.30::haskell USE="allow-bsd doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/project-template-0.2.1.0:0/0.2.1.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/tar-conduit-0.3.2-r1:0/0.3.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/authenticate-oauth-1.6.0.1-r1:0/1.6.0.1::haskell USE="doc hoogle hscolour -profile" 10 KiB+[ebuild N ~] dev-haskell/interpolate-0.2.1:0/0.2.1::haskell USE="doc hoogle hscolour test -profile" 8 KiB+[ebuild R ~] dev-haskell/hslua-aeson-2.1.0:0/2.1.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/ipynb-0.2:0/0.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/texmath-0.12.4:0/0.12.4::haskell USE="doc executable hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hslua-classes-2.1.0:0/2.1.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/tree-diff-0.2.1.1:0/0.2.1.1::haskell USE="doc hoogle hscolour test -profile" 26 KiB+[ebuild R ~] dev-haskell/monad-dijkstra-0.1.1.3:0/0.1.1.3::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/aeson-casing-0.2.0.0:0/0.2.0.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/beam-sqlite-0.5.1.2:0/0.5.1.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/higgledy-0.4.1.1-r4:0/0.4.1.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/singletons-base-3.0:0/3.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/vinyl-0.13.3:0/0.13.3::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/happstack-server-7.6.1-r2:0/7.6.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/missingh-1.4.3.0-r2:0/1.4.3.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hedgehog-1.0.5:0/1.0.5::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hslua-packaging-2.1.0:0/2.1.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/focus-1.0.2:0/1.0.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/deferred-folds-0.9.18.1:0/0.9.18.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/skylighting-core-0.12.3:0/0.12.3::haskell USE="doc executable hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hpack-0.34.4:0/0.34.4::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/commonmark-extensions-0.2.3.2:0/0.2.3.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/haddock-library-1.10.0-r2:0/1.10.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hie-bios-0.9.1:0/0.9.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/js-flot-0.8.3:0/0.8.3::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/js-jquery-3.3.1:0/3.3.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/genvalidity-hspec-1.0.0.0:0/1.0.0.0::haskell USE="doc hoogle hscolour test -profile" 12 KiB+[ebuild N ~] dev-haskell/wreq-0.5.3.3:0/0.5.3.3::haskell USE="doc hoogle hscolour test -aws -httpbin -profile" 57 KiB+[ebuild R ~] dev-haskell/shelly-1.9.0:0/1.9.0::haskell USE="doc examples hoogle hscolour test* -lifted -profile" 0 KiB+[ebuild R ~] dev-haskell/citeproc-0.6.0.1:0/0.6.0.1::haskell USE="doc executable hoogle hscolour icu test* -profile" 0 KiB+[ebuild R ~] dev-haskell/html-conduit-1.3.2.1:0/1.3.2.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/floskell-0.10.6:0/0.10.6::haskell USE="doc executable hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/implicit-hie-0.1.2.7:0/0.1.2.7::haskell USE="doc executable hoogle hscolour test* -profile" 0 KiB+[ebuild R *] app-portage/hackport-9999::haskell USE="test*" 0 KiB+[ebuild R ~] dev-haskell/feed-1.3.2.1:0/1.3.2.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/lsp-1.4.0.0:0/1.4.0.0::haskell USE="doc examples hoogle hscolour test* -profile" 0 KiB+[ebuild U ~] dev-haskell/tasty-hedgehog-1.2.0.0:0/1.2.0.0::haskell [1.1.0.0:0/1.1.0.0::haskell] USE="doc hoogle hscolour test* -profile" 5 KiB+[ebuild R ~] dev-haskell/path-0.9.2:0/0.9.2::haskell USE="doc hoogle hscolour test* -dev -profile" 0 KiB+[ebuild R ~] dev-haskell/fsnotify-0.3.0.1:0/0.3.0.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hslua-2.1.0:0/2.1.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/mustache-2.4.0:0/2.4.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/patch-0.0.5.2:0/0.0.5.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/hedgehog-fn-1.0:0/1.0::haskell USE="doc hoogle hscolour -build-examples -profile" 7 KiB+[ebuild R ~] dev-haskell/hslua-module-path-1.0.2:0/1.0.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hslua-module-system-1.0.2:0/1.0.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hslua-module-text-1.0.2:0/1.0.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hslua-module-version-1.0.2:0/1.0.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/primitive-extras-0.10.1.4:0/0.10.1.4::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/implicit-hie-cradle-0.5.0.0:0/0.5.0.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/retry-0.9.0.0:0/0.9.0.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/path-io-1.6.3:0/1.6.3::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/uri-bytestring-0.3.3.1:0/0.3.3.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/bsb-http-chunked-0.0.0.4:0/0.0.0.4::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/linear-base-0.1.0:0/0.1.0::haskell USE="doc hoogle hscolour test -profile" 130 KiB+[ebuild R ~] dev-haskell/pandoc-lua-marshal-0.1.6:0/0.1.6::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/stm-hamt-1.2.0.7:0/1.2.0.7::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/ghcid-0.8.7:0/0.8.7::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/nonempty-containers-0.3.4.4:0/0.3.4.4::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/auto-update-0.1.6:0/0.1.6::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/http-download-0.2.0.0:0/0.2.0.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/stm-containers-1.2:0/1.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/reflex-vty-0.2.0.0-r1:0/0.2.0.0::haskell USE="doc examples hoogle hscolour test -profile" 0 KiB+[ebuild N ~] dev-haskell/one-liner-2.0:0/2.0::haskell USE="doc hoogle hscolour test -profile" 17 KiB+[ebuild N ~] dev-haskell/postgres-options-0.2.0.0:0/0.2.0.0::haskell USE="doc hoogle hscolour test -profile" 5 KiB+[ebuild R ~] dev-haskell/fast-logger-3.0.5:0/3.0.5::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hls-graph-1.7.0.0:0/1.7.0.0::haskell USE="doc hoogle hscolour test* -embed-files -profile -stm-stats" 0 KiB+[ebuild N ~] dev-haskell/tmp-postgres-1.34.1.0-r1:0/1.34.1.0::haskell USE="doc hoogle hscolour -profile" 33 KiB+[ebuild R ~] dev-haskell/generic-data-0.9.2.0:0/0.9.2.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/reflex-process-0.3.1.1:0/0.3.1.1::haskell USE="doc examples hoogle hscolour test -profile" 0 KiB+[ebuild R ~] dev-haskell/hls-plugin-api-1.4.0.0:0/1.4.0.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/beam-postgres-0.5.2.1:0/0.5.2.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/warp-3.3.21:0/3.3.21::haskell USE="allow-sendfilefd doc hoogle hscolour test* x509 -debug -profile" 0 KiB+[ebuild R ~] dev-haskell/persistent-2.13.2.1:0/2.13.2.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/rio-orphans-0.1.2.0:0/0.1.2.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hls-explicit-imports-plugin-1.1.0.0:0/1.1.0.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hls-floskell-plugin-1.0.1.1:0/1.0.1.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hls-alternate-number-format-plugin-1.1.0.0:0/1.1.0.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hls-haddock-comments-plugin-1.0.1.0-r1:0/1.0.1.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hls-module-name-plugin-1.0.2.0:0/1.0.2.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hls-qualify-imported-names-plugin-1.0.1.0-r1:0/1.0.1.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hls-rename-plugin-1.0.0.2:0/1.0.0.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/wai-extra-3.1.12.1:0/3.1.12.1::haskell USE="doc examples hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/persistent-test-2.13.0.4:0/2.13.0.4::haskell USE="doc hoogle hscolour -profile" 31 KiB+[ebuild R ~] dev-haskell/hls-refine-imports-plugin-1.0.2.0:0/1.0.2.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/yesod-core-1.6.21.0:0/1.6.21.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/persistent-sqlite-2.13.0.4:0/2.13.0.4::haskell USE="doc hoogle hscolour test* -build-sanity-exe -profile" 0 KiB+[ebuild R ~] dev-haskell/wai-app-static-3.1.7.2-r1:0/3.1.7.2::haskell USE="doc hoogle hscolour test* -print -profile" 0 KiB+[ebuild R ~] app-text/pandoc-2.17.1.1:0/2.17.1.1::haskell USE="doc hoogle hscolour test* trypandoc -embed-data-files -profile" 0 KiB+[ebuild R ~] dev-haskell/yesod-persistent-1.6.0.7:0/1.6.0.7::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/wai-websockets-3.0.1.2:0/3.0.1.2::haskell USE="doc examples hoogle hscolour -profile" 7 KiB+[ebuild R ~] dev-haskell/hakyll-4.15.1.1-r1:0/4.15.1.1::haskell USE="checkexternal doc hoogle hscolour previewserver test* usepandoc watchserver -buildwebsite -profile" 0 KiB+[ebuild R ~] dev-haskell/yesod-form-1.7.0:0/1.7.0::haskell USE="doc hoogle hscolour network-uri test* -profile" 0 KiB+[ebuild R ~] dev-haskell/wai-cors-0.2.7:0/0.2.7::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/yesod-test-1.6.14:0/1.6.14::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/yesod-static-1.6.1.0:0/1.6.1.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hls-selection-range-plugin-1.0.0.0-r1:0/1.0.0.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/hspec-megaparsec-2.2.0:0/2.2.0::haskell USE="doc hoogle hscolour test -profile" 0 KiB+[ebuild R ~] dev-haskell/neat-interpolation-0.5.1.2:0/0.5.1.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/config-ini-0.2.4.0-r2:0/0.2.4.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/brick-0.69.1:0/0.69.1::haskell USE="demos doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/cassava-megaparsec-2.0.2:0/2.0.2::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/stack-2.7.6_pre20220421:0/2.7.6_pre20220421::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild N ~] dev-haskell/megaparsec-tests-9.2.0:0/9.2.0::haskell USE="doc hoogle hscolour test -profile" 0 KiB+[ebuild R ~] dev-haskell/parser-combinators-1.3.0:0/1.3.0::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] dev-haskell/hledger-lib-1.26.1:0/1.26.1::haskell USE="doc hoogle hscolour test* -profile" 0 KiB+[ebuild R ~] app-office/hledger-1.26.1:0/1.26.1::haskell USE="doc hoogle hscolour terminfo test* threaded -profile" 0 KiB+[ebuild N ~] app-office/hledger-iadd-1.3.17:0/1.3.17::haskell USE="doc hoogle hscolour test -profile" 68 KiB+[ebuild R ~] app-office/hledger-web-1.26.1:0/1.26.1::haskell USE="doc hoogle hscolour test* threaded -library-only -profile" 0 KiB++Total: 453 packages (14 upgrades, 109 new, 330 reinstalls), Size of downloads: 186,415 KiB++ * IMPORTANT: 3 news items need reading for repository 'gentoo'.+ * Use eselect news read to view new items.+