git.iko.soy/typeable/cabal2nix
on master help sign in
771 files changed+43229−6209
since splitsnapshots
unifiedsplit
.gitignore+15−5 .travis.yml+158−23 GNUmakefile−33 README.md+15−38 Setup.hs+6 Setup.lhs−8 cabal2nix.cabal+144−183 cabal2nix/Main.hs+2−141 doc/.gitignore+13−14 doc/00-future-of-haskell-packaging-in-nixpkgs.md+41 doc/01-use-function-application-to-escape-override-hell.md+320 doc/02-guarantee-consistent-builds-and-obsolete-overridescope.md+182 doc/03-map-cabal-files-to-nix-without-information-loss.md+110 doc/04-set-up-a-sufficiently-powerful-build-farm.md+208 doc/05-publish-all-of-hackage.md+69 doc/GNUmakefile+36−2 doc/analyze-hackage.r+16 doc/analyze-hydra-builds.r+54 doc/analyze-hydra-space-requirements.r+57 doc/future.org+60 doc/hal8-folien.md+1−1 doc/hal8.md+1−1 doc/list-haskell-store-paths.nix+27 doc/list-haskell-store-paths.sh+11 doc/nixcon-2015-slides.md+357 doc/nixos-meetup-3-slides.md+4−4 doc/pipeline-details.dia+1767 doc/pipeline-overview.dia+625 doc/user-guide.md−569 hackage2nix/HackageGit.hs+71 hackage2nix/Main.hs+150−128 hackage2nix/README.md+36 package.yaml−91 release.nix−48 src/Cabal2nix.hs+276 src/Distribution/Nixpkgs/Fetch.hs+72−39 src/Distribution/Nixpkgs/Haskell/BuildInfo.hs+10−5 src/Distribution/Nixpkgs/Haskell/Constraint.hs+1−1 src/Distribution/Nixpkgs/Haskell/Derivation.hs+66−56 src/Distribution/Nixpkgs/Haskell/FromCabal.hs+95−52 src/Distribution/Nixpkgs/Haskell/FromCabal/Configuration.hs+83−32 src/Distribution/Nixpkgs/Haskell/FromCabal/Configuration/GHC7102.hs−3590 src/Distribution/Nixpkgs/Haskell/FromCabal/Configuration/Maintainers.hs−26 src/Distribution/Nixpkgs/Haskell/FromCabal/Flags.hs+44−10 src/Distribution/Nixpkgs/Haskell/FromCabal/License.hs+166−26 src/Distribution/Nixpkgs/Haskell/FromCabal/Name.hs+107−56 src/Distribution/Nixpkgs/Haskell/FromCabal/Normalize.hs+13−52 src/Distribution/Nixpkgs/Haskell/FromCabal/PostProcess.hs+281−163 src/Distribution/Nixpkgs/Haskell/Hackage.hs+41−25 src/Distribution/Nixpkgs/Haskell/HackageGit.hs−79 src/Distribution/Nixpkgs/Haskell/OrphanInstances.hs+71−53 src/Distribution/Nixpkgs/Haskell/PackageSourceSpec.hs+272 src/Distribution/Nixpkgs/License.hs−47 src/Distribution/Nixpkgs/Meta.hs−85 src/Distribution/Nixpkgs/PackageMap.hs−59 src/Internal/HaskellPackage.hs−154 src/Internal/Lens.hs−13 src/Internal/PrettyPrinting.hs−62 src/Language/Nix.hs−11 src/Language/Nix/Binding.hs−37 src/Language/Nix/Identifier.hs−66 src/Language/Nix/Path.hs−53 test/Main.hs+113−56 test/golden-test-cases/.gitignore+1 test/golden-test-cases/ChasingBottoms.cabal+185 test/golden-test-cases/ChasingBottoms.nix.golden+16 test/golden-test-cases/Clipboard.cabal+55 test/golden-test-cases/Clipboard.nix.golden+10 test/golden-test-cases/FenwickTree.cabal+41 test/golden-test-cases/FenwickTree.nix.golden+12 test/golden-test-cases/GPipe-GLFW.cabal+51 test/golden-test-cases/GPipe-GLFW.nix.golden+12 test/golden-test-cases/GenericPretty.cabal+99 test/golden-test-cases/GenericPretty.nix.golden+10 test/golden-test-cases/HPDF.cabal+97 test/golden-test-cases/HPDF.nix.golden+16 test/golden-test-cases/HTF.cabal+197 test/golden-test-cases/HTF.nix.golden+31 test/golden-test-cases/HTTP.cabal+182 test/golden-test-cases/HTTP.nix.golden+21 test/golden-test-cases/Hclip.cabal+55 test/golden-test-cases/Hclip.nix.golden+10 test/golden-test-cases/MissingH.cabal+131 test/golden-test-cases/MissingH.nix.golden+22 test/golden-test-cases/ObjectName.cabal+34 test/golden-test-cases/ObjectName.nix.golden+10 test/golden-test-cases/Only.cabal+32 test/golden-test-cases/Only.nix.golden+9 test/golden-test-cases/QuasiText.cabal+20 test/golden-test-cases/QuasiText.nix.golden+15 test/golden-test-cases/QuickCheck.cabal+171 test/golden-test-cases/QuickCheck.nix.golden+16 test/golden-test-cases/ReadArgs.cabal+110 test/golden-test-cases/ReadArgs.nix.golden+14 test/golden-test-cases/SHA.cabal+130 test/golden-test-cases/SHA.nix.golden+17 test/golden-test-cases/Strafunski-StrategyLib.cabal+59 test/golden-test-cases/Strafunski-StrategyLib.nix.golden+9 test/golden-test-cases/accelerate-fftw.cabal+41 test/golden-test-cases/accelerate-fftw.nix.golden+14 test/golden-test-cases/accelerate.cabal+412 test/golden-test-cases/accelerate.nix.golden+18 test/golden-test-cases/active.cabal+44 test/golden-test-cases/active.nix.golden+16 test/golden-test-cases/adjunctions.cabal+72 test/golden-test-cases/adjunctions.nix.golden+17 test/golden-test-cases/aeson-diff.cabal+118 test/golden-test-cases/aeson-diff.nix.golden+26 test/golden-test-cases/aeson-pretty.cabal+74 test/golden-test-cases/aeson-pretty.nix.golden+20 test/golden-test-cases/algebraic-graphs.cabal+142 test/golden-test-cases/algebraic-graphs.nix.golden+14 test/golden-test-cases/amazonka-cloudtrail.cabal+99 test/golden-test-cases/amazonka-cloudtrail.nix.golden+16 test/golden-test-cases/amazonka-cloudwatch-logs.cabal+118 test/golden-test-cases/amazonka-cloudwatch-logs.nix.golden+16 test/golden-test-cases/amazonka-codedeploy.cabal+123 test/golden-test-cases/amazonka-codedeploy.nix.golden+16 test/golden-test-cases/amazonka-cognito-idp.cabal+168 test/golden-test-cases/amazonka-cognito-idp.nix.golden+16 test/golden-test-cases/amazonka-ecs.cabal+116 test/golden-test-cases/amazonka-ecs.nix.golden+16 test/golden-test-cases/amazonka-kms.cabal+120 test/golden-test-cases/amazonka-kms.nix.golden+16 test/golden-test-cases/amazonka-lightsail.cabal+133 test/golden-test-cases/amazonka-lightsail.nix.golden+16 test/golden-test-cases/amazonka-route53-domains.cabal+109 test/golden-test-cases/amazonka-route53-domains.nix.golden+16 test/golden-test-cases/amazonka-waf.cabal+144 test/golden-test-cases/amazonka-waf.nix.golden+16 test/golden-test-cases/api-field-json-th.cabal+40 test/golden-test-cases/api-field-json-th.nix.golden+15 test/golden-test-cases/app-settings.cabal+138 test/golden-test-cases/app-settings.nix.golden+17 test/golden-test-cases/apply-refact.cabal+96 test/golden-test-cases/apply-refact.nix.golden+29 test/golden-test-cases/async.cabal+64 test/golden-test-cases/async.nix.golden+15 test/golden-test-cases/attoparsec-expr.cabal+28 test/golden-test-cases/attoparsec-expr.nix.golden+9 test/golden-test-cases/attoparsec-time.cabal+84 test/golden-test-cases/attoparsec-time.nix.golden+19 test/golden-test-cases/avers-server.cabal+55 test/golden-test-cases/avers-server.nix.golden+21 test/golden-test-cases/aws.cabal+430 test/golden-test-cases/aws.nix.golden+35 test/golden-test-cases/bbdb.cabal+54 test/golden-test-cases/bbdb.nix.golden+11 test/golden-test-cases/benchpress.cabal+41 test/golden-test-cases/benchpress.nix.golden+13 test/golden-test-cases/binary-bits.cabal+44 test/golden-test-cases/binary-bits.nix.golden+15 test/golden-test-cases/binary-tagged.cabal+121 test/golden-test-cases/binary-tagged.nix.golden+30 test/golden-test-cases/bindings-uname.cabal+30 test/golden-test-cases/bindings-uname.nix.golden+9 test/golden-test-cases/bioalign.cabal+23 test/golden-test-cases/bioalign.nix.golden+10 test/golden-test-cases/bits.cabal+73 test/golden-test-cases/bits.nix.golden+14 test/golden-test-cases/blank-canvas.cabal+172 test/golden-test-cases/blank-canvas.nix.golden+23 test/golden-test-cases/blaze-html.cabal+87 test/golden-test-cases/blaze-html.nix.golden+20 test/golden-test-cases/blaze-markup.cabal+67 test/golden-test-cases/blaze-markup.nix.golden+17 test/golden-test-cases/blaze-svg.cabal+54 test/golden-test-cases/blaze-svg.nix.golden+10 test/golden-test-cases/blosum.cabal+48 test/golden-test-cases/blosum.nix.golden+20 test/golden-test-cases/boomerang.cabal+45 test/golden-test-cases/boomerang.nix.golden+9 test/golden-test-cases/boxes.cabal+35 test/golden-test-cases/boxes.nix.golden+10 test/golden-test-cases/brittany.cabal+372 test/golden-test-cases/brittany.nix.golden+38 test/golden-test-cases/broadcast-chan.cabal+53 test/golden-test-cases/broadcast-chan.nix.golden+10 test/golden-test-cases/butcher.cabal+157 test/golden-test-cases/butcher.nix.golden+16 test/golden-test-cases/bzlib.cabal+47 test/golden-test-cases/bzlib.nix.golden+10 test/golden-test-cases/case-insensitive.cabal+73 test/golden-test-cases/case-insensitive.nix.golden+16 test/golden-test-cases/cassava-conduit.cabal+79 test/golden-test-cases/cassava-conduit.nix.golden+20 test/golden-test-cases/cassette.cabal+28 test/golden-test-cases/cassette.nix.golden+9 test/golden-test-cases/cereal-text.cabal+38 test/golden-test-cases/cereal-text.nix.golden+10 test/golden-test-cases/cheapskate.cabal+81 test/golden-test-cases/cheapskate.nix.golden+19 test/golden-test-cases/chell.cabal+88 test/golden-test-cases/chell.nix.golden+15 test/golden-test-cases/clumpiness.cabal+72 test/golden-test-cases/clumpiness.nix.golden+9 test/golden-test-cases/code-page.cabal+60 test/golden-test-cases/code-page.nix.golden+11 test/golden-test-cases/colorize-haskell.cabal+33 test/golden-test-cases/colorize-haskell.nix.golden+13 test/golden-test-cases/countable.cabal+78 test/golden-test-cases/countable.nix.golden+15 test/golden-test-cases/cpu.cabal+81 test/golden-test-cases/cpu.nix.golden+13 test/golden-test-cases/criterion.cabal+218 test/golden-test-cases/criterion.nix.golden+31 test/golden-test-cases/crypt-sha512.cabal+60 test/golden-test-cases/crypt-sha512.nix.golden+19 test/golden-test-cases/crypto-random-api.cabal+23 test/golden-test-cases/crypto-random-api.nix.golden+10 test/golden-test-cases/csv.cabal+23 test/golden-test-cases/csv.nix.golden+9 test/golden-test-cases/data-accessor.cabal+128 test/golden-test-cases/data-accessor.nix.golden+10 test/golden-test-cases/data-default-instances-containers.cabal+18 test/golden-test-cases/data-default-instances-containers.nix.golden+9 test/golden-test-cases/data-endian.cabal+30 test/golden-test-cases/data-endian.nix.golden+10 test/golden-test-cases/data-msgpack.cabal+114 test/golden-test-cases/data-msgpack.nix.golden+26 test/golden-test-cases/data-serializer.cabal+60 test/golden-test-cases/data-serializer.nix.golden+17 test/golden-test-cases/deque.cabal+45 test/golden-test-cases/deque.nix.golden+10 test/golden-test-cases/dhall-bash.cabal+54 test/golden-test-cases/dhall-bash.nix.golden+20 test/golden-test-cases/diagrams-solve.cabal+42 test/golden-test-cases/diagrams-solve.nix.golden+15 test/golden-test-cases/discrimination.cabal+76 test/golden-test-cases/discrimination.nix.golden+22 test/golden-test-cases/dotenv.cabal+153 test/golden-test-cases/dotenv.nix.golden+27 test/golden-test-cases/dotnet-timespan.cabal+79 test/golden-test-cases/dotnet-timespan.nix.golden+10 test/golden-test-cases/dpor.cabal+74 test/golden-test-cases/dpor.nix.golden+14 test/golden-test-cases/drawille.cabal+102 test/golden-test-cases/drawille.nix.golden+13 test/golden-test-cases/drifter-postgresql.cabal+63 test/golden-test-cases/drifter-postgresql.nix.golden+19 test/golden-test-cases/ede.cabal+110 test/golden-test-cases/ede.nix.golden+25 test/golden-test-cases/ekg-cloudwatch.cabal+46 test/golden-test-cases/ekg-cloudwatch.nix.golden+16 test/golden-test-cases/emailaddress.cabal+49 test/golden-test-cases/emailaddress.nix.golden+19 test/golden-test-cases/envelope.cabal+38 test/golden-test-cases/envelope.nix.golden+13 test/golden-test-cases/eventful-sqlite.cabal+69 test/golden-test-cases/eventful-sqlite.nix.golden+21 test/golden-test-cases/exact-pi.cabal+35 test/golden-test-cases/exact-pi.nix.golden+10 test/golden-test-cases/expiring-cache-map.cabal+108 test/golden-test-cases/expiring-cache-map.nix.golden+17 test/golden-test-cases/explicit-exception.cabal+124 test/golden-test-cases/explicit-exception.nix.golden+12 test/golden-test-cases/fdo-notify.cabal+26 test/golden-test-cases/fdo-notify.nix.golden+10 test/golden-test-cases/fgl.cabal+134 test/golden-test-cases/fgl.nix.golden+15 test/golden-test-cases/file-modules.cabal+46 test/golden-test-cases/file-modules.nix.golden+21 test/golden-test-cases/fingertree.cabal+59 test/golden-test-cases/fingertree.nix.golden+15 test/golden-test-cases/fixed-vector.cabal+87 test/golden-test-cases/fixed-vector.nix.golden+12 test/golden-test-cases/fixed.cabal+32 test/golden-test-cases/fixed.nix.golden+10 test/golden-test-cases/foundation.cabal+280 test/golden-test-cases/foundation.nix.golden+12 test/golden-test-cases/frisby.cabal+37 test/golden-test-cases/frisby.nix.golden+10 test/golden-test-cases/funcmp.cabal+92 test/golden-test-cases/funcmp.nix.golden+11 test/golden-test-cases/functor-classes-compat.cabal+147 test/golden-test-cases/functor-classes-compat.nix.golden+14 test/golden-test-cases/general-games.cabal+53 test/golden-test-cases/general-games.nix.golden+15 test/golden-test-cases/generic-lens.cabal+123 test/golden-test-cases/generic-lens.nix.golden+16 test/golden-test-cases/genvalidity-aeson.cabal+51 test/golden-test-cases/genvalidity-aeson.nix.golden+21 test/golden-test-cases/genvalidity-hspec-aeson.cabal+63 test/golden-test-cases/genvalidity-hspec-aeson.nix.golden+20 test/golden-test-cases/genvalidity-hspec-binary.cabal+59 test/golden-test-cases/genvalidity-hspec-binary.nix.golden+15 test/golden-test-cases/genvalidity-scientific.cabal+48 test/golden-test-cases/genvalidity-scientific.nix.golden+17 test/golden-test-cases/genvalidity-uuid.cabal+48 test/golden-test-cases/genvalidity-uuid.nix.golden+17 test/golden-test-cases/ghc-syb-utils.cabal+51 test/golden-test-cases/ghc-syb-utils.nix.golden+13 test/golden-test-cases/ghcid.cabal+117 test/golden-test-cases/ghcid.nix.golden+25 test/golden-test-cases/giphy-api.cabal+94 test/golden-test-cases/giphy-api.nix.golden+24 test/golden-test-cases/github.cabal+202 test/golden-test-cases/github.nix.golden+30 test/golden-test-cases/gl.cabal+917 test/golden-test-cases/gl.nix.golden+17 test/golden-test-cases/gogol-adexchange-buyer.cabal+85 test/golden-test-cases/gogol-adexchange-buyer.nix.golden+11 test/golden-test-cases/gogol-admin-emailmigration.cabal+46 test/golden-test-cases/gogol-admin-emailmigration.nix.golden+11 test/golden-test-cases/gogol-affiliates.cabal+55 test/golden-test-cases/gogol-affiliates.nix.golden+11 test/golden-test-cases/gogol-apps-tasks.cabal+59 test/golden-test-cases/gogol-apps-tasks.nix.golden+11 test/golden-test-cases/gogol-appstate.cabal+50 test/golden-test-cases/gogol-appstate.nix.golden+11 test/golden-test-cases/gogol-blogger.cabal+82 test/golden-test-cases/gogol-blogger.nix.golden+11 test/golden-test-cases/gogol-datastore.cabal+52 test/golden-test-cases/gogol-datastore.nix.golden+11 test/golden-test-cases/gogol-dfareporting.cabal+249 test/golden-test-cases/gogol-dfareporting.nix.golden+11 test/golden-test-cases/gogol-firebase-rules.cabal+56 test/golden-test-cases/gogol-firebase-rules.nix.golden+11 test/golden-test-cases/gogol-gmail.cabal+102 test/golden-test-cases/gogol-gmail.nix.golden+11 test/golden-test-cases/gogol-kgsearch.cabal+46 test/golden-test-cases/gogol-kgsearch.nix.golden+11 test/golden-test-cases/gogol-maps-engine.cabal+123 test/golden-test-cases/gogol-maps-engine.nix.golden+11 test/golden-test-cases/gogol-plus.cabal+54 test/golden-test-cases/gogol-plus.nix.golden+11 test/golden-test-cases/gogol-resourceviews.cabal+61 test/golden-test-cases/gogol-resourceviews.nix.golden+11 test/golden-test-cases/gogol-translate.cabal+48 test/golden-test-cases/gogol-translate.nix.golden+11 test/golden-test-cases/gogol-webmaster-tools.cabal+58 test/golden-test-cases/gogol-webmaster-tools.nix.golden+11 test/golden-test-cases/gogol-youtube.cabal+117 test/golden-test-cases/gogol-youtube.nix.golden+11 test/golden-test-cases/groundhog-mysql.cabal+32 test/golden-test-cases/groundhog-mysql.nix.golden+15 test/golden-test-cases/gsasl.cabal+38 test/golden-test-cases/gsasl.nix.golden+11 test/golden-test-cases/hOpenPGP.cabal+342 test/golden-test-cases/hOpenPGP.nix.golden+49 test/golden-test-cases/hPDB-examples.cabal+97 test/golden-test-cases/hPDB-examples.nix.golden+24 test/golden-test-cases/haddock-library.cabal+130 test/golden-test-cases/haddock-library.nix.golden+17 test/golden-test-cases/hakyll.cabal+321 test/golden-test-cases/hakyll.nix.golden+42 test/golden-test-cases/happstack-hsp.cabal+37 test/golden-test-cases/happstack-hsp.nix.golden+15 test/golden-test-cases/happy.cabal+180 test/golden-test-cases/happy.nix.golden+16 test/golden-test-cases/harp.cabal+31 test/golden-test-cases/harp.nix.golden+10 test/golden-test-cases/hashtables.cabal+199 test/golden-test-cases/hashtables.nix.golden+13 test/golden-test-cases/haskell-tools-debug.cabal+38 test/golden-test-cases/haskell-tools-debug.nix.golden+22 test/golden-test-cases/haskell-tools-rewrite.cabal+64 test/golden-test-cases/haskell-tools-rewrite.nix.golden+20 test/golden-test-cases/hasql.cabal+205 test/golden-test-cases/hasql.nix.golden+27 test/golden-test-cases/hformat.cabal+45 test/golden-test-cases/hformat.nix.golden+15 test/golden-test-cases/highlighting-kate.cabal+276 test/golden-test-cases/highlighting-kate.nix.golden+22 test/golden-test-cases/hit.cabal+125 test/golden-test-cases/hit.nix.golden+24 test/golden-test-cases/hjson.cabal+19 test/golden-test-cases/hjson.nix.golden+9 test/golden-test-cases/hmpfr.cabal+83 test/golden-test-cases/hmpfr.nix.golden+12 test/golden-test-cases/hoogle.cabal+142 test/golden-test-cases/hoogle.nix.golden+30 test/golden-test-cases/hostname-validate.cabal+20 test/golden-test-cases/hostname-validate.nix.golden+9 test/golden-test-cases/hsinstall.cabal+45 test/golden-test-cases/hsinstall.nix.golden+13 test/golden-test-cases/hstatsd.cabal+24 test/golden-test-cases/hstatsd.nix.golden+10 test/golden-test-cases/hsx-jmacro.cabal+33 test/golden-test-cases/hsx-jmacro.nix.golden+14 test/golden-test-cases/hsyslog.cabal+77 test/golden-test-cases/hsyslog.nix.golden+14 test/golden-test-cases/htoml.cabal+89 test/golden-test-cases/htoml.nix.golden+24 test/golden-test-cases/http-conduit.cabal+82 test/golden-test-cases/http-conduit.nix.golden+29 test/golden-test-cases/http-link-header.cabal+74 test/golden-test-cases/http-link-header.nix.golden+23 test/golden-test-cases/http-media.cabal+128 test/golden-test-cases/http-media.nix.golden+19 test/golden-test-cases/hxt-charproperties.cabal+46 test/golden-test-cases/hxt-charproperties.nix.golden+10 test/golden-test-cases/hxt-expat.cabal+36 test/golden-test-cases/hxt-expat.nix.golden+11 test/golden-test-cases/hxt-tagsoup.cabal+42 test/golden-test-cases/hxt-tagsoup.nix.golden+15 test/golden-test-cases/iconv.cabal+34 test/golden-test-cases/iconv.nix.golden+9 test/golden-test-cases/incremental-parser.cabal+55 test/golden-test-cases/incremental-parser.nix.golden+19 test/golden-test-cases/indentation-core.cabal+39 test/golden-test-cases/indentation-core.nix.golden+10 test/golden-test-cases/indentation-parsec.cabal+70 test/golden-test-cases/indentation-parsec.nix.golden+13 test/golden-test-cases/inline-c-cpp.cabal+41 test/golden-test-cases/inline-c-cpp.nix.golden+14 test/golden-test-cases/integer-logarithms.cabal+111 test/golden-test-cases/integer-logarithms.nix.golden+17 test/golden-test-cases/intero.cabal+116 test/golden-test-cases/intero.nix.golden+24 test/golden-test-cases/invariant.cabal+69 test/golden-test-cases/invariant.nix.golden+21 test/golden-test-cases/io-machine.cabal+34 test/golden-test-cases/io-machine.nix.golden+11 test/golden-test-cases/io-streams-haproxy.cabal+78 test/golden-test-cases/io-streams-haproxy.nix.golden+19 test/golden-test-cases/ip.cabal+124 test/golden-test-cases/ip.nix.golden+24 test/golden-test-cases/iso639.cabal+26 test/golden-test-cases/iso639.nix.golden+10 test/golden-test-cases/iso8601-time.cabal+60 test/golden-test-cases/iso8601-time.nix.golden+11 test/golden-test-cases/jmacro-rpc-happstack.cabal+29 test/golden-test-cases/jmacro-rpc-happstack.nix.golden+15 test/golden-test-cases/jmacro-rpc.cabal+26 test/golden-test-cases/jmacro-rpc.nix.golden+17 test/golden-test-cases/jose.cabal+147 test/golden-test-cases/jose.nix.golden+30 test/golden-test-cases/katip-elasticsearch.cabal+114 test/golden-test-cases/katip-elasticsearch.nix.golden+30 test/golden-test-cases/katip.cabal+151 test/golden-test-cases/katip.nix.golden+35 test/golden-test-cases/katydid.cabal+89 test/golden-test-cases/katydid.nix.golden+21 test/golden-test-cases/kawhi.cabal+66 test/golden-test-cases/kawhi.nix.golden+22 test/golden-test-cases/kraken.cabal+41 test/golden-test-cases/kraken.nix.golden+13 test/golden-test-cases/l10n.cabal+29 test/golden-test-cases/l10n.nix.golden+10 test/golden-test-cases/lambdabot-social-plugins.cabal+60 test/golden-test-cases/lambdabot-social-plugins.nix.golden+14 test/golden-test-cases/lazy-csv.cabal+36 test/golden-test-cases/lazy-csv.nix.golden+13 test/golden-test-cases/lens-aeson.cabal+80 test/golden-test-cases/lens-aeson.nix.golden+21 test/golden-test-cases/lens.cabal+503 test/golden-test-cases/lens.nix.golden+39 test/golden-test-cases/libgit.cabal+29 test/golden-test-cases/libgit.nix.golden+10 test/golden-test-cases/librato.cabal+52 test/golden-test-cases/librato.nix.golden+17 test/golden-test-cases/lifted-async.cabal+115 test/golden-test-cases/lifted-async.nix.golden+20 test/golden-test-cases/lmdb.cabal+51 test/golden-test-cases/lmdb.nix.golden+11 test/golden-test-cases/logging-effect-extra-file.cabal+63 test/golden-test-cases/logging-effect-extra-file.nix.golden+17 test/golden-test-cases/lucid.cabal+75 test/golden-test-cases/lucid.nix.golden+22 test/golden-test-cases/mainland-pretty.cabal+40 test/golden-test-cases/mainland-pretty.nix.golden+14 test/golden-test-cases/matrices.cabal+73 test/golden-test-cases/matrices.nix.golden+15 test/golden-test-cases/median-stream.cabal+38 test/golden-test-cases/median-stream.nix.golden+11 test/golden-test-cases/megaparsec.cabal+142 test/golden-test-cases/megaparsec.nix.golden+22 test/golden-test-cases/mersenne-random.cabal+111 test/golden-test-cases/mersenne-random.nix.golden+10 test/golden-test-cases/messagepack.cabal+48 test/golden-test-cases/messagepack.nix.golden+19 test/golden-test-cases/microlens-ghc.cabal+44 test/golden-test-cases/microlens-ghc.nix.golden+14 test/golden-test-cases/microlens.cabal+71 test/golden-test-cases/microlens.nix.golden+10 test/golden-test-cases/minio-hs.cabal+245 test/golden-test-cases/minio-hs.nix.golden+34 test/golden-test-cases/mmorph.cabal+28 test/golden-test-cases/mmorph.nix.golden+13 test/golden-test-cases/mnist-idx.cabal+83 test/golden-test-cases/mnist-idx.nix.golden+13 test/golden-test-cases/mole.cabal+98 test/golden-test-cases/mole.nix.golden+26 test/golden-test-cases/monad-products.cabal+30 test/golden-test-cases/monad-products.nix.golden+10 test/golden-test-cases/monadcryptorandom.cabal+41 test/golden-test-cases/monadcryptorandom.nix.golden+15 test/golden-test-cases/monadloc.cabal+43 test/golden-test-cases/monadloc.nix.golden+10 test/golden-test-cases/mongoDB.cabal+117 test/golden-test-cases/mongoDB.nix.golden+29 test/golden-test-cases/monoid-extras.cabal+57 test/golden-test-cases/monoid-extras.nix.golden+12 test/golden-test-cases/mwc-random-monad.cabal+41 test/golden-test-cases/mwc-random-monad.nix.golden+13 test/golden-test-cases/mwc-random.cabal+88 test/golden-test-cases/mwc-random.nix.golden+15 test/golden-test-cases/nanospec.cabal+45 test/golden-test-cases/nanospec.nix.golden+10 test/golden-test-cases/netpbm.cabal+166 test/golden-test-cases/netpbm.nix.golden+18 test/golden-test-cases/network-protocol-xmpp.cabal+57 test/golden-test-cases/network-protocol-xmpp.nix.golden+15 test/golden-test-cases/network-transport-tcp.cabal+93 test/golden-test-cases/network-transport-tcp.nix.golden+17 test/golden-test-cases/nix-paths.cabal+37 test/golden-test-cases/nix-paths.nix.golden+11 test/golden-test-cases/nvim-hs.cabal+201 test/golden-test-cases/nvim-hs.nix.golden+39 test/golden-test-cases/once.cabal+30 test/golden-test-cases/once.nix.golden+14 test/golden-test-cases/one-liner.cabal+50 test/golden-test-cases/one-liner.nix.golden+16 test/golden-test-cases/online.cabal+85 test/golden-test-cases/online.nix.golden+14 test/golden-test-cases/opencv.cabal+263 test/golden-test-cases/opencv.nix.golden+30 test/golden-test-cases/openexr-write.cabal+52 test/golden-test-cases/openexr-write.nix.golden+17 test/golden-test-cases/openpgp-asciiarmor.cabal+62 test/golden-test-cases/openpgp-asciiarmor.nix.golden+19 test/golden-test-cases/pager.cabal+69 test/golden-test-cases/pager.nix.golden+20 test/golden-test-cases/partial-isomorphisms.cabal+50 test/golden-test-cases/partial-isomorphisms.nix.golden+10 test/golden-test-cases/partial-semigroup.cabal+154 test/golden-test-cases/partial-semigroup.nix.golden+11 test/golden-test-cases/pathtype.cabal+150 test/golden-test-cases/pathtype.nix.golden+18 test/golden-test-cases/pcap.cabal+39 test/golden-test-cases/pcap.nix.golden+10 test/golden-test-cases/pdfinfo.cabal+30 test/golden-test-cases/pdfinfo.nix.golden+14 test/golden-test-cases/pell.cabal+54 test/golden-test-cases/pell.nix.golden+16 test/golden-test-cases/persistable-types-HDBC-pg.cabal+42 test/golden-test-cases/persistable-types-HDBC-pg.nix.golden+16 test/golden-test-cases/persistent-mysql-haskell.cabal+66 test/golden-test-cases/persistent-mysql-haskell.nix.golden+23 test/golden-test-cases/picosat.cabal+72 test/golden-test-cases/picosat.nix.golden+13 test/golden-test-cases/pinch.cabal+111 test/golden-test-cases/pinch.nix.golden+21 test/golden-test-cases/pipes-network.cabal+51 test/golden-test-cases/pipes-network.nix.golden+15 test/golden-test-cases/pipes-safe.cabal+52 test/golden-test-cases/pipes-safe.nix.golden+14 test/golden-test-cases/pointed.cabal+98 test/golden-test-cases/pointed.nix.golden+17 test/golden-test-cases/poly-arity.cabal+23 test/golden-test-cases/poly-arity.nix.golden+9 test/golden-test-cases/polynomials-bernstein.cabal+22 test/golden-test-cases/polynomials-bernstein.nix.golden+9 test/golden-test-cases/postgresql-simple-url.cabal+43 test/golden-test-cases/postgresql-simple-url.nix.golden+17 test/golden-test-cases/prelude-safeenum.cabal+59 test/golden-test-cases/prelude-safeenum.nix.golden+10 test/golden-test-cases/presburger.cabal+32 test/golden-test-cases/presburger.nix.golden+11 test/golden-test-cases/prettyclass.cabal+15 test/golden-test-cases/prettyclass.nix.golden+9 test/golden-test-cases/prettyprinter-compat-ansi-wl-pprint.cabal+36 test/golden-test-cases/prettyprinter-compat-ansi-wl-pprint.nix.golden+14 test/golden-test-cases/prettyprinter-compat-wl-pprint.cabal+35 test/golden-test-cases/prettyprinter-compat-wl-pprint.nix.golden+10 test/golden-test-cases/primitive.cabal+76 test/golden-test-cases/primitive.nix.golden+11 test/golden-test-cases/product-profunctors.cabal+53 test/golden-test-cases/product-profunctors.nix.golden+15 test/golden-test-cases/profiterole.cabal+44 test/golden-test-cases/profiterole.nix.golden+17 test/golden-test-cases/projectroot.cabal+43 test/golden-test-cases/projectroot.nix.golden+11 test/golden-test-cases/proto-lens-optparse.cabal+26 test/golden-test-cases/proto-lens-optparse.nix.golden+14 test/golden-test-cases/proto-lens.cabal+45 test/golden-test-cases/proto-lens.nix.golden+16 test/golden-test-cases/psqueues.cabal+156 test/golden-test-cases/psqueues.nix.golden+22 test/golden-test-cases/pusher-http-haskell.cabal+92 test/golden-test-cases/pusher-http-haskell.nix.golden+23 test/golden-test-cases/quickcheck-arbitrary-adt.cabal+40 test/golden-test-cases/quickcheck-arbitrary-adt.nix.golden+15 test/golden-test-cases/quickcheck-combinators.cabal+43 test/golden-test-cases/quickcheck-combinators.nix.golden+9 test/golden-test-cases/rank1dynamic.cabal+43 test/golden-test-cases/rank1dynamic.nix.golden+15 test/golden-test-cases/rasterific-svg.cabal+74 test/golden-test-cases/rasterific-svg.nix.golden+23 test/golden-test-cases/ratio-int.cabal+25 test/golden-test-cases/ratio-int.nix.golden+10 test/golden-test-cases/rawstring-qm.cabal+34 test/golden-test-cases/rawstring-qm.nix.golden+10 test/golden-test-cases/reactive-banana.cabal+88 test/golden-test-cases/reactive-banana.nix.golden+20 test/golden-test-cases/readline.cabal+33 test/golden-test-cases/readline.nix.golden+10 test/golden-test-cases/rebase.cabal+372 test/golden-test-cases/rebase.nix.golden+20 test/golden-test-cases/reform-blaze.cabal+29 test/golden-test-cases/reform-blaze.nix.golden+14 test/golden-test-cases/reform-hsp.cabal+28 test/golden-test-cases/reform-hsp.nix.golden+10 test/golden-test-cases/regex-compat.cabal+36 test/golden-test-cases/regex-compat.nix.golden+10 test/golden-test-cases/regex-pcre.cabal+68 test/golden-test-cases/regex-pcre.nix.golden+15 test/golden-test-cases/relational-query.cabal+171 test/golden-test-cases/relational-query.nix.golden+21 test/golden-test-cases/relational-schemas.cabal+100 test/golden-test-cases/relational-schemas.nix.golden+14 test/golden-test-cases/repa-io.cabal+40 test/golden-test-cases/repa-io.nix.golden+14 test/golden-test-cases/repa.cabal+98 test/golden-test-cases/repa.nix.golden+14 test/golden-test-cases/rosezipper.cabal+16 test/golden-test-cases/rosezipper.nix.golden+9 test/golden-test-cases/rvar.cabal+59 test/golden-test-cases/rvar.nix.golden+14 test/golden-test-cases/scalpel-core.cabal+87 test/golden-test-cases/scalpel-core.nix.golden+18 test/golden-test-cases/sdl2.cabal+452 test/golden-test-cases/sdl2.nix.golden+18 test/golden-test-cases/selda-sqlite.cabal+38 test/golden-test-cases/selda-sqlite.nix.golden+14 test/golden-test-cases/selda.cabal+110 test/golden-test-cases/selda.nix.golden+15 test/golden-test-cases/servant-checked-exceptions.cabal+145 test/golden-test-cases/servant-checked-exceptions.nix.golden+23 test/golden-test-cases/set-cover.cabal+253 test/golden-test-cases/set-cover.nix.golden+16 test/golden-test-cases/sets.cabal+85 test/golden-test-cases/sets.nix.golden+27 test/golden-test-cases/simple-smt.cabal+24 test/golden-test-cases/simple-smt.nix.golden+9 test/golden-test-cases/slack-web.cabal+97 test/golden-test-cases/slack-web.nix.golden+21 test/golden-test-cases/slug.cabal+65 test/golden-test-cases/slug.nix.golden+18 test/golden-test-cases/soxlib.cabal+70 test/golden-test-cases/soxlib.nix.golden+19 test/golden-test-cases/speedy-slice.cabal+80 test/golden-test-cases/speedy-slice.nix.golden+16 test/golden-test-cases/splice.cabal+66 test/golden-test-cases/splice.nix.golden+10 test/golden-test-cases/spreadsheet.cabal+108 test/golden-test-cases/spreadsheet.nix.golden+16 test/golden-test-cases/stack-type.cabal+25 test/golden-test-cases/stack-type.nix.golden+10 test/golden-test-cases/state-codes.cabal+60 test/golden-test-cases/state-codes.nix.golden+13 test/golden-test-cases/stb-image-redux.cabal+45 test/golden-test-cases/stb-image-redux.nix.golden+11 test/golden-test-cases/stm-containers.cabal+251 test/golden-test-cases/stm-containers.nix.golden+27 test/golden-test-cases/streaming-commons.cabal+161 test/golden-test-cases/streaming-commons.nix.golden+23 test/golden-test-cases/strict-base-types.cabal+130 test/golden-test-cases/strict-base-types.nix.golden+15 test/golden-test-cases/strict-types.cabal+34 test/golden-test-cases/strict-types.nix.golden+15 test/golden-test-cases/string-class.cabal+60 test/golden-test-cases/string-class.nix.golden+10 test/golden-test-cases/stripe-haskell.cabal+35 test/golden-test-cases/stripe-haskell.nix.golden+10 test/golden-test-cases/svg-tree.cabal+61 test/golden-test-cases/svg-tree.nix.golden+15 test/golden-test-cases/swagger.cabal+61 test/golden-test-cases/swagger.nix.golden+15 test/golden-test-cases/system-argv0.cabal+42 test/golden-test-cases/system-argv0.nix.golden+10 test/golden-test-cases/system-fileio.cabal+91 test/golden-test-cases/system-fileio.nix.golden+18 test/golden-test-cases/system-filepath.cabal+61 test/golden-test-cases/system-filepath.nix.golden+15 test/golden-test-cases/tagged.cabal+67 test/golden-test-cases/tagged.nix.golden+14 test/golden-test-cases/taggy.cabal+140 test/golden-test-cases/taggy.nix.golden+27 test/golden-test-cases/tagstream-conduit.cabal+62 test/golden-test-cases/tagstream-conduit.nix.golden+20 test/golden-test-cases/tasty-hedgehog.cabal+41 test/golden-test-cases/tasty-hedgehog.nix.golden+15 test/golden-test-cases/tasty-rerun.cabal+87 test/golden-test-cases/tasty-rerun.nix.golden+15 test/golden-test-cases/tce-conf.cabal+66 test/golden-test-cases/tce-conf.nix.golden+14 test/golden-test-cases/terminal-progress-bar.cabal+69 test/golden-test-cases/terminal-progress-bar.nix.golden+17 test/golden-test-cases/test-fixture.cabal+78 test/golden-test-cases/test-fixture.nix.golden+20 test/golden-test-cases/texmath.cabal+156 test/golden-test-cases/texmath.nix.golden+21 test/golden-test-cases/text-icu.cabal+118 test/golden-test-cases/text-icu.nix.golden+19 test/golden-test-cases/text-postgresql.cabal+50 test/golden-test-cases/text-postgresql.nix.golden+15 test/golden-test-cases/th-expand-syns.cabal+39 test/golden-test-cases/th-expand-syns.nix.golden+11 test/golden-test-cases/these.cabal+90 test/golden-test-cases/these.nix.golden+24 test/golden-test-cases/timezone-series.cabal+57 test/golden-test-cases/timezone-series.nix.golden+10 test/golden-test-cases/transformers-compat.cabal+99 test/golden-test-cases/transformers-compat.nix.golden+10 test/golden-test-cases/transformers-lift.cabal+36 test/golden-test-cases/transformers-lift.nix.golden+12 test/golden-test-cases/tree-fun.cabal+70 test/golden-test-cases/tree-fun.nix.golden+9 test/golden-test-cases/ttrie.cabal+68 test/golden-test-cases/ttrie.nix.golden+26 test/golden-test-cases/tuple-th.cabal+23 test/golden-test-cases/tuple-th.nix.golden+9 test/golden-test-cases/tuples-homogenous-h98.cabal+59 test/golden-test-cases/tuples-homogenous-h98.nix.golden+10 test/golden-test-cases/turtle-options.cabal+56 test/golden-test-cases/turtle-options.nix.golden+16 test/golden-test-cases/type-operators.cabal+26 test/golden-test-cases/type-operators.nix.golden+10 test/golden-test-cases/type-spec.cabal+102 test/golden-test-cases/type-spec.nix.golden+11 test/golden-test-cases/unicode-show.cabal+48 test/golden-test-cases/unicode-show.nix.golden+16 test/golden-test-cases/unique.cabal+31 test/golden-test-cases/unique.nix.golden+10 test/golden-test-cases/unix-bytestring.cabal+62 test/golden-test-cases/unix-bytestring.nix.golden+10 test/golden-test-cases/unlit.cabal+44 test/golden-test-cases/unlit.nix.golden+12 test/golden-test-cases/utility-ht.cabal+108 test/golden-test-cases/utility-ht.nix.golden+10 test/golden-test-cases/validity-aeson.cabal+33 test/golden-test-cases/validity-aeson.nix.golden+15 test/golden-test-cases/validity-containers.cabal+33 test/golden-test-cases/validity-containers.nix.golden+10 test/golden-test-cases/vector-mmap.cabal+33 test/golden-test-cases/vector-mmap.nix.golden+13 test/golden-test-cases/vivid-supercollider.cabal+69 test/golden-test-cases/vivid-supercollider.nix.golden+17 test/golden-test-cases/vty.cabal+624 test/golden-test-cases/vty.nix.golden+33 test/golden-test-cases/wai-cors.cabal+168 test/golden-test-cases/wai-cors.nix.golden+23 test/golden-test-cases/wai-middleware-auth.cabal+75 test/golden-test-cases/wai-middleware-auth.nix.golden+28 test/golden-test-cases/wai-middleware-caching-redis.cabal+40 test/golden-test-cases/wai-middleware-caching-redis.nix.golden+16 test/golden-test-cases/wai-middleware-prometheus.cabal+46 test/golden-test-cases/wai-middleware-prometheus.nix.golden+16 test/golden-test-cases/warp.cabal+208 test/golden-test-cases/warp.nix.golden+34 test/golden-test-cases/weigh.cabal+60 test/golden-test-cases/weigh.nix.golden+15 test/golden-test-cases/xml-hamlet.cabal+44 test/golden-test-cases/xml-hamlet.nix.golden+19 test/golden-test-cases/xmonad-contrib.cabal+338 test/golden-test-cases/xmonad-contrib.nix.golden+17 test/golden-test-cases/yahoo-finance-api.cabal+71 test/golden-test-cases/yahoo-finance-api.nix.golden+20 test/golden-test-cases/yesod-form-bootstrap4.cabal+31 test/golden-test-cases/yesod-form-bootstrap4.nix.golden+10 test/golden-test-cases/yesod-gitrepo.cabal+28 test/golden-test-cases/yesod-gitrepo.nix.golden+15 test/golden-test-cases/yesod-recaptcha2.cabal+37 test/golden-test-cases/yesod-recaptcha2.nix.golden+14 test/golden-test-cases/zlib.cabal+97 test/golden-test-cases/zlib.nix.golden+15 update-hackage-snapshot.sh+19 update-nixpkgs.sh+11−12 update-stackage.sh+53
.gitignore+15−5
@@ -1,20 +1,30 @@
11# ignore build Cabal build files
22
3+/.cabal-sandbox
4+/.ghc.environment.*
35/Setup
46/Setup.hi
57/Setup.o
6−/dist/*
8+/cabal.sandbox.config
9+/dist
10+/dist-newstyle
711
812# vim tmp files
913
1014*.swo
1115*.swp
1216
17+# haskell-mode generates files, too
18+
19+TAGS
20+
21+# ignore stack build directory
22+
23+.stack-work
24+/src/highlight.js
25+/src/style.css
26+
1327# hackage2nix ususally needs those two repositories around
1428
1529/hackage/*
1630/nixpkgs/*
17−
18−# haskell-mode generates files, too
19−
20−TAGS
.travis.yml+158−23
@@ -1,26 +1,161 @@
1−# .travis.yml
2−
3−env:
4− - CABALVER=1.22 GHCVER=7.10.2
5−
1+# This Travis job script has been generated by a script via
2+#
3+# haskell-ci '--installed=+all -Cabal' '--hlint' '--doctest' '--doctest-options=-i ../dist-newstyle/build/*/*/cabal2nix-*/build/autogen' '-o' '.travis.yml' 'cabal2nix.cabal' '--head-hackage' '--head-hackage-jobs' '> 8.8'
4+#
5+# For more information, see https://github.com/haskell-CI/haskell-ci
6+#
7+# version: 0.9.20200306
8+#
9+version: ~> 1.0
10+language: c
11+os: linux
12+dist: xenial
13+git:
14+ # whether to recursively clone submodules
15+ submodules: false
16+cache:
17+ directories:
18+ - $HOME/.cabal/packages
19+ - $HOME/.cabal/store
20+ - $HOME/.hlint
21+before_cache:
22+ - rm -fv $CABALHOME/packages/hackage.haskell.org/build-reports.log
23+ # remove files that are regenerated by 'cabal update'
24+ - rm -fv $CABALHOME/packages/hackage.haskell.org/00-index.*
25+ - rm -fv $CABALHOME/packages/hackage.haskell.org/*.json
26+ - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.cache
27+ - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.tar
28+ - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.tar.idx
29+ - rm -rfv $CABALHOME/packages/head.hackage
30+jobs:
31+ include:
32+ - compiler: ghc-8.10.1
33+ addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.10.1","cabal-install-3.2"]}}
34+ os: linux
35+ - compiler: ghc-8.8.3
36+ addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.8.3","cabal-install-3.0"]}}
37+ os: linux
38+ - compiler: ghc-8.6.5
39+ addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.6.5","cabal-install-3.0"]}}
40+ os: linux
41+ allow_failures:
42+ - compiler: ghc-8.8.3
43+ - compiler: ghc-8.10.1
644before_install:
7− - travis_retry sudo add-apt-repository -y ppa:hvr/ghc
8− - travis_retry sudo apt-get update
9− - travis_retry sudo apt-get install cabal-install-$CABALVER ghc-$GHCVER happy alex
10− - export PATH=/opt/ghc/$GHCVER/bin:/opt/cabal/$CABALVER/bin:$PATH
11−
45+ - HC=$(echo "/opt/$CC/bin/ghc" | sed 's/-/\//')
46+ - WITHCOMPILER="-w $HC"
47+ - HADDOCK=$(echo "/opt/$CC/bin/haddock" | sed 's/-/\//')
48+ - HCPKG="$HC-pkg"
49+ - unset CC
50+ - CABAL=/opt/ghc/bin/cabal
51+ - CABALHOME=$HOME/.cabal
52+ - export PATH="$CABALHOME/bin:$PATH"
53+ - TOP=$(pwd)
54+ - "HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\\d+)\\.(\\d+)\\.(\\d+)(\\.(\\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')"
55+ - echo $HCNUMVER
56+ - CABAL="$CABAL -vnormal+nowrap"
57+ - set -o pipefail
58+ - TEST=--enable-tests
59+ - BENCH=--enable-benchmarks
60+ - HEADHACKAGE=false
61+ - if [ $HCNUMVER -ge 80800 ] ; then HEADHACKAGE=true ; fi
62+ - rm -f $CABALHOME/config
63+ - |
64+ echo "verbose: normal +nowrap +markoutput" >> $CABALHOME/config
65+ echo "remote-build-reporting: anonymous" >> $CABALHOME/config
66+ echo "write-ghc-environment-files: always" >> $CABALHOME/config
67+ echo "remote-repo-cache: $CABALHOME/packages" >> $CABALHOME/config
68+ echo "logs-dir: $CABALHOME/logs" >> $CABALHOME/config
69+ echo "world-file: $CABALHOME/world" >> $CABALHOME/config
70+ echo "extra-prog-path: $CABALHOME/bin" >> $CABALHOME/config
71+ echo "symlink-bindir: $CABALHOME/bin" >> $CABALHOME/config
72+ echo "installdir: $CABALHOME/bin" >> $CABALHOME/config
73+ echo "build-summary: $CABALHOME/logs/build.log" >> $CABALHOME/config
74+ echo "store-dir: $CABALHOME/store" >> $CABALHOME/config
75+ echo "install-dirs user" >> $CABALHOME/config
76+ echo " prefix: $CABALHOME" >> $CABALHOME/config
77+ echo "repository hackage.haskell.org" >> $CABALHOME/config
78+ echo " url: http://hackage.haskell.org/" >> $CABALHOME/config
79+ - |
80+ if $HEADHACKAGE; then
81+ echo "allow-newer: $($HCPKG list --simple-output | sed -E 's/([a-zA-Z-]+)-[0-9.]+/*:\1/g')" >> $CABALHOME/config
82+ echo "repository head.hackage.ghc.haskell.org" >> $CABALHOME/config
83+ echo " url: https://ghc.gitlab.haskell.org/head.hackage/" >> $CABALHOME/config
84+ echo " secure: True" >> $CABALHOME/config
85+ echo " root-keys: 7541f32a4ccca4f97aea3b22f5e593ba2c0267546016b992dfadcd2fe944e55d" >> $CABALHOME/config
86+ echo " 26021a13b401500c8eb2761ca95c61f2d625bfef951b939a8124ed12ecf07329" >> $CABALHOME/config
87+ echo " f76d08be13e9a61a377a85e2fb63f4c5435d40f8feb3e12eb05905edb8cdea89" >> $CABALHOME/config
88+ echo " key-threshold: 3" >> $CABALHOME/config
89+ fi
1290install:
13− - cabal --version
14− - echo "$(ghc --version) [$(ghc --print-project-git-commit-id 2> /dev/null || echo '?')]"
15− - travis_retry cabal update
16− - cabal install -j --only-dependencies --enable-tests
17−
91+ - ${CABAL} --version
92+ - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]"
93+ - |
94+ echo "program-default-options" >> $CABALHOME/config
95+ echo " ghc-options: $GHCJOBS +RTS -M6G -RTS" >> $CABALHOME/config
96+ - cat $CABALHOME/config
97+ - rm -fv cabal.project cabal.project.local cabal.project.freeze
98+ - travis_retry ${CABAL} v2-update -v
99+ - (cd /tmp && ${CABAL} v2-install $WITHCOMPILER -j2 doctest --constraint='doctest ==0.16.2.*')
100+ - if [ $HCNUMVER -lt 80800 ] ; then HLINTVER=$(cd /tmp && (${CABAL} v2-install -v $WITHCOMPILER --dry-run hlint --constraint='hlint ==2.2.*' | perl -ne 'if (/\bhlint-(\d+(\.\d+)*)\b/) { print "$1"; last; }')); echo "HLint version $HLINTVER" ; fi
101+ - "if [ $HCNUMVER -lt 80800 ] ; then if [ ! -e $HOME/.hlint/hlint-$HLINTVER/hlint ]; then echo \"Downloading HLint version $HLINTVER\"; mkdir -p $HOME/.hlint; curl --write-out 'Status Code: %{http_code} Redirects: %{num_redirects} Total time: %{time_total} Total Dsize: %{size_download}\\n' --silent --location --output $HOME/.hlint/hlint-$HLINTVER.tar.gz \"https://github.com/ndmitchell/hlint/releases/download/v$HLINTVER/hlint-$HLINTVER-x86_64-linux.tar.gz\"; tar -xzv -f $HOME/.hlint/hlint-$HLINTVER.tar.gz -C $HOME/.hlint; fi ; fi"
102+ - if [ $HCNUMVER -lt 80800 ] ; then mkdir -p $CABALHOME/bin && ln -sf "$HOME/.hlint/hlint-$HLINTVER/hlint" $CABALHOME/bin/hlint ; fi
103+ - if [ $HCNUMVER -lt 80800 ] ; then hlint --version ; fi
104+ # Generate cabal.project
105+ - rm -rf cabal.project cabal.project.local cabal.project.freeze
106+ - touch cabal.project
107+ - |
108+ echo "packages: ." >> cabal.project
109+ - |
110+ - "for pkg in $($HCPKG list --simple-output); do echo $pkg | sed 's/-[^-]*$//' | (grep -vE -- '^(Cabal|cabal2nix)$' || true) | sed 's/^/constraints: /' | sed 's/$/ installed/' >> cabal.project.local; done"
111+ - cat cabal.project || true
112+ - cat cabal.project.local || true
113+ - if [ -f "./configure.ac" ]; then (cd "." && autoreconf -i); fi
114+ - ${CABAL} v2-freeze $WITHCOMPILER ${TEST} ${BENCH}
115+ - "cat cabal.project.freeze | sed -E 's/^(constraints: *| *)//' | sed 's/any.//'"
116+ - rm cabal.project.freeze
117+ - travis_wait 40 ${CABAL} v2-build $WITHCOMPILER ${TEST} ${BENCH} --dep -j2 all
118+ - travis_wait 40 ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks --dep -j2 all
18119script:
19− - cabal check
20− - cabal configure
21− - cabal sdist
22− - tar xf dist/cabal2nix-*.tar.gz
23− - cd cabal2nix-*
24− - cabal configure -v --enable-tests --ghc-option=-Wall --ghc-option=-Werror --ghc-option=-j
25− - cabal build -j
26− - cabal test -j
120+ - DISTDIR=$(mktemp -d /tmp/dist-test.XXXX)
121+ # Packaging...
122+ - ${CABAL} v2-sdist all
123+ # Unpacking...
124+ - mv dist-newstyle/sdist/*.tar.gz ${DISTDIR}/
125+ - cd ${DISTDIR} || false
126+ - find . -maxdepth 1 -type f -name '*.tar.gz' -exec tar -xvf '{}' \;
127+ - find . -maxdepth 1 -type f -name '*.tar.gz' -exec rm '{}' \;
128+ - PKGDIR_cabal2nix="$(find . -maxdepth 1 -type d -regex '.*/cabal2nix-[0-9.]*')"
129+ # Generate cabal.project
130+ - rm -rf cabal.project cabal.project.local cabal.project.freeze
131+ - touch cabal.project
132+ - |
133+ echo "packages: ${PKGDIR_cabal2nix}" >> cabal.project
134+ - |
135+ - "for pkg in $($HCPKG list --simple-output); do echo $pkg | sed 's/-[^-]*$//' | (grep -vE -- '^(Cabal|cabal2nix)$' || true) | sed 's/^/constraints: /' | sed 's/$/ installed/' >> cabal.project.local; done"
136+ - cat cabal.project || true
137+ - cat cabal.project.local || true
138+ # Building...
139+ # this builds all libraries and executables (without tests/benchmarks)
140+ - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks all
141+ # Building with tests and benchmarks...
142+ # build & run tests, build benchmarks
143+ - ${CABAL} v2-build $WITHCOMPILER ${TEST} ${BENCH} all
144+ # Testing...
145+ - ${CABAL} v2-test $WITHCOMPILER ${TEST} ${BENCH} all
146+ # Doctest...
147+ - (cd ${PKGDIR_cabal2nix} && doctest -i ../dist-newstyle/build/*/*/cabal2nix-*/build/autogen src)
148+ # HLint..
149+ - if [ $HCNUMVER -lt 80800 ] ; then (cd ${PKGDIR_cabal2nix} && hlint src) ; fi
150+ - if [ $HCNUMVER -lt 80800 ] ; then (cd ${PKGDIR_cabal2nix} && hlint hackage2nix) ; fi
151+ - if [ $HCNUMVER -lt 80800 ] ; then (cd ${PKGDIR_cabal2nix} && hlint cabal2nix) ; fi
152+ # cabal check...
153+ - (cd ${PKGDIR_cabal2nix} && ${CABAL} -vnormal check)
154+ # haddock...
155+ - ${CABAL} v2-haddock $WITHCOMPILER --with-haddock $HADDOCK ${TEST} ${BENCH} all
156+ # Building without installed constraints for packages in global-db...
157+ - rm -f cabal.project.local
158+ - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks all
159+
160+# REGENDATA ("0.9.20200306",["--installed=+all -Cabal","--hlint","--doctest","--doctest-options=-i ../dist-newstyle/build/*/*/cabal2nix-*/build/autogen","-o",".travis.yml","cabal2nix.cabal","--head-hackage","--head-hackage-jobs","> 8.8"])
161+# EOF
GNUmakefiledeleted−33
@@ -1,33 +0,0 @@
1−# GNUmakefile
2−
3−.PHONY: all configure build check haddock hlint clean packunused
4−
5−all:: check
6−
7−configure:: cabal2nix.cabal
8− @cabal -v0 configure --ghc-option=-j --enable-tests
9−
10−build:: configure
11− @cabal build -j
12−
13−check:: haddock
14− @cabal test -j
15−
16−haddock:: build
17− @cabal haddock --hyperlink-source
18−
19−hlint::
20− hlint src
21−
22−packunused::
23− @cabal clean
24− @find . -name "*.imports" -exec rm {} +
25− @cabal configure -O0 --disable-library-profiling
26− @cabal build --ghc-option=-ddump-minimal-imports
27− @packunused
28−
29−clean::
30− @rm -rf dist TAGS
31−
32−cabal2nix.cabal : package.yaml
33− @hpack >/dev/null
README.md+15−38
@@ -1,6 +1,11 @@
11Cabal2nix
22=========
33
4+[![hackage release](https://img.shields.io/hackage/v/cabal2nix.svg?label=hackage)](http://hackage.haskell.org/package/cabal2nix)
5+[![stackage LTS package](http://stackage.org/package/cabal2nix/badge/lts)](http://stackage.org/lts/package/cabal2nix)
6+[![stackage Nightly package](http://stackage.org/package/cabal2nix/badge/nightly)](http://stackage.org/nightly/package/cabal2nix)
7+[![travis build status](https://img.shields.io/travis/NixOS/cabal2nix/master.svg?label=travis+build)](https://travis-ci.org/NixOS/cabal2nix)
8+
49`cabal2nix` converts a single Cabal file into a single Nix build expression.
510For example:
611
@@ -10,29 +15,28 @@ For example:
1015 pname = "mtl";
1116 version = "2.2.1";
1217 sha256 = "1icdbj2rshzn0m1zz5wa7v3xvkf6qw811p4s7jgqwvx1ydwrvrfa";
13− buildDepends = [ base transformers ];
18+ libraryHaskellDepends = [ base transformers ];
1419 homepage = "http://github.com/ekmett/mtl";
1520 description = "Monad classes, using functional dependencies";
1621 license = stdenv.lib.licenses.bsd3;
1722 }
1823
19−
2024Cabal files can be referred to using the magic URL `cabal://NAME-VERSION`,
2125which will automatically download the file from Hackage. Alternatively, a
2226direct `http://host/path/pkg.cabal` URL can be provided, as well as a
2327`file:///local/path/pkg.cabal` URI that doesn't depend on network access.
2428However, if the source hash is not already in `cabal2nix`'s cache or provided
2529using the `--sha256` option, `cabal2nix` still needs to download the source
26−code to compute the hash, which obviously still causes network traffic. Run the
27−utility with `--help` to see the complete list of supported command line flags.
30+code to compute the hash, which still causes network traffic. Run the utility
31+with `--help` to see the complete list of supported command-line flags.
2832
29−Detailed instructions how to use those generated files with Nix can be found at
30−http://hydra.nixos.org/job/nixpkgs/trunk/manual/latest/download-by-type/doc/manual#users-guide-to-the-haskell-infrastructure.
33+Detailed instructions on how to use those generated files with Nix can be found at
34+https://nixos.org/nixpkgs/manual/#how-to-create-nix-builds-for-your-own-private-haskell-packages.
3135
3236`cabal2nix` can also build derivations for projects from other sources than
33−hackage. You only need to provide an URI that points to a cabal project. The
34−most common usecase for this is probably to generate a derivation for a project
35−on the local file system:
37+Hackage. You only need to provide a URI that points to a cabal project. The
38+most common use-case for this is probably to generate a derivation for a
39+project on the local file system:
3640
3741 $ cabal get mtl-2.2.1 && cd mtl-2.2.1
3842 $ cabal2nix .
@@ -41,7 +45,7 @@ on the local file system:
4145 pname = "mtl";
4246 version = "2.2.1";
4347 src = ./.;
44− buildDepends = [ base transformers ];
48+ libraryHaskellDepends = [ base transformers ];
4549 homepage = "http://github.com/ekmett/mtl";
4650 description = "Monad classes, using functional dependencies";
4751 license = stdenv.lib.licenses.bsd3;
@@ -50,35 +54,8 @@ on the local file system:
5054This derivation will not fetch from hackage, but instead use the directory which
5155contains the derivation as the source repository.
5256
53−`cabal2nix` currently supports the following respository types:
57+`cabal2nix` currently supports the following repository types:
5458
5559* directory
5660* source archive (zip, tar.gz, ...) from http or https URL or local file.
5761* git, mercurial, svn or bazaar repository
58−
59−How to compile this package
60−---------------------------
61−
62−The `cabal2nix.cabal` file for this package is automatically generated by the
63−`generate-cabal-file.hs` program. The easiest way to accomplish that is to run
64−
65− nix-shell release.nix -A cabal2nix.ghc7102.x86_64-linux.env --run "runhaskell generate-cabal-file.hs >cabal2nix.cabal"
66−
67−where `x86_64-linux` should be replaced with whatever system ID is appropriate
68−for your local machine. Basically, `generate-cabal-file.hs` requires the
69−[cartel](http://hackage.haskell.org/package/cartel) library and `git` to run.
70−
71−With the Cabal file in place, this is a normal Haskell project that can be
72−compiled with `cabal-install`.
73−
74−Users of Nix can build this package by running
75−
76− nix-build release.nix -A cabal2nix.ghc7102.x86_64-linux
77−
78−where, again, `x86_64-linux` should be replaced with the appropriate value.
79−This gives you an executable at `result/bin/cabal2nix`. If you'd like to
80−install the latest release version, then
81−
82− nix-env -f "<nixpkgs>" -iA cabal2nix
83−
84−is the way to go.
Setup.hsnew file+6
@@ -0,0 +1,6 @@
1+module Main (main) where
2+
3+import Distribution.Simple
4+
5+main :: IO ()
6+main = defaultMain
Setup.lhsdeleted−8
@@ -1,8 +0,0 @@
1−#!/usr/bin/env runhaskell
2−
3−> module Main (main) where
4−>
5−> import Distribution.Simple
6−>
7−> main :: IO ()
8−> main = defaultMain
cabal2nix.cabal+144−183
@@ -1,191 +1,152 @@
1−-- This file has been generated from package.yaml by hpack version 0.5.4.
2−--
3−-- see: https://github.com/sol/hpack
4−
5−name: cabal2nix
6−version: 2015.8.29
7−description: Convert Cabal files into Nix build instructions.
8−category: Distribution
9−homepage: https://github.com/nixos/cabal2nix#readme
10−bug-reports: https://github.com/nixos/cabal2nix/issues
11−cabal-version: >= 1.10
12−license: BSD3
13−license-file: LICENSE
14−build-type: Simple
15−maintainer: Peter Simons <simons@cryp.to>
16−synopsis: Convert Cabal files into Nix build instructions.
1+name: cabal2nix
2+version: 2.15.1
3+synopsis: Convert Cabal files into Nix build instructions.
4+description:
5+ Convert Cabal files into Nix build instructions. Users of Nix can install the latest
6+ version by running:
7+ .
8+ > nix-env -i cabal2nix
9+license: BSD3
10+license-file: LICENSE
11+author: Peter Simons, Andres Loeh, Benno Fünfstück, Mateusz Kowalczyk,
12+ Michael Alan Dorman, Tom Smalley, Mathijs Kwik, Shea Levy, Dmitry
13+ Malikov, Eric Seidel, Jacob Mitchell, Graham Christensen,
14+ Hamish Mackenzie, Nikolay Amiantov, Aycan iRiCAN, Bryan
15+ Gardiner, Joe Hermaszewski, John Wiegley, Philipp Hausmann,
16+ Spencer Janssen, Tom Hunger, William Casarin, koral,
17+ ksaric, Adam Vogt, Alexey Shmalko, Corey O'Connor, Cray
18+ Elliott, David Johnson, Dmitry Bushev, Domen Kožar, Felix
19+ Kunzmann, Gabriel Ebner, Gergely Risko, Joachim Fasting,
20+ John Albietz, John Chee, Jussi Maki, Lisanna Dettwyler,
21+ Mark Laws, Mark Wotton, Matthew Pickering, Matthew Stewart,
22+ Matvey Aksenov, Nicholas Clarke, Nicolas Rolland, Oliver
23+ Charles, Pascal Wittmann, Patrick John Wheeler, Phil de
24+ Joux, Piotr Bogdan, Profpatsch, Raymond Gauthier, Renzo
25+ Carbonara, Rodney Lorrimar, Sibi, Sukant Hajra, Tanner
26+ Doshier, Vaibhav Sagar, Viktar Basharymau, danbst, karsten
27+ gebbert, laMudri, Александр Цамутали
28+maintainer: Peter Simons <simons@cryp.to>
29+stability: stable
30+tested-with: GHC == 8.6.5, GHC == 8.8.3, GHC == 8.10.1
31+category: Distribution, Nix
32+homepage: https://github.com/nixos/cabal2nix#readme
33+bug-reports: https://github.com/nixos/cabal2nix/issues
34+build-type: Simple
35+extra-source-files: README.md
36+ test/golden-test-cases/*.cabal
37+ test/golden-test-cases/*.nix.golden
38+cabal-version: 1.24
1739
1840source-repository head
19− type: git
41+ type: git
2042 location: https://github.com/nixos/cabal2nix
2143
2244library
23− hs-source-dirs:
24− src
25− ghc-options: -Wall
26− build-depends:
27− base < 5
28− , Cabal >= 1.22.2
29− , SHA
30− , aeson
31− , ansi-wl-pprint
32− , base < 5
33− , bytestring
34− , containers
35− , data-default
36− , deepseq
37− , deepseq-generics
38− , directory
39− , doctest
40− , filepath
41− , hackage-db
42− , hspec
43− , lens
44− , monad-par
45− , monad-par-extras
46− , mtl
47− , optparse-applicative
48− , pretty >= 1.1.2
49− , process
50− , regex-posix
51− , split
52− , transformers
53− , utf8-string
54− exposed-modules:
55− Distribution.Nixpkgs.Fetch
56− Distribution.Nixpkgs.Haskell
57− Distribution.Nixpkgs.Haskell.BuildInfo
58− Distribution.Nixpkgs.Haskell.Constraint
59− Distribution.Nixpkgs.Haskell.Derivation
60− Distribution.Nixpkgs.Haskell.FromCabal
61− Distribution.Nixpkgs.Haskell.FromCabal.Configuration
62− Distribution.Nixpkgs.Haskell.FromCabal.Configuration.GHC7102
63− Distribution.Nixpkgs.Haskell.FromCabal.Configuration.Maintainers
64− Distribution.Nixpkgs.Haskell.FromCabal.Flags
65− Distribution.Nixpkgs.Haskell.FromCabal.License
66− Distribution.Nixpkgs.Haskell.FromCabal.Name
67− Distribution.Nixpkgs.Haskell.FromCabal.Normalize
68− Distribution.Nixpkgs.Haskell.FromCabal.PostProcess
69− Distribution.Nixpkgs.Haskell.Hackage
70− Distribution.Nixpkgs.Haskell.HackageGit
71− Distribution.Nixpkgs.Haskell.OrphanInstances
72− Distribution.Nixpkgs.License
73− Distribution.Nixpkgs.Meta
74− Distribution.Nixpkgs.PackageMap
75− Internal.HaskellPackage
76− Internal.Lens
77− Internal.PrettyPrinting
78− Language.Nix
79− Language.Nix.Binding
80− Language.Nix.Identifier
81− Language.Nix.Path
82− default-language: Haskell2010
83−
84−executable hackage2nix
85− main-is: Main.hs
86− hs-source-dirs:
87− hackage2nix
88− ghc-options: -Wall -threaded -rtsopts -with-rtsopts=-N
89− build-depends:
90− base < 5
91− , Cabal >= 1.22.2
92− , SHA
93− , aeson
94− , ansi-wl-pprint
95− , base < 5
96− , bytestring
97− , containers
98− , data-default
99− , deepseq
100− , deepseq-generics
101− , directory
102− , doctest
103− , filepath
104− , hackage-db
105− , hspec
106− , lens
107− , monad-par
108− , monad-par-extras
109− , mtl
110− , optparse-applicative
111− , pretty >= 1.1.2
112− , process
113− , regex-posix
114− , split
115− , transformers
116− , utf8-string
117− , cabal2nix
118− default-language: Haskell2010
45+ exposed-modules: Cabal2nix
46+ Distribution.Nixpkgs.Fetch
47+ Distribution.Nixpkgs.Haskell
48+ Distribution.Nixpkgs.Haskell.BuildInfo
49+ Distribution.Nixpkgs.Haskell.Constraint
50+ Distribution.Nixpkgs.Haskell.Derivation
51+ Distribution.Nixpkgs.Haskell.FromCabal
52+ Distribution.Nixpkgs.Haskell.FromCabal.Configuration
53+ Distribution.Nixpkgs.Haskell.FromCabal.Flags
54+ Distribution.Nixpkgs.Haskell.FromCabal.License
55+ Distribution.Nixpkgs.Haskell.FromCabal.Name
56+ Distribution.Nixpkgs.Haskell.FromCabal.Normalize
57+ Distribution.Nixpkgs.Haskell.FromCabal.PostProcess
58+ Distribution.Nixpkgs.Haskell.Hackage
59+ Distribution.Nixpkgs.Haskell.OrphanInstances
60+ Distribution.Nixpkgs.Haskell.PackageSourceSpec
61+ other-modules: Paths_cabal2nix
62+ hs-source-dirs: src
63+ build-depends: base > 4.11
64+ , Cabal == 3.0.*
65+ , aeson > 1
66+ , ansi-wl-pprint
67+ , bytestring
68+ , containers >= 0.5.9
69+ , deepseq >= 1.4
70+ , directory
71+ , distribution-nixpkgs >= 1.3.1
72+ , filepath
73+ , hackage-db >= 2.0.1
74+ , hopenssl >= 2
75+ , hpack >= 0.29.6
76+ , language-nix
77+ , lens
78+ , optparse-applicative
79+ , pretty >= 1.1.2
80+ , process
81+ , split
82+ , text
83+ , time
84+ , transformers
85+ , yaml
86+ default-language: Haskell2010
87+ other-extensions: MultiParamTypeClasses
88+ ScopedTypeVariables
89+ FlexibleInstances
90+ CPP
91+ TemplateHaskell
92+ StandaloneDeriving
93+ RecordWildCards
94+ OverloadedStrings
95+ DeriveGeneric
96+ ghc-options: -Wall -Wcompat -Wincomplete-uni-patterns -Wincomplete-record-updates
97+ -Wredundant-constraints
11998
12099executable cabal2nix
121− main-is: Main.hs
122− hs-source-dirs:
123− cabal2nix
124− ghc-options: -Wall
125− build-depends:
126− base < 5
127− , Cabal >= 1.22.2
128− , SHA
129− , aeson
130− , ansi-wl-pprint
131− , base < 5
132− , bytestring
133− , containers
134− , data-default
135− , deepseq
136− , deepseq-generics
137− , directory
138− , doctest
139− , filepath
140− , hackage-db
141− , hspec
142− , lens
143− , monad-par
144− , monad-par-extras
145− , mtl
146− , optparse-applicative
147− , pretty >= 1.1.2
148− , process
149− , regex-posix
150− , split
151− , transformers
152− , utf8-string
153− , cabal2nix
154− default-language: Haskell2010
100+ main-is: Main.hs
101+ hs-source-dirs: cabal2nix
102+ build-depends: base, cabal2nix
103+ default-language: Haskell2010
104+ ghc-options: -Wall -Wcompat -Wincomplete-uni-patterns -Wincomplete-record-updates
105+ -Wredundant-constraints
106+
107+executable hackage2nix
108+ main-is: Main.hs
109+ other-modules: HackageGit
110+ Paths_cabal2nix
111+ hs-source-dirs: hackage2nix
112+ build-depends: base < 5
113+ , Cabal
114+ , aeson
115+ , bytestring
116+ , cabal2nix
117+ , containers
118+ , directory
119+ , distribution-nixpkgs >= 1.2
120+ , filepath
121+ , hopenssl >= 2
122+ , language-nix
123+ , lens
124+ , monad-par
125+ , monad-par-extras
126+ , mtl
127+ , optparse-applicative
128+ , pretty >= 1.1.2
129+ default-language: Haskell2010
130+ ghc-options: -Wall -Wcompat -Wincomplete-uni-patterns -Wincomplete-record-updates
131+ -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-maxN16
155132
156−test-suite spec
157− type: exitcode-stdio-1.0
158− main-is: Main.hs
159− hs-source-dirs:
160− test
161− ghc-options: -Wall
162− build-depends:
163− base < 5
164− , Cabal >= 1.22.2
165− , SHA
166− , aeson
167− , ansi-wl-pprint
168− , base < 5
169− , bytestring
170− , containers
171− , data-default
172− , deepseq
173− , deepseq-generics
174− , directory
175− , doctest
176− , filepath
177− , hackage-db
178− , hspec
179− , lens
180− , monad-par
181− , monad-par-extras
182− , mtl
183− , optparse-applicative
184− , pretty >= 1.1.2
185− , process
186− , regex-posix
187− , split
188− , transformers
189− , utf8-string
190− , cabal2nix
191− default-language: Haskell2010
133+test-suite regression-test
134+ type: exitcode-stdio-1.0
135+ main-is: Main.hs
136+ hs-source-dirs: test
137+ build-depends: base
138+ , Cabal
139+ , cabal2nix
140+ , containers
141+ , directory
142+ , filepath
143+ , language-nix
144+ , lens
145+ , pretty
146+ , process > 1.2
147+ , tasty
148+ , tasty-golden
149+ default-language: Haskell2010
150+ build-tools: cabal2nix
151+ ghc-options: -Wall -Wcompat -Wincomplete-uni-patterns -Wincomplete-record-updates
152+ -Wredundant-constraints -threaded -with-rtsopts=-K64K
cabal2nix/Main.hs+2−141
@@ -1,143 +1,4 @@
1−{-# LANGUAGE RecordWildCards #-}
2−{-# LANGUAGE OverloadedStrings #-}
3−
4−module Main ( main ) where
5−
6−import Control.Exception ( bracket )
7−import Data.Maybe ( fromMaybe )
8−import qualified Data.Set as Set
9−import Distribution.Nixpkgs.Fetch
10−import Distribution.Nixpkgs.Haskell
11−import Distribution.Nixpkgs.Haskell.FromCabal
12−import Distribution.Nixpkgs.Haskell.FromCabal.Configuration.GHC7102
13−import Distribution.Nixpkgs.Meta
14−import Distribution.PackageDescription ( FlagName(..), FlagAssignment )
15−import Distribution.Simple.Utils ( lowercase )
16−import Distribution.Text ( display )
17−import Internal.HaskellPackage
18−import Internal.Lens
19−import Paths_cabal2nix
20−import Internal.PrettyPrinting hiding ( (<>) )
21−import Language.Nix
22−import Options.Applicative
23−import System.IO ( hFlush, stdout, stderr )
24−import qualified Text.PrettyPrint.ANSI.Leijen as P2 hiding ( (<$>), (<>) )
25−-- import Text.Show.Pretty
26−
27−data Options = Options
28− { optSha256 :: Maybe String
29− , optMaintainer :: [String]
30− , optPlatform :: [String]
31− , optHaddock :: Bool
32− , optDoCheck :: Bool
33− , optJailbreak :: Bool
34− , optRevision :: Maybe String
35− , optHyperlinkSource :: Bool
36− , optEnableLibraryProfiling :: Bool
37− , optEnableExecutableProfiling :: Bool
38− , optEnableProfiling :: Maybe Bool
39− , optHackageDb :: Maybe FilePath
40− , optNixShellOutput :: Bool
41− , optFlags :: [String]
42− , optUrl :: String
43− }
44− deriving (Show)
45−
46−options :: Parser Options
47−options = Options
48− <$> optional (strOption $ long "sha256" <> metavar "HASH" <> help "sha256 hash of source tarball")
49− <*> many (strOption $ long "maintainer" <> metavar "MAINTAINER" <> help "maintainer of this package (may be specified multiple times)")
50− <*> many (strOption $ long "platform" <> metavar "PLATFORM" <> help "supported build platforms (may be specified multiple times)")
51− <*> flag True False (long "no-haddock" <> help "don't run Haddock when building this package")
52− <*> flag True False (long "no-check" <> help "don't run regression test suites of this package")
53− <*> switch (long "jailbreak" <> help "disregard version restrictions on build inputs")
54− <*> optional (strOption $ long "revision" <> help "revision to use when fetching from VCS")
55− <*> flag True False (long "no-hyperlink-source" <> help "don't generate pretty-printed source code for the documentation")
56− <*> switch (long "enable-library-profiling" <> help "enable library profiling in the generated build")
57− <*> switch (long "enable-executable-profiling" <> help "enable executable profiling in the generated build")
58− <*> optional (switch (long "enable-profiling" <> help "enable both library and executable profiling in the generated build"))
59− <*> optional (strOption $ long "hackage-db" <> metavar "PATH" <> help "path to the local hackage db in tar format")
60− <*> switch (long "shell" <> help "generate output suitable for nix-shell")
61− <*> many (strOption $ short 'f' <> long "flag" <> help "Cabal flag (may be specified multiple times)")
62− <*> strArgument (metavar "URI")
63−
64−pinfo :: ParserInfo Options
65−pinfo = info
66− ( helper
67− <*> infoOption ("cabal2nix " ++ display version) (long "version" <> help "Show version number")
68− <*> options
69− )
70− ( fullDesc
71− <> header "cabal2nix converts Cabal files into build instructions for Nix."
72− <> progDescDoc (Just (P2.vcat
73− [ P2.text ""
74− , P2.text "Recognized URI schemes:"
75− , P2.text ""
76− , P2.text " cabal://pkgname-pkgversion download the specified package from Hackage"
77− , P2.text " cabal://pkgname download latest version of this package from Hackage"
78− , P2.text " file:///local/path load the Cabal file from the local disk"
79− , P2.text " /local/path abbreviated version of file URI"
80− , P2.text " <git/svn/bzr/hg URL> download the source from the specified repository"
81− , P2.text ""
82− , P2.fillSep (map P2.text (words ( "If the URI refers to a cabal file, information for building the package "
83− ++ "will be retrieved from that file, but hackage will be used as a source "
84− ++ "for the derivation. Otherwise, the supplied URI will be used to as the "
85− ++ "souce for the derivation and the information is taken from the cabal file "
86− ++ "at the root of the downloaded source."
87− )))
88− ]))
89− )
1+import qualified Cabal2nix as C
902
913main :: IO ()
92−main = bracket (return ()) (\() -> hFlush stdout >> hFlush stderr) $ \() -> do
93− Options {..} <- execParser pinfo
94−
95− pkg <- getPackage optHackageDb $ Source optUrl (fromMaybe "" optRevision) (maybe UnknownHash Guess optSha256)
96−
97− let deriv :: Derivation
98− deriv = fromGenericPackageDescription (const True)
99− (\i -> Just (create binding (i, create path [i])))
100− (platform ghc7102)
101− (compilerInfo ghc7102)
102− (readFlagList optFlags)
103− []
104− (pkgCabal pkg)
105− & src .~ pkgSource pkg
106− & runHaddock .~ optHaddock
107− & jailbreak .~ optJailbreak
108− & hyperlinkSource .~ optHyperlinkSource
109− & enableLibraryProfiling .~ (fromMaybe False optEnableProfiling || optEnableLibraryProfiling)
110− & enableExecutableProfiling .~ (fromMaybe False optEnableProfiling || optEnableExecutableProfiling)
111− & metaSection.maintainers .~ Set.fromList (map (create ident) optMaintainer)
112− & metaSection.platforms .~ Set.fromList optPlatform
113− & doCheck &&~ optDoCheck
114− & extraFunctionArgs . contains "stdenv" .~ True
115−
116− shell :: Doc
117− shell = vcat
118− [ text "{ nixpkgs ? import <nixpkgs> {}, compiler ? \"default\" }:"
119− , text ""
120− , text "let"
121− , text ""
122− , text " inherit (nixpkgs) pkgs;"
123− , text ""
124− , hcat [ text " f = ", pPrint deriv, semi ]
125− , text ""
126− , text " haskellPackages = if compiler == \"default\""
127− , text " then pkgs.haskellPackages"
128− , text " else pkgs.haskell.packages.${compiler};"
129− , text ""
130− , text " drv = haskellPackages.callPackage f {};"
131− , text ""
132− , text "in"
133− , text ""
134− , text " if pkgs.lib.inNixShell then drv.env else drv"
135− ]
136−
137− -- putStrLn $ ppShow deriv
138− print (if optNixShellOutput then shell else pPrint deriv)
139−
140−readFlagList :: [String] -> FlagAssignment
141−readFlagList = map tagWithValue
142− where tagWithValue ('-':fname) = (FlagName (lowercase fname), False)
143− tagWithValue fname = (FlagName (lowercase fname), True)
4+main = C.main
doc/.gitignore+13−14
@@ -1,14 +1,13 @@
1−/hal8.aux
2−/hal8-folien.pdf
3−/hal8.html
4−/hal8.log
5−/hal8.out
6−/hal8.pdf
7−/nixos-meetup-3-slides.aux
8−/nixos-meetup-3-slides.log
9−/nixos-meetup-3-slides.out
10−/nixos-meetup-3-slides.pdf
11−/user-guide.aux
12−/user-guide.log
13−/user-guide.out
14−/user-guide.pdf
1+# ignored files in the doc hierarchy
2+
3+/*.aux
4+/*.csv
5+/*.eps
6+/*.html
7+/*.json
8+/*.log
9+/*.out
10+/*.pdf
11+/*~
12+/.RData
13+/.Rhistory
doc/00-future-of-haskell-packaging-in-nixpkgs.mdnew file+41
@@ -0,0 +1,41 @@
1+The Future of Haskell Packaging in Nix
2+======================================
3+
4+Fellow Nixers and Haskellers,
5+
6+the [Haskell NG][1] effort allowed us for the first time to distribute the
7+latest version of every package known to Hackage --- well over 8,000 builds in
8+total ---, and this seemed like a crazy leap forward at the time. These days, we
9+distribute [60+ Haskell package sets][2] that represent different views into
10+Hackage built with 8+ different compilers, and there's probably a lot more
11+variety out there, living in our user's `config.nix` files, that we don't even
12+know about. The requirements on our Haskell infrastructure become ever more
13+complex. New questions pop up due to the growing popularity of Stack; our
14+support for old compiler versions is somewhat lacking; and we still don't have
15+convincing answers to questions like: how do I compile my package with
16+profiling support?
17+
18+The issues we have to address are mostly known and understood. What we lack are
19+brilliant ideas how to solve them.
20+
21+This thread is an attempt to make some headway towards that end through open
22+discussion and collaboration. Instead of everyone having to browse a couple of
23+thousand Github tickets to find out what's going on, I'll regularly pick one
24+particular aspect that needs improvement and post a short article outlining the
25+issues we have and potential solutions that we know of so that constructive
26+dialogue can ensue.
27+
28+Everyone is invited to participate in the conversation with ideas, questions,
29+suggestions, or references to Github Pull Requests that implement a perfect,
30+production-ready solution waiting to be merged.
31+
32+The issues we've identified so far are:
33+
34+- [Use Function Application To Escape Override Hell](01-use-function-application-to-escape-override-hell.md)
35+- [Guarantee Consistent Builds and Obsolete `overrideScope`](02-guarantee-consistent-builds-and-obsolete-overridescope.md)
36+- [Map Cabal Files To Nix Without Information Loss](03-map-cabal-files-to-nix-without-information-loss.md)
37+- [Set up a Sufficiently Powerful Build Farm](04-set-up-a-sufficiently-powerful-build-farm.md)
38+- [Publish All of Hackage](05-publish-all-of-hackage.md)
39+
40+[1]: https://github.com/NixOS/nixpkgs/commit/c0c82ea2ebbcf0632260a931cf832cac1c8a014e
41+[2]: https://github.com/NixOS/nixpkgs/blob/master/pkgs/top-level/haskell-packages.nix
doc/01-use-function-application-to-escape-override-hell.mdnew file+320
@@ -0,0 +1,320 @@
1+Use Function Application To Escape Override Hell
2+================================================
3+
4+The Problem
5+-----------
6+
7+The architecture of the `haskell.packages.*` hierarchy worked fine when Nixpkgs
8+shipped a handful of manually maintained package sets. The addition of LTS
9+Haskell, however, increased the number of active package sets by a factor of
10+10, and that number will grow further since there is a new LTS release coming
11+out every week. Our preferred mechanism to cope with that diversity is the
12+override: `haskellPackages` provides the foundation that other package sets
13+override according to their needs. As of today, this approach requires
14+approximately 25,000 overrides. Furthermore, we use 3 different types of
15+overrides (`override`, `overrideCabal`, and `overrideScope`) that have subtly
16+different purposes and capabilities. The complexity of this technique caused
17+non-trivial issues in the past that manifested in [severe memory leaks][5],
18+[insufficient flexibility][6], and [counter-intuitive behavior][7]. The current
19+approach is not going to scale forever --- particularly in terms of
20+maintainability. We need a better architecture to define Haskell package sets
21+that supports variant builds in a fashion that's simpler and thus easier to
22+understand and maintain.
23+
24+The Situation Today
25+-------------------
26+
27+Nixpkgs distributes over 50 Haskell package sets that differ in which packages
28+they contain, which versions of those packages they contain, and how those
29+builds are configured. For example, package sets intended for use with GHC
30+versions prior to 7.4.x neither build nor run regression test suites, because
31+Cabal introduced that feature only in later versions of the compiler. Package
32+sets compiling with GHC versions prior to 7.8.x don't support shared library
33+builds, because that feature never worked reliably until more recent versions
34+of the compiler. And builds running on Darwin don't generate the Haddock
35+documentation when compiling with GHC versions 7.6.x or earlier, because the
36+Haddock binary on that platform used to interact poorly with Darwin's `cpp` and
37+thus failed until that bug was eventually fixed in GHC 7.8.1.
38+
39+This means that seemingly similar builds like `haskell.packages.ghc763.foo` and
40+`haskell.packages.ghc784.foo` actually differ in multiple dimensions: those two
41+`foo`s may be different versions of the same package; they are almost certainly
42+compiled with different versions of their respective dependencies; and their
43+configurations potentially differ, i.e both builds use different Cabal flags
44+and have different features enabled. In fact, a build of `haskellPackages.foo`
45+that's run on Linux/x86_64 most likely differs non-trivially from the exact
46+same build run on Darwin/x86_64.
47+
48+Nix can handle this diversity, because it describes builds in a Turing-complete
49+functional language. Builds that exist in multiple variants are functions that
50+take the necessary dependencies plus a set of flags to enable/disable the
51+features we intend to support, and then map that information to appropriate
52+build instructions. Those functions live in one central place,
53+[`hackage-packages.nix`][1], and all our crazy package sets simply call those
54+functions with appropriate arguments to define exactly those build variants
55+that they need.
56+
57+What sounds simple and obvious in theory, however, is a bit of a mess in
58+practice. Consider the package `hslua` as an example. `hackage-packages.nix`
59+defines builds for versions 0.3.13, 0.4.0, and 0.4.1. Those definitions look
60+all quite similar, so we'll omit the third definition for brevity:
61+
62+ "hslua_0_3_13" = callPackage
63+ ({ mkDerivation, base, lua5_1, mtl }:
64+ mkDerivation {
65+ pname = "hslua";
66+ version = "0.3.13";
67+ sha256 = "e95774d21ac4378e799af4b8dce9068bfedd3109bf13b717d9ecb5817f86430a";
68+ configureFlags = [ "-fsystem-lua" ];
69+ libraryHaskellDepends = [ base mtl ];
70+ libraryPkgconfigDepends = [ lua5_1 ];
71+ testHaskellDepends = [ base ];
72+ description = "A Lua language interpreter embedding in Haskell";
73+ license = stdenv.lib.licenses.mit;
74+ hydraPlatforms = stdenv.lib.platforms.none;
75+ }) { inherit (pkgs) lua5_1; };
76+
77+ "hslua" = callPackage
78+ ({ mkDerivation, base, bytestring, hspec, hspec-contrib, HUnit
79+ , lua5_1, QuickCheck, quickcheck-instances, text
80+ }:
81+ mkDerivation {
82+ pname = "hslua";
83+ version = "0.4.1";
84+ sha256 = "2df2b4f0566ef2244506f9830e0207fce3bece7c331129f69f446c722136173f";
85+ configureFlags = [ "-fsystem-lua" ];
86+ libraryHaskellDepends = [ base bytestring ];
87+ librarySystemDepends = [ lua5_1 ];
88+ testHaskellDepends = [
89+ base bytestring hspec hspec-contrib HUnit QuickCheck
90+ quickcheck-instances text
91+ ];
92+ description = "A Lua language interpreter embedding in Haskell";
93+ license = stdenv.lib.licenses.mit;
94+ }) { inherit (pkgs) lua5_1; };
95+
96+Let's go through that code step by step. The basic structure of those
97+definitions is
98+
99+ name_version = callPackage f { ... system dependencies ... };
100+
101+where `f` is a function that given a set of build inputs produces a build. The
102+code invokes that function right away, so apparently `name_version` defines a
103+*build*, not a function that generates a build. The arguments passed to `f`
104+contain only system-level dependencies like `lua5_1`. Haskell dependencies like
105+`mtl` are not passed explicitly since the magic `callPackage` function can find
106+them automatically. Haskell attributes have a `_version` suffix only if the
107+attribute refers to an old version, like `hslua_0_3_13`. The latest version,
108+0.4.1, is simply called `hslua`. Last but not least, every Haskell build
109+expects a parameter `mkDerivation` --- our generic Haskell builder, which turns
110+those attribute sets into build instructions that Nix can execute. This
111+argument is also not passed explicitly but found by `callPackage`.
112+
113+The `callPackage` magic relies on two advanced techniques: fixed points and
114+reflection. Nixpkgs defines the Haskell package set recursively as a function
115+`self: { ... }` that takes as an argument the attribute set it's going to
116+produce and then uses that information to the produce the attribute set it's
117+already received as an argument. It's a mind-boggling way to define a recursive
118+attribute set `rec { ... }` without actually using the `rec` keyword. Every
119+computable function of this kind has a fixed point: a value `x` that satisfies
120+`f x = x`. That `x` is the result we actually want --- it's an ordinary
121+attribute set with all the `self`-references resolved and replaced by actual
122+values. The details of fixed points aren't important, though. What's important
123+is that our package set knows its final value already while we're still
124+defining it! This allows for the existence of the `callPackage` function:
125+
126+ self: let
127+ callPackage = stdenv.lib.callPackageWith self;
128+ in
129+ self // { ... Haskell package definitions here ... }
130+
131+The expression `callPackage f args` translates to `stdenv.lib.callPackageWith
132+self f args`. [`callPackageWith`][2] then uses reflection to determine the
133+names of all arguments expected by `f`. It finds those names that don't exist
134+in `args` in `self` and adds them to `args` to complete the function call. In
135+other words, parameters of `f` that are not specified in `args` are
136+automatically filled in from `self` --- the Haskell package set. This is why
137+system packages are passed explicitly (`self` doesn't contain them), but
138+Haskell dependencies are not (`self` does contain them).
139+
140+This feature is nice in package sets human beings write manually, because it
141+allows us to keep function calls short and concise. A computer program
142+generates the file `hackage-packages.nix`, though, so arguably we could have it
143+bind all Haskell names explicitly with `inherit (self) base mtl` just as well.
144+But `callPackage` has another feature that's more important than implicit name
145+resolution: it adds the method `override` to the generated derivation, which
146+can "undo" the function application to change the value of arguments that were
147+used originally. We can say
148+
149+ hslua.override { mtl = self.mtl_2_1_3_1; }
150+
151+to instantiate a variant of `hslua` that compiles with that particular version
152+of `mtl` rather than the default one. The same way, we can change the behavior
153+of `mkDerivation`! For example, the expression
154+
155+ hsload.override {
156+ mkDerivation = args: self.mkDerivation (args // { doCheck=false; });
157+ }
158+
159+gives us a variant of `hslua` that has the test suite disabled. These kind of
160+overrides are so useful that we've defined a whole [set of helper functions][3]
161+that use this technique to customize the default definitions from
162+`hackage-packages.nix` in any way we need.
163+to define
164+Now, Haskell packages sets are just collections of overrides that change the
165+default choices made in `hackage-packages.nix` as required. For example, the
166+package set for [LTS Haskell version 2.8][4] specifies:
167+
168+ "hslua" = doDistribute super."hslua_0_3_13";
169+
170+It renames `hslua_0_3_13` to `hslua` to ensure that all Haskell builds in that
171+package set use the older version instead of the latest one. Furthermore, we
172+would like Hydra builds of `haskell.packages.lts-2_8.hslua` enabled. The
173+original definition from `hackage-packages.nix` disabled those builds via
174+
175+ hydraPlatforms = stdenv.lib.platforms.none
176+
177+which makes sense in `haskellPackages`, because it prefers the latest version
178+of the package, but the older LTS set isn't happy with that choice, so it uses
179+a `doDistribute` override to replace the original empty set of `hydraPlatforms`
180+with something more appropriate.
181+
182+Generally speaking, all of our 50+ Haskell package sets are essentially just
183+variants of `hackage-packages.nix` with certain choices overridden if
184+necessary.
185+
186+Possible Improvements
187+---------------------
188+
189+It's unclear how to improve upon the current architecture.
190+
191+The override approach produces a weird structure: first, we define a build
192+function for every Haskell package --- like one would expect in a purely
193+functional language ---, but then that function isn't exposed. Instead, we call
194+the function right away to create a derivation. However, we can't use an honest
195+function call, because we really need a *function* later, so we're forced to
196+use freaky lazy-evaluation features that allow us to undo the function call
197+with `override` later to make the derivation look like the function again that
198+it probably should have been in the first place.
199+
200+One possible approach is to take `callPackage` out of `hackage-packages.nix`.
201+Instead of derivations, `hackage-packages.nix` could provide functions that
202+package sets then call with appropriate parameters to define the actual build.
203+This would require some 10,000 functions plus another ~7,000 function
204+applications per package set. In the current architecture, some attributes from
205+`hackage-packages.nix` are passed through unmodified, whereas the new approach
206+requires each package set to define every build explicitly. It's unclear how
207+that would affect the Nix interpreter in terms of memory requirements and
208+performance.
209+
210+Furthermore, just taking `callPackage` out of `hackage-packages.nix` won't
211+remedy the need for overriding, because our definitions don't mention any of
212+the build configuration flags, like `doCheck`. It's not possible to call the
213+function
214+
215+ "hslua" =
216+ { mkDerivation, base, bytestring, [... more inputs omitted ...] }:
217+
218+ mkDerivation {
219+ pname = "hslua";
220+ version = "0.4.1";
221+ [... more attributes omitted ...]
222+ };
223+
224+with `hslua { doCheck = false; ... }` because `doCheck` is an argument of
225+`mkDerivation`, which is hidden inside of that function. The established
226+approach to solve that problem is to wrap `mkDerivation`, i.e.
227+
228+ hslua {
229+ mkDerivation = args: self.mkDerivation (args // { doCheck=false; });
230+ }
231+
232+but this feels cumbersome compared to straight function application. We can
233+lift all those `mkDerivation` arguments into the outer function:
234+
235+ "hslua" =
236+ { mkDerivation, base, bytestring, [... more inputs omitted ...]
237+ , doCheck ? true, doHaddock ? true, enableSharedLibraries ? true
238+ }:
239+ mkDerivation {
240+ pname = "hslua";
241+ version = "0.4.1";
242+ inherit doCheck doHaddock;
243+ [... more attributes omitted ...]
244+ };
245+
246+but this adds a dozen highly redundant arguments to every single definition!
247+There might be clever ways around mentioning each of them explicitly, like:
248+
249+ "hslua" =
250+ { mkDerivation, base, bytestring, [... more inputs omitted ...]
251+ , ...
252+ } @ args:
253+ stdenv.lib.callPackageWith args mkDerivation {
254+ pname = "hslua";
255+ version = "0.4.1";
256+ [... more attributes omitted ...]
257+ };
258+
259+Yet that is exactly the kind of stuff we wanted to avoid in the first place. So
260+maybe it would be best to batch all those variant options in an attribute set
261+of their own?
262+
263+ "hslua" =
264+ { mkDerivation, base, bytestring, [... more inputs omitted ...]
265+ , config ? {}
266+ }:
267+ mkDerivation ({
268+ pname = "hslua";
269+ version = "0.4.1";
270+ [... more attributes omitted ...]
271+ } // config);
272+
273+This approach allows us to call `hslua { config.doCheck = false; }`, which
274+seems nice enough. At the same time, it allows us to call
275+
276+ hslua { config.pname = "this-is-not-hslua"; }
277+
278+as well, which feels like a bug.
279+
280+An entirely different approach is to take advantage of lazy evaluation to
281+define all possible build variants at once:
282+
283+ let
284+ showFlag = str: b: (if b then "with" else "without") + "-" + str;
285+
286+ mkDerivation = { pname, version, buildDepends ? []
287+ , doCheck ? true
288+ } @ args:
289+ {
290+ name = pname + "-" + version + "-" + showFlag "check" doCheck;
291+
292+ enableChecking = mkDerivation (args // { doCheck = true; });
293+ disableChecking = mkDerivation (args // { doCheck = false; });
294+ };
295+
296+ "hslua" = { base ? null }:
297+ mkDerivation {
298+ pname = "hslua";
299+ version = "0.4.1";
300+ buildDepends = [ base ];
301+ };
302+ in
303+ [ ((hslua { base = "base"; }).name)
304+ ((hslua { base = "base"; }).disableChecking.name)
305+ ((hslua { base = "base"; }).disableChecking.disableChecking.enableChecking.name)
306+ ]
307+
308+Each of those styles has its own advantages and disadvantages which aren't
309+fully understood yet. Hopefully, this summary provides some food for thought
310+and helps kick off a fruitful discussion.
311+
312+
313+
314+[1]: https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/hackage-packages.nix
315+[2]: https://github.com/NixOS/nixpkgs/blob/master/lib/customisation.nix#L72-L97
316+[3]: https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/lib.nix
317+[4]: https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/configuration-lts-2.8.nix#L4171
318+[5]: https://github.com/NixOS/nixpkgs/issues/6192
319+[6]: https://github.com/NixOS/nixpkgs/issues/7953
320+[7]: https://github.com/NixOS/nixpkgs/issues/9871
doc/02-guarantee-consistent-builds-and-obsolete-overridescope.mdnew file+182
@@ -0,0 +1,182 @@
1+Guarantee Consistent Builds and Obsolete `overrideScope`
2+========================================================
3+
4+The Problem
5+-----------
6+
7+A lot of effort goes into curated package sets like Stackage, but even so we
8+can compile only ~50% of the packages available from Hackage. It appears to be
9+the nature of the game: when `lens` 2.x comes out with a fundamentally new API,
10+then some packages will adopt the new version and others won't. A consistent
11+package set must chose on which side of the fence it wants to live. Either
12+those packages that depend on `lens` 1.x compile or those that depend on 2.x
13+compile --- but not both.
14+
15+Now, Nix is not limited to one particular version of `lens` --- we can have
16+both versions available at the same time. But it's difficult to take advantage
17+of that feature, because once you start mixing `lens` 1.x and 2.x in the same
18+package set, you risk inconsistent builds, i.e. builds where some part of the
19+dependency tree refers to `lens` 1.x and another part refers to `lens` 2.x.
20+It's a bad idea to try and link those two trees together into one executable;
21+we are fortunate that `Cabal` detects this error during the configure phase and
22+aborts the build!
23+
24+We need a mechanism that can mix multiple package versions within a package
25+set, but that also guarantees consistency for every single build. We hoped
26+`overrideScope` would be that mechanism, but somehow it hasn't quite lived up
27+to the promise, mostly because it is hard to understand.
28+
29+The Situation Today
30+-------------------
31+
32+Consider an executable package `foobar` that depends on the libraries `foo` and
33+`bar`, each of which depends on `lens`. The corresponding definitions in
34+`hackage-packages.nix` --- stripped down to the relevant bits --- look as
35+follows:
36+
37+ "lens" = ... lens version 1.x ...;
38+ "lens_2_0" = ... lens version 2.x ...;
39+
40+ "foo" = callPackage
41+ ({ mkDerivation, lens }:
42+ mkDerivation {
43+ pname = "foo";
44+ libraryHaskellDepends = [lens];
45+ }) {};
46+
47+ "bar" = callPackage
48+ ({ mkDerivation, lens }:
49+ mkDerivation {
50+ pname = "bar";
51+ libraryHaskellDepends = [lens];
52+ }) {};
53+
54+ "foobar" = callPackage
55+ ({ mkDerivation, lens }:
56+ mkDerivation {
57+ pname = "foobar"; [...]
58+ libraryHaskellDepends = [foo bar];
59+ }) {};
60+
61+Let's assume that `foo` won't compile in that setup because it requires `lens`
62+version 2.x. We can remedy that by adding an override to
63+`configuration-common.nix` that says:
64+
65+ foo = super.foo.override { lens = self.lens_2_0; };
66+
67+That change fixes the build of `foo`, but `foobar` remains broken, because now
68+it pulls in both `lens` 1.x and 2.x simultaneously through its dependencies. If
69+`bar` works only with `lens` 1.x, then there is nothing we can do: the version
70+constraints conflict and we cannot compile `foobar`. If `bar` *does* support
71+`lens` 2.x, however, then we can just switch it to the newer version with:
72+
73+ bar = super.bar.override { lens = self.lens_2_0; };
74+
75+Now we can compile `foobar`! Unfortunately, that change may break other builds.
76+There is a reason why `lens` 1.x is our default choice. If any other package
77+depends on `bar` as well as `lens` 1.x (directly or indirectly), then it will
78+no longer compile after that change.
79+
80+We can avoid that side-effect by localizing the override to `foobar`:
81+
82+ foobar = super.foobar.override {
83+ bar = self.bar.override { lens = self.lens_2_0; };
84+ };
85+
86+That approach allows us to compile `foobar`, while still leaving the default
87+version of `bar` at `lens` 1.x, like most of our packages require. Overriding
88+build inputs this way works fine, and we have used this technique for many
89+years to fix builds that require non-default versions to compile. The downside
90+of these nested overrides is that the tend to become freaky complicated if a
91+package needs overriding that is sufficiently deep in the dependency tree. The
92+GHC 7.8.4 package set, for example, needed many such overrides because its
93+default version of `mtl` was stuck at version 2.1.x all the while large parts
94+of Hackage had moved on to `mtl` 2.2.x. Since `mtl` is a rather fundamental
95+package, we had nested overrides 3-4 levels deep that were highly repetitious,
96+too. It was a mess.
97+
98+Haskell NG improved on that situation by adding `overrideScope`. That function
99+changes the package set ("scope") in which Nix evaluates a build expression.
100+The override
101+
102+ foobar = super.foobar.overrideScope (self: super: { lens = self.lens_2_0; });
103+
104+creates a new temporary package set, replaces `lens` with `lens_2_0` in it, and
105+then evaluates `foobar`. The `callPackage` function picks up the re-written
106+`lens` attribute, which means that there's no need to override that choice
107+explicitly in all dependencies of `foobar`. One could say that `overrideScope`
108+implements "deep overriding", i.e. it applies an override to the given
109+derivation as well as all sub-derivations that it refers to.
110+
111+Unfortunately, we lack a proper understanding of how expensive that technique
112+is memory and performance-wise. In the past, we've occasionally crashed Nix
113+with this kind of stuff --- keep in mind that the interpreter creates a whole
114+new package set for every build that uses this mechanism ---, but when used
115+sparingly, `overrideScope` seems to work okay.
116+
117+In some cases, `overrideScope` won't work at all, i.e. when confronted with
118+builds that have explicitly passed arguments. For example, let's say that
119+`lens` 3.x comes. So we try to compile `foobar` like this:
120+
121+ foobar = super.foobar.overrideScope (self: super: { lens = self.lens_3_0; });
122+
123+That build will fail, because we added an explicit override for `foo` earlier
124+that committed the build to `lens_2_0`, and `overrideScope` will not affect
125+that choice since that build input is not picked up with `callPackage`. So
126+`foobar` will pull in both `lens` 2.x and 3.x despite the use of
127+`overrideScope`.
128+
129+
130+Possible Improvements
131+---------------------
132+
133+We generate Haskell build expressions automatically with `cabal2nix`, and that
134+tool knows the complete dependency tree for every package. So it would be
135+possible to generate builds that expect as function arguments not just their
136+immediate dependencies but the transitive closure of all dependencies. Build
137+expressions would then call their direct dependencies, passing in appropriate
138+versions of their respective dependencies, etc. For example:
139+
140+ "foobar" = callPackage
141+ ({ mkDerivation, foo, bar, many, other, inputs, of, lens }:
142+ let lens' = lens.override { inherit many other inputs of lens; };
143+ foo' = foo.override { lens = lens'; };
144+ bar' = bar.override { lens = lens'; };
145+ in
146+ mkDerivation {
147+ pname = "foobar"; [...]
148+ libraryHaskellDepends = [foo' bar'];
149+ }) {};
150+
151+Now, `foobar` expects every single package that occurs anywhere inside of its
152+dependency tree as an argument, and it constructs the dependency tree using
153+those arguments. So the build must be consistent. It's impossible for `foobar`
154+to refer to two incompatible versions of `lens`, because its inputs always use
155+the same version.
156+
157+Consequently,
158+
159+ foobar.override { mtl = self.mtl_2.4.0; }
160+
161+gives us is a version of `foobar` that has its entire dependency tree built
162+with `mtl` 2.4.x. We could even get rid of the override altogether if we adopt
163+the suggestions from "Use Function Application To Escape Override Hell" and
164+remove `callPackage` from `hackage-packages.nix`. We'd define all builds as
165+straight functions
166+
167+ "foobar" =
168+ { mkDerivation, foo, bar, many, other, inputs, of, lens }:
169+ let lens' = lens { inherit many other inputs of lens; };
170+ foo' = foo { lens = lens'; };
171+ bar' = bar { lens = lens'; };
172+ in
173+ mkDerivation {
174+ pname = "foobar"; [...]
175+ libraryHaskellDepends = [foo' bar'];
176+ };
177+
178+and invoke them from inside of a package set with:
179+
180+ callPackage foobar { mtl = self.mtl_2.4.0; }
181+
182+This would give us a guarantee for consistent builds without any overrides.
doc/03-map-cabal-files-to-nix-without-information-loss.mdnew file+110
@@ -0,0 +1,110 @@
1+Map Cabal Files To Nix Without Information Loss
2+===============================================
3+
4+The Problem
5+-----------
6+
7+Our implementation of `cabal2nix` loses important information, because its
8+mapping from Cabal to Nix is too simplistic. Cabal supports conditional values
9+that depend on
10+
11+- the OS and architecture on which the build takes place,
12+- the compiler version,
13+- the respective versions of the build dependencies, and
14+- Cabal flags.
15+
16+But we don't capture those conditional settings in the generate Nix file.
17+Instead, we resolve those conditions with a set of hard-coded assumptions that
18+work well for Linux/x86_64 using GHC 7.10.2, but other build environments often
19+fail to compile the expression because some essential information is missing.
20+
21+
22+The Situation Today
23+-------------------
24+
25+Consider the Cabal file for [`conduit-1.2.5`][2]. Among other things, it says:
26+
27+ Library
28+ Build-depends: base >= 4.3 && < 5
29+ , resourcet >= 1.1 && < 1.2
30+ , exceptions >= 0.6
31+ , lifted-base >= 0.1
32+ , transformers-base >= 0.4.1 && < 0.5
33+ , transformers >= 0.2.2 && < 0.5
34+ , mtl
35+ , mmorph
36+ if !impl(ghc>=7.9)
37+ build-depends: void >= 0.5.5
38+
39+The library depends on the module `Data.Void`, which GHC's `base` library
40+contains starting with version 7.9.x, but older versions of GHC don't have that
41+module, so the build needs an additional 3rd-party library, `void`, to provide
42+that code. The Nix build expression for `conduit`, however, does not capture
43+that information. `cabal2nix` omits `void` from the list of dependencies
44+entirely:
45+
46+ libraryHaskellDepends = [
47+ base exceptions lifted-base mmorph mtl resourcet transformers
48+ transformers-base
49+ ];
50+
51+The [conversion function][1] used by `cabal2nix` doesn't translate the
52+conditional from Cabal into Nix. Instead, the function
53+[resolves all conditionals][3], assuming that
54+
55+- the build will take place with the same architecture, OS, and compiler
56+version as were used to compile `cabal2nix`,
57+
58+- all Haskell dependencies are available in all versions, and
59+
60+- all Cabal flags have their default value unless specified otherwise in a
61+[hard-coded list][4].
62+
63+For the majority of packages, that heuristic produces build expressions that
64+work fine, but In case of `conduit` the result won't compile with compilers
65+prior to GHC 7.10.x, and thus a
66+[manually configured override is necessary to fix the build][5].
67+
68+The lack of support for conditionals is particularly annoying when it comes to
69+packages that make extensive use of Cabal flags, like `git-annex`. There are
70+numerous flags that determine the feature set supported by the build, i.e.
71+whether to include the "assistant" or not. Now, Stackage package sets like LTS
72+Haskell do contain `git-annex`, but they don't contain all the dependencies
73+that are necessary to build the assistant. Consequently, `git-annex` ought to
74+compile with `-f-assistant` within a context of Stackage. At the same time, we
75+want to provide the assistant feature to Nixpkgs users --- and we can, because
76+we have all of Hackage, not just Stackage!
77+
78+So what we do is this: our generated build expression for `git-annex` by
79+default includes the assistant, and that is the build `gitAndTools.git-annex`
80+refers to. Then we define [variants of that build without the assistant][5],
81+and these are the ones `haskell.packages.lts-x_y.git-annex` refers to. Now, we
82+define that variant by setting the Cabal flag `-f-assistant`, but that override
83+does not change the fact that all those dependencies needed only to build the
84+assistant are still listed as build inputs in the Nix expression for
85+`git-annex`! Cabal won't use these dependencies during the build, but Nix will
86+create them and include them into the build environment nonetheless, which
87+defeats the purpose of having that flag in the first place.
88+
89+Possible Improvements
90+---------------------
91+
92+Nix expressions must capture the complete logic that the underlying Cabal file
93+specifies. In case of the `conduit` example, the generated code should say:
94+
95+ libraryHaskellDepends = [
96+ base exceptions lifted-base mmorph mtl resourcet transformers
97+ transformers-base
98+ ] ++ stdenv.lib.optional (stdenv.lib.versionOlder ghc.version "7.9") void;
99+
100+Furthermore, Cabal flags should be mapped to boolean function arguments that
101+enable/disable the underlying feature and thereby modify how the Nix expression
102+evaluates, so that no extraneous build inputs occur.
103+
104+
105+[1]: https://github.com/NixOS/cabal2nix/blob/master/distribution-nixpkgs/src/Distribution/Nixpkgs/Haskell/FromCabal.hs#L36
106+[2]: http://hackage.haskell.org/package/conduit-1.2.5/conduit.cabal
107+[3]: http://hackage.haskell.org/package/Cabal-1.22.4.0/docs/Distribution-PackageDescription-Configuration.html#v:finalizePackageDescription
108+[4]: https://github.com/NixOS/cabal2nix/blob/master/distribution-nixpkgs/src/Distribution/Nixpkgs/Haskell/FromCabal/Flags.hs
109+[5]: https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/configuration-ghc-7.8.x.nix#L142
110+[5]: https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/configuration-common.nix#L66-L80
doc/04-set-up-a-sufficiently-powerful-build-farm.mdnew file+208
@@ -0,0 +1,208 @@
1+Set up a Sufficiently Powerful Build Farm
2+=========================================
3+
4+The Problem
5+-----------
6+
7+`hydra.nixos.org` compiles and provides binaries only for the `haskellPackages`
8+package set. The build farm compiles none of our LTS Haskell package sets,
9+which means that users of `haskell.packages.lts-x_y` cannot get any
10+pre-compiled binaries. It also means that those builds aren't verified, i.e. we
11+won't notice when changes to Nixpkgs break builds in those package sets.
12+
13+Furthermore, we have [no pre-compiled binaries with profiling support][1] for
14+any of our package sets.
15+
16+The Situation Today
17+-------------------
18+
19+We have 66 active package sets that define the following number of active
20+builds per platform:
21+
22+ pkgset builds
23+ 1: ghc6123 5173
24+ 2: ghc704 5182
25+ 3: ghc7102 5189
26+ 4: ghc722 5183
27+ 5: ghc742 5183
28+ 6: ghc763 5182
29+ 7: ghc783 5173
30+ 8: ghc784 5173
31+ 9: ghcHEAD 5188
32+ 10: ghcNokinds 5188
33+ 11: ghcjs 5172
34+ 12: lts-0_0 795
35+ 13: lts-0_1 795
36+ 14: lts-0_2 795
37+ 15: lts-0_3 795
38+ 16: lts-0_4 795
39+ 17: lts-0_5 795
40+ 18: lts-0_6 795
41+ 19: lts-0_7 795
42+ 20: lts-1_0 827
43+ 21: lts-1_1 827
44+ 22: lts-1_10 828
45+ 23: lts-1_11 829
46+ 24: lts-1_12 829
47+ 25: lts-1_13 829
48+ 26: lts-1_14 830
49+ 27: lts-1_15 831
50+ 28: lts-1_2 828
51+ 29: lts-1_4 828
52+ 30: lts-1_5 828
53+ 31: lts-1_7 828
54+ 32: lts-1_8 828
55+ 33: lts-1_9 827
56+ 34: lts-2_0 1019
57+ 35: lts-2_1 1019
58+ 36: lts-2_10 1023
59+ 37: lts-2_11 1023
60+ 38: lts-2_12 1023
61+ 39: lts-2_13 1022
62+ 40: lts-2_14 1022
63+ 41: lts-2_15 1022
64+ 42: lts-2_16 1022
65+ 43: lts-2_17 1023
66+ 44: lts-2_18 1022
67+ 45: lts-2_19 1022
68+ 46: lts-2_2 1018
69+ 47: lts-2_20 1024
70+ 48: lts-2_21 1023
71+ 49: lts-2_22 1023
72+ 50: lts-2_3 1018
73+ 51: lts-2_4 1018
74+ 52: lts-2_5 1018
75+ 53: lts-2_6 1017
76+ 54: lts-2_7 1017
77+ 55: lts-2_8 1023
78+ 56: lts-2_9 1023
79+ 57: lts-3_0 1322
80+ 58: lts-3_1 1322
81+ 59: lts-3_2 1321
82+ 60: lts-3_3 1321
83+ 61: lts-3_4 1321
84+ 62: lts-3_5 1322
85+ 63: lts-3_6 1321
86+ 64: lts-3_7 1323
87+ 65: lts-3_8 1323
88+ 66: lts-3_9 1324
89+ pkgset builds
90+
91+That gives a total of 111,647 active builds, many of which are identical. All
92+package sets combined define 77,445 distinct store paths, i.e. some 34,202
93+builds are shared across package sets.
94+
95+Now, `hydra.nixos.org` compiles only `haskellPackages` at the moment. Out of a
96+total of [46,862 builds in trunk][2], 15,446 (33%) come from the Haskell
97+package set. If we'd enable every Haskell package set on Linux/i686,
98+Linux/x86_64, and Darwin/x86_64, then we'd have a total of 263,751 builds ---
99+5.6 times as much as before ---, and 88% of all builds would be related to
100+Haskell.
101+
102+A complete build of the active derivations in `haskellPackages` takes up
103+approx. 27 GByte of disk space per platform. That gives about 80 GByte for all
104+of our 3 active platforms. How would that number develop if we'd enable
105+everything? The store path sizes in MByte are distributed as follows (based on
106+7,620 samples excluding `ghc`):
107+
108+ Minimum 1st Quart. Median Mean 3rd Quart. Maximum
109+ 0.0169 0.3557 0.9497 4.6300 3.0640 678.9000
110+
111+Multiplying the average store path size by the number of distinct store paths
112+tells us that storing *everything* requires approx. 360 GByte per platform.
113+With 3 active platforms, we'd need about 1 TByte of disk space for one complete
114+set of Haskell packages.
115+
116+Now, we might be able to reduce that number by disabling some particularly
117+large builds. The store path size distribution is skewed to the left, i.e.
118+towards smaller builds. Approximately 82% of all store paths are actually
119+smaller than the numerical average. Our top-20 biggest Haskell builds are:
120+
121+ pkg size
122+ 1: ghc 895.5
123+ 2: metadata 678.9
124+ 3: uhc-light 253.5
125+ 4: OpenGLRaw 249.3
126+ 5: FpMLv53 229.5
127+ 6: amazonka-ec2 214.8
128+ 7: Agda 212.6
129+ 8: xhb 189.0
130+ 9: unicode-properties 175.0
131+ 10: scholdoc-texmath 165.0
132+ 11: idris 137.7
133+ 12: gf 126.4
134+ 13: pandoc 124.8
135+ 14: unicode-names 118.4
136+ 15: wxcore 113.8
137+ 16: java-character 112.1
138+ 17: hat 111.1
139+ 18: texmath 109.6
140+ 19: open-symbology 107.6
141+ 20: turkish-deasciifier 104.0
142+
143+If we'd make an effort to disable some of those expensive builds --- or maybe
144+reduce their output size ---, then we'd make a noticeable dent into the space
145+requirements. Even so, it's clear that `hydra.nixos.org` cannot provide that
146+much disk space today.
147+
148+Curiously enough, the CPU power necessary to compile all those packages is the
149+least of our problems. Our build farm can easily re-compile everything from
150+scratch within 2-3 days, which is "good enough" for all practical purposes.
151+Also, changes to `stdenv` occur rarely (and we typically know about them in
152+advance). The normal update cycle triggers only a handful of builds -- maybe
153+20-300 per day --, because the versions fundamental Haskell packages are fixed
154+in the LTS package sets.
155+
156+It's unclear whether the Hydra software would cope with 66 package sets with
157+some 111,000 derivations in them that need to be evaluated, say, once an hour.
158+Hydra has undergone some architectural changes recently that might make such a
159+load possible --- i.e. `hydra-evaluator` is more efficient than it used to be
160+---, but I don't have any reliable data concerning the performance of the
161+process, so I cannot say what is possible and what is not.
162+
163+We know for sure that the currently available disk space doesn't suffice. Disk
164+space is notoriously low on `hydra.nixos.org`, and storing another terabyte
165+Haskell data is certainly impossible at the moment.
166+
167+Possible Improvements
168+---------------------
169+
170+We have basically two alternatives:
171+
172+1. Throw hardware (money) at `hydra.nixos.org`.
173+2. Establish a separate build farm for Haskell packages.
174+
175+Either solution requires money, which we could probably raise through crowd
176+funding. At the moment, the NixOS Foundation collects donations for purposes of
177+NixOS in general, but it should be possible to start a funding campaign that
178+collects donations specifically for the purposes of establishing a Haskell
179+build farm so that people who care about that particular topic have an
180+incentive to participate.
181+
182+Now, if we'd go for approach (1), then we could use those funds to buy bigger
183+disks and more RAM for `hydra.nixos.org`, which would be beneficial for
184+everyone -- not just Haskell users. The downside is that `hydra.nixos.org` is a
185+bit of a black box. Only very few people have access to those machines, and
186+that situation is not going to change any time soon. Personally, I have no idea
187+whether adding RAM or disks to the cluster is feasible at all, and whether
188+those upgrades would enable the build farm to cope with the number of builds
189+that we're considering here.
190+
191+Solution (2) seems more manageable, because we could set up an environment from
192+scratch as we see fit. Experience from managing `hydra.cryp.to` suggests that
193+one powerful KVM-based virtual server can serve as the Hydra master. In
194+addition, we'd need 2-3 additional build slaves to compile packages. For
195+massive re-builds, we could spawn another 10-15 builds slaves in EC2 to reduce
196+the time it takes to re-build everything from scratch. Such a setup would
197+probably work well in practice, and it should be available at a yearly cost of
198+1,000 dollars or less.
199+
200+Anyhow, that's just a rough estimate. I don't know, really, what an ideal
201+hardware / service platform for running such a virtual service would be. It
202+would be great if a resident virtual server / NAS / system management guru
203+could chime in with suggestions; I'm sure the NixOS crowd has people who know
204+that kind of stuff and who can design the infrastructure for such a build farm.
205+
206+
207+[1]: https://github.com/NixOS/nixpkgs/issues/10143
208+[2]: http://hydra.nixos.org/jobset/nixpkgs/trunk
doc/05-publish-all-of-hackage.mdnew file+69
@@ -0,0 +1,69 @@
1+Publish All of Hackage
2+======================
3+
4+The Problem
5+-----------
6+
7+Users of Nixpkgs want to build Haskell packages that have no recent release,
8+i.e. the software's authors have not updated their code to deal with modern
9+versions of the respective build dependencies. The required old versions,
10+however, may not be available in Nixpkgs, and then the build cannot succeed. At
11+that point, we recommend our users to
12+[add the missing package versions themselves][1] through the override mechanism
13+in `~/.nixpkgs/config.nix`. That approach works fine, but it's challenging for
14+new users and it's certainly inconvenient.
15+
16+The Situation Today
17+-------------------
18+
19+We publish 11,216 package versions out of 62,354 available ones, i.e. 18% of
20+Hackage. We select packages for distribution using the following criteria:
21+
22+1. the latest version of every package (9,058 builds),
23+
24+2. old versions required by LTS Haskell (2,137 builds), and
25+
26+3. old versions manually configured in the `extra-packages` field of
27+ [`configuration-hackage2nix.yaml`][2] (21 builds).
28+
29+The resulting [`hackage-packages.nix`][3] file is ~8.3 MByte large.
30+
31+Now, we could simply publish all of Hackage, i.e. all 62,354 available builds.
32+That would certainly make the lives of many Haskell hackers easier, but
33+unfortunately the resulting `hackage-packages.nix` file would require 52 MByte
34+of space. Furthermore, simple benchmarks suggest that `nix-instantiate` needs a
35+whopping 4 seconds to instantiate a `ghcWithPackages` environment from the new
36+database where instantiating the same environment used to take 0.45 seconds
37+before --- a performance drop by a factor of 8.
38+
39+Possible Improvements
40+---------------------
41+
42+We could continue to publish the "small" `hackage-packages.nix` database by
43+default, but generate an additional large database that we'd store in a
44+separate location. We would then add support for an option to
45+`~/.nixpkgs/config.nix` users could set to opt in to using the large database
46+if they want to. That way, Haskell users would have an option to get all of
47+Hackage without causing a performance drop for everyone else.
48+
49+One issue is that checking that ~50MB file into Nixpkgs might be a bad idea,
50+because it sets a dangerous precedent. Arguably, if we check all of Hackage
51+into Nixpkgs, then we cannot reasonably say *no* to someone who wants to check
52+all of CPAN into Nixpkgs too, and before we know it our Git repository triples
53+in size. So it might be wise to put the full Hackage variant of
54+`hackage-packages.nix` into a separate repository that we fetch via
55+`builtins.fetchurl` if the corresponding option is enabled.
56+
57+An altogether different approach is to improve our tools like `cabal2nix` to
58+make it convenient to add old versions from Hackage into a local Nixpkgs
59+instance, i.e. by extending the program to generate builds for all missing
60+versions to complete the transitive closure of the requested build so that
61+users don't have to run it a dozen times because multiple old versions are
62+missing. Conceivably, we could also provide tools that manage
63+`~/.nixpkgs/config.nix`, which might be a good idea independent of these
64+Haskell-specific issues.
65+
66+
67+[1]: http://nixos.org/nixpkgs/manual/#how-to-create-nix-builds-for-your-own-private-haskell-packages
68+[2]: https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/configuration-hackage2nix.yaml
69+[3]: https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/hackage-packages.nix
doc/GNUmakefile+36−2
@@ -4,7 +4,14 @@ PANDOC_FLAGS := --smart -V papersize:"a4paper"
44
55.PHONY: all clean
66
7−all: hal8.pdf hal8.html hal8-folien.pdf user-guide.pdf nixos-meetup-3-slides.pdf
7+all:: hal8.pdf hal8.html hal8-folien.pdf nixos-meetup-3-slides.pdf
8+all:: 00-future-of-haskell-packaging-in-nixpkgs.pdf
9+all:: 01-use-function-application-to-escape-override-hell.pdf
10+all:: 02-guarantee-consistent-builds-and-obsolete-overridescope.pdf
11+all:: 03-map-cabal-files-to-nix-without-information-loss.pdf
12+all:: 04-set-up-a-sufficiently-powerful-build-farm.pdf
13+all:: 05-publish-all-of-hackage.pdf
14+all:: nixcon-2015-slides.pdf
815
916%.tex : %.md
1017 pandoc -s $(PANDOC_FLAGS) -f markdown -t latex $< -o $@
@@ -18,11 +25,38 @@ all: hal8.pdf hal8.html hal8-folien.pdf user-guide.pdf nixos-meetup-3-slides.pdf
1825 pdflatex $<; \
1926 done
2027
28+%.eps : %.dia
29+ dia -e $@ -t eps $<
30+
31+%.pdf : %.eps
32+ ps2pdf -dEPSCrop $< $@
33+
2134hal8-folien.pdf : hal8-folien.md
2235 pandoc -t beamer $< -o $@
2336
2437nixos-meetup-3-slides.pdf : nixos-meetup-3-slides.md
2538 pandoc -t beamer $< -o $@
2639
40+nixcon-2015-slides.pdf : nixcon-2015-slides.md pipeline-overview.pdf pipeline-details.pdf \
41+ hackage-version-boxplot.pdf
42+ pandoc -t beamer $< -o $@
43+
44+hackage-version-boxplot.pdf : analyze-hackage.r hackage.csv
45+ Rscript $<
46+
47+hackage.csv:
48+ { set -eu -o pipefail; \
49+ cd ../hackage; \
50+ echo package,version; \
51+ for n in *; do \
52+ test -d $$n || continue; \
53+ for v in $$n/*; do \
54+ echo $$n,$$(basename $$v); \
55+ done; \
56+ done \
57+ } >$@.tmp
58+ mv $@.tmp $@
59+
2760clean:
28− @rm -f hal8.aux hal8.html hal8.log hal8.out hal8.pdf hal8.toc
61+ @rm -f *.aux *.html *.log *.out *.pdf *.toc
62+ @rm -f .Rhistory builds.csv hackage.csv
doc/analyze-hackage.rnew file+16
@@ -0,0 +1,16 @@
1+# cabal2nix/doc/analyze-hackage.r
2+
3+library(data.table)
4+
5+hackage <- within(as.data.table(read.csv("hackage.csv", header=T, stringsAsFactors=F)), {
6+ package <- ordered(package)
7+})
8+setkey(hackage, package)
9+
10+t <- hackage[,list(versions=length(version)),by=package][order(versions, decreasing=T)]
11+
12+pdf("hackage-version-boxplot.pdf",width=8, height=1.25)
13+opar <- par(mai=c(0.4,0.1,0.1,0.1))
14+boxplot(t$versions, outline=T, horizontal=TRUE, log="x", range=0)
15+par(opar)
16+dev.off()
doc/analyze-hydra-builds.rnew file+54
@@ -0,0 +1,54 @@
1+# cabal2nix/doc/analyze-hydra-builds.r
2+#
3+# Generate the input file "builds.csv" by running
4+#
5+# sudo -u hydra psql -c "Copy (select b.project, b.jobset, b.job, b.timestamp, b.drvpath, b.system, b.buildstatus, b.size, b.closuresize, bs.type, bs.starttime, bs.stoptime, bs.machine from builds b left join buildsteps bs on b.id=bs.build and b.drvpath=bs.drvpath where finished=1 and iscachedbuild=0) to stdout With CSV HEADER;" >builds.csv
6+#
7+# on Hydra.
8+
9+library(data.table)
10+
11+builds <- within(as.data.table(read.csv("builds.csv", header=T, stringsAsFactors=T)), {
12+ timestamp <- as.POSIXct(timestamp, origin="1970-01-01")
13+ starttime <- as.POSIXct(starttime, origin="1970-01-01")
14+ stoptime <- as.POSIXct(stoptime, origin="1970-01-01")
15+ runtime <- difftime(stoptime, starttime, units="mins")
16+ machine <- sub("^(hydra|root)@", "", machine)
17+})
18+builds[machine=="", machine:="localhost"]
19+setkey(builds, project, jobset, job, timestamp)
20+
21+## Determine the average build runtime of all successful Haskell builds that
22+## ran on "work".
23+
24+hs <- builds[project=="nixpkgs" & jobset=="haskell-updates",]
25+hs <- hs[machine=="work" & buildstatus==0 & system == "x86_64-linux" & runtime > 0,]
26+hs <- hs[,job:=sub("\\.x86_64-linux$", "", job)]
27+hs <- hs[,job:=sub("^haskell(ng)?Packages\\.", "", job)]
28+hs <- hs[,job:=sub(".*git-?annex.*", "git-annex", job, ignore.case=T)]
29+hs <- hs[,job:=sub("idris_plain$", "idris", job)]
30+hs <- hs[!grep("haskell(-ng)?\\.compiler\\.", job),]
31+hs <- hs[!grep("^ghc\\.ghc", job),]
32+hs <- hs[!grep("ghc[0-9]+$", job),]
33+hs <- hs[!duplicated(hs$drvpath)]
34+hs <- hs[
35+ , list(builds=length(runtime),runtime=sum(runtime),runtime.median=median(runtime),runtime.mean=mean(runtime),runtime.sd=sd(runtime))
36+ , by=job
37+ ]
38+hs <- hs[builds>10,]
39+head(hs[order(runtime.mean, decreasing=T)], n=30)
40+head(hs[order(builds, decreasing=T)], n=20)
41+summary(as.numeric(hs$runtime.mean,units="mins"))
42+quantile(as.numeric(hs$runtime.mean,units="mins"), 0.82)
43+
44+## Determine the number of builds per day.
45+
46+hs <- builds[ project=="nixpkgs" & jobset=="haskell-updates" & starttime >= as.POSIXct("2015-01-01")
47+ , list(builds=length(timestamp))
48+ , by=list(day=as.Date(timestamp))
49+ ]
50+hs <- merge(hs, data.table(day=seq(min(hs$day), max(hs$day), by="days"), ignore=0), by="day", all=T)
51+hs[is.na(builds)] <- 0
52+hs$ignore <- NULL
53+summary(hs$builds)
54+quantile(hs$builds, .8)
doc/analyze-hydra-space-requirements.rnew file+57
@@ -0,0 +1,57 @@
1+# cabal2nix/doc/analyze-hydra-space-requirements.r
2+
3+library(data.table)
4+library(rjson)
5+library(foreach)
6+library(doParallel)
7+
8+### Set up the workspace.
9+
10+cores <- detectCores()
11+options(cores=cores, mc.cores=cores)
12+cl <- makeForkCluster(cores)
13+registerDoParallel(cl)
14+setDefaultCluster(cl)
15+
16+builds <- foreach (i=list.files(".", "*.json"), .combine="rbind") %dopar% {
17+ print(i)
18+ l <- fromJSON(file=i)
19+ pkgset <- names(l)
20+ data.table(pkgset, pkg=names(l[[pkgset]]), out=unlist(l[[pkgset]]))
21+}
22+setkey(builds, pkgset, pkg)
23+
24+t <- foreach (out=unique(builds$out), .combine="rbind") %dopar% {
25+ size <- system(paste("( du -sb", out, "| cut -f1 ) 2>/dev/null || true"), intern=TRUE)
26+ size <- if (identical(size, character(0))) "" else size
27+ data.table(out, size=as.integer(size))
28+}
29+
30+builds <- merge(builds, t, by="out")
31+
32+### Analyze the data.
33+
34+# Total number of attributes in all package sets.
35+builds_total <- nrow(builds)
36+
37+# Number of distict builds (output paths).
38+builds_unique <- length(unique(builds$out))
39+
40+# Size of haskellPackages per platform.
41+haskellPackages <- unique(builds[pkgset != "ghc7102" & !is.na(size),list(out,size)])
42+haskellPackages_size <- sum(as.numeric(haskellPackages$size))
43+
44+# List of distinct sizes.
45+sizes <- unique(builds[pkg != "ghc" & !is.na(size),list(out,size)])$size
46+
47+# Average output path size.
48+avg_build_size <- mean(sizes)
49+sd_build_size <- sd(sizes)
50+summary(sizes / 1e6)
51+
52+# Biggest builds.
53+biggest_builds <- head(builds[!is.na(size),list(size=mean(size)),by=pkg][order(size, decreasing=T)], n=20)
54+biggest_builds$size <- round(biggest_builds$size / 1e6, 1)
55+
56+# Number of builds, distinguished by package set.
57+builds_by_pkgset <- builds[,list(attributes=length(pkg)), by=pkgset][order(pkgset)]
doc/future.orgnew file+60
@@ -0,0 +1,60 @@
1+#+TITLE: The Future of Haskell Packaging in Nix
2+
3+* DONE Use Function Application To Escape Override Hell
4+* DONE Guarantee Consistent Builds and Obsolete =overrideScope=
5+* DONE Map Cabal Files To Nix Without Information Loss
6+* TODO Implement Proper Dependency Resolution
7+* TODO Develop Intelligent Policies for Post-processing and Patching
8+* TODO Users Need a Configuration Mechanism That Is Both Simpler and More Powerful
9+* TODO Deal With Infinite Recursions in Test Dependencies
10+* DONE Set up a Sufficiently Powerful Build Farm
11+* TODO Define and Publish Processes for Managing the Package Set(s)
12+* DONE Publish All of Hackage
13+
14+ We publish 10,745 package versions out of 60,504 available ones, i.e. 18% of
15+ Hackage. Those packages are selected as follows: we distribute the latest
16+ version of every package --- 8,764 builds --- plus an additional 1,981 older
17+ versions that are required by the various LTS Haskell and Stackage Nightly
18+ package sets we support.
19+
20+* TODO Generate Differential Build Expressions
21+* TODO Generate Build Expressions for Hydra
22+* TODO Add Support for Mega Repositories to =cabal2nix=
23+* TODO Support Building With =stack=
24+* TODO Support multi-output derivations
25+
26+ Put static, shared, and profiled library variants into separate output so
27+ that we can build everything without forcing users to download all that stuff
28+ if they just want the regular build.
29+* TODO Write a =ghcWithPackages= combinator to create conglomerate workspaces
30+
31+ Thomas Strobel <thomas@strobel.eu> suggested this:
32+
33+ I want to hack on a set of libraries, say transformers and mtl, and I'd like
34+ to do that in an environment that contains criterion, QuickCheck, etc. So I
35+ run
36+
37+ stackWithPackages (hp: {
38+ sources = with hp; [transformers mtl];
39+ env = with hp; [criterion QuickCheck];
40+ })
41+
42+ This should create a conglomerate workspace / nix-shell environment that
43+ contains the source code for transformers and lens in subdirectories plus a
44+ stack.yaml file that builds them both:
45+
46+ stack.yaml
47+ mtl / ...
48+ transformers ...
49+
50+ The environment would contain a GHC with criterion and QuickCheck registered
51+ in appropriate LTS versions so that the stack builds don't compile anything
52+ except the packages I'm hacking on.
53+
54+ The value of env could possibly be auto-determined from the dependencies of
55+ transformers and mtl.
56+* TODO Solve the too-eager evaluation of meta.broken
57+
58+ We'd like to mark builds that are known to fail with `meta.broken = true`,
59+ but this is impractical because users have no way to override that setting if
60+ they discover that the package has been fixed in a new version.
doc/hal8-folien.md+1−1
@@ -284,6 +284,6 @@ BSD, etc. ausführen.
284284
285285- `http://nixos.org/wiki/Haskell`
286286
287−- `nix-dev@lists.science.uu.nl`
287+- `https://groups.google.com/forum/#!forum/nix-devel`
288288
289289- `#nixos` auf `irc.freenode.org`
doc/hal8.md+1−1
@@ -190,7 +190,7 @@ Haskell Platform later, so one doesn't have to worry that every single install
190190is going to be that expensive.
191191
192192In its last step, `nix-env` creates a "user environment" at
193−`$HOME/.nix-profile`, which simplies use of the installed packages a lot. That
193+`$HOME/.nix-profile`, which simplifies use of the installed packages a lot. That
194194environment uses symlinks to create a view of the Nix store that combines those
195195packages that have been installed into a single hierarchy. For example, the
196196path `~/.nix-profile/bin/ghc` will be a symlink to
doc/list-haskell-store-paths.nixnew file+27
@@ -0,0 +1,27 @@
1+# list-haskell-store-paths.nix
2+
3+let
4+
5+ inherit (import <nixpkgs> { config.allowBroken = true; }) lib haskell;
6+
7+ listStorePaths = pkgset: lib.mapAttrs
8+ (attr: drv: builtins.toPath drv)
9+ (lib.filterAttrs isActiveBuild haskell.packages.${pkgset});
10+
11+ isActiveBuild = name: drv: let r = builtins.tryEval (hasNonEmptyPlatforms drv && isNotBroken drv);
12+ in if r.success then r.value else false;
13+
14+ hasNonEmptyPlatforms = drv: lib.isDerivation drv && getPlatforms drv != [];
15+
16+ isNotBroken = drv: !(lib.attrByPath ["meta" "broken"] false drv);
17+
18+ getPlatforms = drv: lib.attrByPath ["hydraPlatforms"]
19+ (lib.attrByPath ["Platforms"] [])
20+ (drv.meta or {});
21+
22+in
23+
24+# Using "lib.attrNames haskell.packages" instead of pkgset would be nice, but
25+# nix-instantiate doesn't cope.
26+
27+{ pkgset }: lib.genAttrs [pkgset] listStorePaths
doc/list-haskell-store-paths.shnew file+11
@@ -0,0 +1,11 @@
1+#! /usr/bin/env bash
2+
3+set -eu -o pipefail
4+
5+pkgsets=( $(nix-instantiate --eval -E 'with (import <nixpkgs> {}); builtins.attrNames haskell.packages') )
6+n=$(( ${#pkgsets[@]} - 2 ))
7+
8+for n in ${pkgsets[@]:1:$n}; do
9+ eval n=$n
10+ nix-instantiate --eval --strict --json list-haskell-store-paths.nix --argstr pkgset $n >$n.json
11+done
doc/nixcon-2015-slides.mdnew file+357
@@ -0,0 +1,357 @@
1+% The Nixpkgs Haskell Infrastructure
2+% Peter Simons \<simons@cryp.to\>
3+% NixCon 2015
4+
5+-------------------------------------------------------------------------------
6+
7+# Players Involved in Haskell Packaging
8+
9+![](pipeline-overview.pdf)\
10+
11+
12+-------------------------------------------------------------------------------
13+
14+# The Packaging Process
15+
16+![](pipeline-details.pdf)\
17+
18+
19+-------------------------------------------------------------------------------
20+
21+# Hackage
22+
23+- 62,423 Cabal files (+41.6 per day)
24+
25+- 9,028 distinct packages (+4.9 per day)
26+
27+- $\mu=6.9, \sigma=\pm 10.3$ releases per package:
28+ ![](hackage-version-boxplot.pdf)
29+
30+- Top 10 most active packages: egison (149), git-annex (145), hakyll (145),
31+ purescript (141), yesod-core (140), warp (136), lens (129), wai-extra (119),
32+ yesod (116), and hlint (114).
33+
34+-------------------------------------------------------------------------------
35+
36+# Hackage: Structure of the Git Repository
37+
38+ 3d-graphics-examples
39+ 3dmodels
40+ 4Blocks
41+ [...]
42+ mtl
43+ +-- 1.0
44+ | +-- mtl.cabal
45+ | +-- mtl.json
46+ +-- [...]
47+ +-- 2.2.1
48+ +-- mtl.cabal
49+ +-- mtl.json
50+ [...]
51+ ztail
52+ Zwaluw
53+
54+-------------------------------------------------------------------------------
55+
56+# Hackage: `mtl/2.2.1/mtl.cabal`
57+
58+ name: mtl
59+ version: 2.2.1
60+ license: BSD3
61+ synopsis: Monad classes, using functional dependencies
62+ homepage: http://github.com/ekmett/mtl
63+ build-type: Simple
64+
65+ Library
66+ exposed-modules:
67+ Control.Monad.Cont
68+ [...]
69+ build-depends: base < 6, transformers == 0.4.*
70+ extensions:
71+ MultiParamTypeClasses
72+ FunctionalDependencies
73+ FlexibleInstances
74+
75+-------------------------------------------------------------------------------
76+
77+# Hackage: `mtl/2.2.1/mtl.json`
78+
79+ { "package-hashes" : { "MD5" : "96a2f12b...",
80+ "Skein512_512" : "73b5858d...",
81+ "SHA1" : "c244f8ec...",
82+ "SHA256" : "cae59d79...",
83+ "SHA512" : "5c31626b..."
84+ },
85+ "package-locations" : [
86+ "https://hackage.haskell.org/package/mtl-2.2.1/" \
87+ "mtl-2.2.1.tar.gz",
88+ "https://s3.amazonaws.com/hackage.fpcomplete.com/" \
89+ "package/mtl-2.2.1.tar.gz"
90+ ],
91+ "package-size" : 15391
92+ }
93+
94+-------------------------------------------------------------------------------
95+
96+# Hackage: Nix Build for mtl 2.2.1
97+
98+ { mkDerivation, base, stdenv, transformers }:
99+
100+ mkDerivation {
101+ pname = "mtl";
102+ version = "2.2.1";
103+ sha256 = "cae59d79f3a16f8e9f3c9adc1010c7c6...";
104+ libraryHaskellDepends = [ base transformers ];
105+ homepage = "http://github.com/ekmett/mtl";
106+ description = "Monad classes, using functional ...";
107+ license = stdenv.lib.licenses.bsd3;
108+ }
109+
110+-------------------------------------------------------------------------------
111+
112+# Hackage: Destructive Editing
113+
114+`MonadRandom/0.4/MonadRandom.cabal` contains a line:
115+
116+ x-revision: 2
117+
118+This translates to Nix:
119+
120+ revision = "2";
121+ editedCabalFile = "2e218afd5b29c868...";
122+
123+The build log will say:
124+
125+> Replace Cabal file with edited version from
126+> http://hackage.haskell.org/package/MonadRandom-0.4/revision/2.cabal.
127+
128+-------------------------------------------------------------------------------
129+
130+# Hackage: Conditional Values
131+
132+Values in Cabal files may depend on OS, architecture, compiler, and flags.
133+For example, hint 0.4.2.3 specifies:
134+
135+ Library
136+ if impl(ghc >= 6.8)
137+ build-depends: random, directory
138+ if impl(ghc >= 6.10)
139+ build-depends: base >= 4, base < 5,
140+ ghc-mtl == 1.2.1.*
141+ else
142+ build-depends: base >= 3, base < 4
143+ else
144+ build-depends: utf8-string < 0.3
145+ if !os(windows)
146+ build-depends: unix >= 2.2.0.0
147+
148+-------------------------------------------------------------------------------
149+
150+# Hackage: Cabal Flags
151+
152+Flags can be specified by the user or auto-configured by the build to fit the
153+environment. For example, pandoc 1.15.1.1 defines:
154+
155+ Flag https
156+ Description: Enable support for downloading over https.
157+
158+ Library
159+ Build-Depends: base >= 4.2 && <5,
160+ syb >= 0.1 && < 0.7,
161+ [...]
162+ ghc-prim >= 0.2
163+ if flag(https)
164+ Build-Depends: http-client >= 0.3.2 && < 0.5,
165+ http-client-tls >= 0.2 && < 0.3,
166+ http-types >= 0.8 && < 0.10
167+
168+-------------------------------------------------------------------------------
169+
170+# Stackage: Stable Hackage
171+
172+- 1,605 packages (18% of Hackage)
173+
174+- Build instructions published via Git specify parameters such as "don't run
175+ test suite", "don't run Haddock", etc.
176+
177+- Testing takes place on 64-bit Linux.
178+
179+- Nightly Snapshots contain the latest version of every package such that the
180+ package set is consistent.
181+
182+- LTS minor releases are created weekly and contain only point releases that
183+ don't change the API.
184+
185+- LTS major releases contain API-breaking changes and usually conincide with a
186+ compiler update.
187+
188+-------------------------------------------------------------------------------
189+
190+# cabal2nix & hackage2nix
191+
192+- Code lives at <https://github.com/NixOS/cabal2nix>:
193+ - `distribution-nixpkgs` library
194+ - `cabal2nix` executable
195+ - `hackage2nix` executable
196+
197+- [`update-nixpkgs.sh`](https://github.com/NixOS/cabal2nix/blob/master/hackage2nix/update-nixpkgs.sh)
198+ script runs automatically once per hour.
199+
200+- Changes go to `haskell-updates` branch in [peti's Nixpkgs fork on Github](https://github.com/peti/nixpkgs).
201+
202+- [`hydra.cryp.to`](http://hydra.cryp.to/jobset/nixpkgs/haskell-updates)
203+ continuously builds Stackage Nightly and the latest LTS Haskell package set.
204+
205+- If Hydra builds work sufficiently well, updates are manually merged into
206+ `master` branch of main repository.
207+
208+- [`generate-nixpkgs-haskell-package-list`](https://github.com/peti/package-list)
209+ utility manually publishes new state of Nixpkgs on Hackage.
210+
211+-------------------------------------------------------------------------------
212+
213+# Nixpkgs: `hackage-packages.nix`
214+
215+The package set is represented as a primitive recursive function:
216+
217+ ps = self: {
218+ "3d-graphics-examples" = callPackage ...;
219+ ...
220+ "mtl_2_1_3_1" = callPackage ...;
221+ "mtl" = callPackage ...;
222+ ...
223+ "ztail" = callPackage ...;
224+ };
225+
226+The Nixpkgs attribute set `haskellPackages` refers to the fixpoint of that
227+function which is computed by the expression:
228+
229+ let self = ps self;
230+ in # = ps (ps self) = ps (ps (ps (self))) = ...
231+ self
232+
233+-------------------------------------------------------------------------------
234+
235+# Nixpkgs: hackage-packages.nix
236+
237+We can modify the package set using OO-style inheritance:
238+
239+ fix = f: let self = f self; in self;
240+ extend = rattrs: f: self: let super = rattrs self;
241+ in super // f self super;
242+
243+ ps = self: {
244+ foo = "foo"; bar = "bar";
245+ foobar = self.foo + self.bar;
246+ };
247+
248+ f = self: super: { foo = reverse super.foo; };
249+
250+- `(fix ps).foobar` $\equiv$ `"foobar"`
251+- `(fix (extend ps f)).foobar` $\equiv$ `"oofbar"`
252+- `(fix (extend (extend ps f) f)).foobar` $\equiv$ `"foobar"`
253+
254+-------------------------------------------------------------------------------
255+
256+# Nixpkgs: pkgs/development/haskell-modules/default.nix
257+
258+ { compilerConfig ? (self: super: {})
259+ , packageSetConfig ? (self: super: {})
260+ , overrides ? (self: super: {})
261+ }:
262+
263+ fix
264+ (extend
265+ (extend
266+ (extend
267+ (extend haskellPackages commonConfiguration)
268+ compilerConfig)
269+ packageSetConfig)
270+ overrides)
271+
272+-------------------------------------------------------------------------------
273+
274+# Nixpkgs: Multiple Views Of The Package Set
275+
276+- `hackage-packages.nix` represents "Stackage Nightly".
277+
278+- `configuration-common.nix` "extends" that to work around deficiencies in
279+ `hackage2nix`.
280+
281+- `configuration-ghc-x.y.nix` "extends" that with fixes relevant only for
282+ particular compiler versions: `haskell.packages.ghcXY`.
283+
284+- `configuration-lts-v.w.nix` "extends" those sets to choose default versions
285+ according to "LTS Haskell x.y": `haskell.packages.lts-x_y`.
286+
287+-------------------------------------------------------------------------------
288+
289+# Nixpkgs: `overrideCabal`
290+
291+Haskell derivations take the `mkDerivation` function as an argument:
292+
293+ { mkDerivation, ... }: mkDerivation {
294+ pname = "mtl";
295+ version = "2.2.1";
296+ ...
297+ }
298+
299+The `override` method changes the arguments passed to a derivation --- so we
300+can change the definition of `mkDerivation`:
301+
302+ overrideCabal = drv: f: drv.override (args: args // {
303+ mkDerivation = drv: args.mkDerivation (drv // f drv);
304+ });
305+
306+-------------------------------------------------------------------------------
307+
308+# Nixpkgs: `haskell.lib` Helper Functions
309+
310+ doHaddock = ...;
311+ dontHaddock = drv: overrideCabal drv (drv: {
312+ doHaddock = false;
313+ });
314+
315+ enableLibraryProfiling = ...;
316+ disableLibraryProfiling = drv: overrideCabal drv (drv: {
317+ enableLibraryProfiling = false;
318+ });
319+
320+ addBuildTool = drv: x: addBuildTools drv [x];
321+ addBuildTools = drv: xs: overrideCabal drv (drv: {
322+ buildTools = (drv.buildTools or []) ++ xs;
323+ });
324+
325+-------------------------------------------------------------------------------
326+
327+# Nixpkgs: Deep Overriding
328+
329+ fix = f: let x = f x // { __unfix__ = f; }; in x;
330+
331+ haskellPackages = self:
332+ let
333+ callPackage = callPackageWithScope self;
334+
335+ callPackageWithScope = scope: drv: args:
336+ (stdenv.lib.callPackageWith scope drv args) // {
337+ overrideScope = f:
338+ callPackageWithScope
339+ (fix (extend scope.__unfix__ f))
340+ drv args;
341+ };
342+ in
343+ { "git-annex" = callPackage ...; };
344+
345+-------------------------------------------------------------------------------
346+
347+# Other Resources
348+
349+- <http://hackage.haskell.org/>
350+
351+- <http://www.stackage.org/>
352+
353+- <http://nixos.org/nixpkgs/manual/#users-guide-to-the-haskell-infrastructure>
354+
355+- <https://groups.google.com/forum/#!forum/nix-devel>
356+
357+- `#nixos` at `irc.freenode.org`
doc/nixos-meetup-3-slides.md+4−4
@@ -342,9 +342,9 @@ Haskell-specific resources:
342342- https://github.com/NixOS/nixpkgs/issues/4941
343343
344344- A Journey into the Haskell NG infrastructure
345− - Part 1: http://lists.science.uu.nl/pipermail/nix-dev/2015-January/015591.html
346− - Part 2: http://lists.science.uu.nl/pipermail/nix-dev/2015-January/015608.html
347− - Part 3: http://lists.science.uu.nl/pipermail/nix-dev/2015-April/016912.html
345+ - Part 1: https://nixos.org/nix-dev/2015-January/015591.html
346+ - Part 2: https://nixos.org/nix-dev/2015-January/015608.html
347+ - Part 3: https://nixos.org/nix-dev/2015-April/016912.html
348348
349349- Oliver Charles Wiki: http://wiki.ocharles.org.uk/Nix
350350
@@ -352,6 +352,6 @@ General Nix resources:
352352
353353- `https://nixos.org/`
354354
355−- `nix-dev@lists.science.uu.nl`
355+- https://groups.google.com/forum/#!forum/nix-devel
356356
357357- `#nixos` auf `irc.freenode.org`
doc/pipeline-details.dianew file+1767
@@ -0,0 +1,1767 @@
1+<?xml version="1.0" encoding="UTF-8"?>
2+<dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
3+ <dia:diagramdata>
4+ <dia:attribute name="background">
5+ <dia:color val="#ffffff"/>
6+ </dia:attribute>
7+ <dia:attribute name="pagebreak">
8+ <dia:color val="#000099"/>
9+ </dia:attribute>
10+ <dia:attribute name="paper">
11+ <dia:composite type="paper">
12+ <dia:attribute name="name">
13+ <dia:string>#A4#</dia:string>
14+ </dia:attribute>
15+ <dia:attribute name="tmargin">
16+ <dia:real val="2.8199999332427979"/>
17+ </dia:attribute>
18+ <dia:attribute name="bmargin">
19+ <dia:real val="2.8222000598907471"/>
20+ </dia:attribute>
21+ <dia:attribute name="lmargin">
22+ <dia:real val="2.8222000598907471"/>
23+ </dia:attribute>
24+ <dia:attribute name="rmargin">
25+ <dia:real val="2.8222000598907471"/>
26+ </dia:attribute>
27+ <dia:attribute name="is_portrait">
28+ <dia:boolean val="true"/>
29+ </dia:attribute>
30+ <dia:attribute name="scaling">
31+ <dia:real val="0.50346225500106812"/>
32+ </dia:attribute>
33+ <dia:attribute name="fitto">
34+ <dia:boolean val="true"/>
35+ </dia:attribute>
36+ <dia:attribute name="fitwidth">
37+ <dia:int val="1"/>
38+ </dia:attribute>
39+ <dia:attribute name="fitheight">
40+ <dia:int val="1"/>
41+ </dia:attribute>
42+ </dia:composite>
43+ </dia:attribute>
44+ <dia:attribute name="grid">
45+ <dia:composite type="grid">
46+ <dia:attribute name="width_x">
47+ <dia:real val="1"/>
48+ </dia:attribute>
49+ <dia:attribute name="width_y">
50+ <dia:real val="1"/>
51+ </dia:attribute>
52+ <dia:attribute name="visible_x">
53+ <dia:int val="1"/>
54+ </dia:attribute>
55+ <dia:attribute name="visible_y">
56+ <dia:int val="1"/>
57+ </dia:attribute>
58+ <dia:composite type="color"/>
59+ </dia:composite>
60+ </dia:attribute>
61+ <dia:attribute name="color">
62+ <dia:color val="#d8e5e5"/>
63+ </dia:attribute>
64+ <dia:attribute name="guides">
65+ <dia:composite type="guides">
66+ <dia:attribute name="hguides"/>
67+ <dia:attribute name="vguides"/>
68+ </dia:composite>
69+ </dia:attribute>
70+ </dia:diagramdata>
71+ <dia:layer name="Background" visible="true" active="true">
72+ <dia:object type="Standard - Box" version="0" id="O0">
73+ <dia:attribute name="obj_pos">
74+ <dia:point val="-3,16.3"/>
75+ </dia:attribute>
76+ <dia:attribute name="obj_bb">
77+ <dia:rectangle val="-3.05,16.25;5.95,29.75"/>
78+ </dia:attribute>
79+ <dia:attribute name="elem_corner">
80+ <dia:point val="-3,16.3"/>
81+ </dia:attribute>
82+ <dia:attribute name="elem_width">
83+ <dia:real val="8.9000000000000021"/>
84+ </dia:attribute>
85+ <dia:attribute name="elem_height">
86+ <dia:real val="13.399999999999999"/>
87+ </dia:attribute>
88+ <dia:attribute name="border_width">
89+ <dia:real val="0.10000000149011612"/>
90+ </dia:attribute>
91+ <dia:attribute name="inner_color">
92+ <dia:color val="#bfbfbf"/>
93+ </dia:attribute>
94+ <dia:attribute name="show_background">
95+ <dia:boolean val="true"/>
96+ </dia:attribute>
97+ <dia:attribute name="line_style">
98+ <dia:enum val="4"/>
99+ </dia:attribute>
100+ </dia:object>
101+ <dia:object type="Standard - Box" version="0" id="O1">
102+ <dia:attribute name="obj_pos">
103+ <dia:point val="14.85,12.965"/>
104+ </dia:attribute>
105+ <dia:attribute name="obj_bb">
106+ <dia:rectangle val="14.8,12.915;27.45,29.65"/>
107+ </dia:attribute>
108+ <dia:attribute name="elem_corner">
109+ <dia:point val="14.85,12.965"/>
110+ </dia:attribute>
111+ <dia:attribute name="elem_width">
112+ <dia:real val="12.549999999999995"/>
113+ </dia:attribute>
114+ <dia:attribute name="elem_height">
115+ <dia:real val="16.634999999999987"/>
116+ </dia:attribute>
117+ <dia:attribute name="border_width">
118+ <dia:real val="0.10000000149011612"/>
119+ </dia:attribute>
120+ <dia:attribute name="inner_color">
121+ <dia:color val="#bfbfbf"/>
122+ </dia:attribute>
123+ <dia:attribute name="show_background">
124+ <dia:boolean val="true"/>
125+ </dia:attribute>
126+ <dia:attribute name="line_style">
127+ <dia:enum val="4"/>
128+ </dia:attribute>
129+ </dia:object>
130+ <dia:group>
131+ <dia:object type="Flowchart - Parallelogram" version="0" id="O2">
132+ <dia:attribute name="obj_pos">
133+ <dia:point val="17.2356,25.9784"/>
134+ </dia:attribute>
135+ <dia:attribute name="obj_bb">
136+ <dia:rectangle val="17.1856,25.9284;26.9072,28.0284"/>
137+ </dia:attribute>
138+ <dia:attribute name="elem_corner">
139+ <dia:point val="17.2356,25.9784"/>
140+ </dia:attribute>
141+ <dia:attribute name="elem_width">
142+ <dia:real val="9.6216166559453669"/>
143+ </dia:attribute>
144+ <dia:attribute name="elem_height">
145+ <dia:real val="2"/>
146+ </dia:attribute>
147+ <dia:attribute name="show_background">
148+ <dia:boolean val="true"/>
149+ </dia:attribute>
150+ <dia:attribute name="shear_angle">
151+ <dia:real val="70"/>
152+ </dia:attribute>
153+ <dia:attribute name="padding">
154+ <dia:real val="0.5"/>
155+ </dia:attribute>
156+ <dia:attribute name="text">
157+ <dia:composite type="text">
158+ <dia:attribute name="string">
159+ <dia:string>#configuration-lts-x.y.nix#</dia:string>
160+ </dia:attribute>
161+ <dia:attribute name="font">
162+ <dia:font family="sans" style="0" name="Helvetica"/>
163+ </dia:attribute>
164+ <dia:attribute name="height">
165+ <dia:real val="0.80000000000000004"/>
166+ </dia:attribute>
167+ <dia:attribute name="pos">
168+ <dia:point val="22.0464,27.1734"/>
169+ </dia:attribute>
170+ <dia:attribute name="color">
171+ <dia:color val="#000000"/>
172+ </dia:attribute>
173+ <dia:attribute name="alignment">
174+ <dia:enum val="1"/>
175+ </dia:attribute>
176+ </dia:composite>
177+ </dia:attribute>
178+ </dia:object>
179+ <dia:object type="Flowchart - Parallelogram" version="0" id="O3">
180+ <dia:attribute name="obj_pos">
181+ <dia:point val="16.4139,26.4093"/>
182+ </dia:attribute>
183+ <dia:attribute name="obj_bb">
184+ <dia:rectangle val="16.3639,26.3593;26.0855,28.4593"/>
185+ </dia:attribute>
186+ <dia:attribute name="elem_corner">
187+ <dia:point val="16.4139,26.4093"/>
188+ </dia:attribute>
189+ <dia:attribute name="elem_width">
190+ <dia:real val="9.6216166559453669"/>
191+ </dia:attribute>
192+ <dia:attribute name="elem_height">
193+ <dia:real val="2"/>
194+ </dia:attribute>
195+ <dia:attribute name="show_background">
196+ <dia:boolean val="true"/>
197+ </dia:attribute>
198+ <dia:attribute name="shear_angle">
199+ <dia:real val="70"/>
200+ </dia:attribute>
201+ <dia:attribute name="padding">
202+ <dia:real val="0.5"/>
203+ </dia:attribute>
204+ <dia:attribute name="text">
205+ <dia:composite type="text">
206+ <dia:attribute name="string">
207+ <dia:string>#configuration-lts-x.y.nix#</dia:string>
208+ </dia:attribute>
209+ <dia:attribute name="font">
210+ <dia:font family="sans" style="0" name="Helvetica"/>
211+ </dia:attribute>
212+ <dia:attribute name="height">
213+ <dia:real val="0.80000000000000004"/>
214+ </dia:attribute>
215+ <dia:attribute name="pos">
216+ <dia:point val="21.2247,27.6043"/>
217+ </dia:attribute>
218+ <dia:attribute name="color">
219+ <dia:color val="#000000"/>
220+ </dia:attribute>
221+ <dia:attribute name="alignment">
222+ <dia:enum val="1"/>
223+ </dia:attribute>
224+ </dia:composite>
225+ </dia:attribute>
226+ </dia:object>
227+ <dia:object type="Flowchart - Parallelogram" version="0" id="O4">
228+ <dia:attribute name="obj_pos">
229+ <dia:point val="15.7148,26.8153"/>
230+ </dia:attribute>
231+ <dia:attribute name="obj_bb">
232+ <dia:rectangle val="15.6648,26.7653;25.3864,28.8653"/>
233+ </dia:attribute>
234+ <dia:attribute name="elem_corner">
235+ <dia:point val="15.7148,26.8153"/>
236+ </dia:attribute>
237+ <dia:attribute name="elem_width">
238+ <dia:real val="9.6216166559453669"/>
239+ </dia:attribute>
240+ <dia:attribute name="elem_height">
241+ <dia:real val="2"/>
242+ </dia:attribute>
243+ <dia:attribute name="show_background">
244+ <dia:boolean val="true"/>
245+ </dia:attribute>
246+ <dia:attribute name="shear_angle">
247+ <dia:real val="70"/>
248+ </dia:attribute>
249+ <dia:attribute name="padding">
250+ <dia:real val="0.5"/>
251+ </dia:attribute>
252+ <dia:attribute name="text">
253+ <dia:composite type="text">
254+ <dia:attribute name="string">
255+ <dia:string>#configuration-lts-x.y.nix#</dia:string>
256+ </dia:attribute>
257+ <dia:attribute name="font">
258+ <dia:font family="sans" style="0" name="Helvetica"/>
259+ </dia:attribute>
260+ <dia:attribute name="height">
261+ <dia:real val="0.80000000000000004"/>
262+ </dia:attribute>
263+ <dia:attribute name="pos">
264+ <dia:point val="20.5256,28.0103"/>
265+ </dia:attribute>
266+ <dia:attribute name="color">
267+ <dia:color val="#000000"/>
268+ </dia:attribute>
269+ <dia:attribute name="alignment">
270+ <dia:enum val="1"/>
271+ </dia:attribute>
272+ </dia:composite>
273+ </dia:attribute>
274+ </dia:object>
275+ </dia:group>
276+ <dia:object type="Standard - Line" version="0" id="O5">
277+ <dia:attribute name="obj_pos">
278+ <dia:point val="21.5216,23.6895"/>
279+ </dia:attribute>
280+ <dia:attribute name="obj_bb">
281+ <dia:rectangle val="21.2119,23.6383;21.9353,26.5211"/>
282+ </dia:attribute>
283+ <dia:attribute name="conn_endpoints">
284+ <dia:point val="21.5216,23.6895"/>
285+ <dia:point val="21.5887,26.4093"/>
286+ </dia:attribute>
287+ <dia:attribute name="numcp">
288+ <dia:int val="1"/>
289+ </dia:attribute>
290+ <dia:attribute name="end_arrow">
291+ <dia:enum val="22"/>
292+ </dia:attribute>
293+ <dia:attribute name="end_arrow_length">
294+ <dia:real val="0.5"/>
295+ </dia:attribute>
296+ <dia:attribute name="end_arrow_width">
297+ <dia:real val="0.5"/>
298+ </dia:attribute>
299+ <dia:connections>
300+ <dia:connection handle="0" to="O7" connection="14"/>
301+ <dia:connection handle="1" to="O3" connection="2"/>
302+ </dia:connections>
303+ </dia:object>
304+ <dia:group>
305+ <dia:object type="Flowchart - Manual Input" version="1" id="O6">
306+ <dia:attribute name="obj_pos">
307+ <dia:point val="17.5436,21.2235"/>
308+ </dia:attribute>
309+ <dia:attribute name="obj_bb">
310+ <dia:rectangle val="17.4936,21.1687;26.3211,23.2735"/>
311+ </dia:attribute>
312+ <dia:attribute name="meta">
313+ <dia:composite type="dict"/>
314+ </dia:attribute>
315+ <dia:attribute name="elem_corner">
316+ <dia:point val="17.5436,21.2235"/>
317+ </dia:attribute>
318+ <dia:attribute name="elem_width">
319+ <dia:real val="8.7275000000000009"/>
320+ </dia:attribute>
321+ <dia:attribute name="elem_height">
322+ <dia:real val="2"/>
323+ </dia:attribute>
324+ <dia:attribute name="line_width">
325+ <dia:real val="0.10000000000000001"/>
326+ </dia:attribute>
327+ <dia:attribute name="line_colour">
328+ <dia:color val="#000000"/>
329+ </dia:attribute>
330+ <dia:attribute name="fill_colour">
331+ <dia:color val="#ffffff"/>
332+ </dia:attribute>
333+ <dia:attribute name="show_background">
334+ <dia:boolean val="true"/>
335+ </dia:attribute>
336+ <dia:attribute name="line_style">
337+ <dia:enum val="0"/>
338+ <dia:real val="1"/>
339+ </dia:attribute>
340+ <dia:attribute name="padding">
341+ <dia:real val="0.10000000000000001"/>
342+ </dia:attribute>
343+ <dia:attribute name="text">
344+ <dia:composite type="text">
345+ <dia:attribute name="string">
346+ <dia:string>#configuration-ghc-x.y.nix#</dia:string>
347+ </dia:attribute>
348+ <dia:attribute name="font">
349+ <dia:font family="sans" style="0" name="Helvetica"/>
350+ </dia:attribute>
351+ <dia:attribute name="height">
352+ <dia:real val="0.80000000000000004"/>
353+ </dia:attribute>
354+ <dia:attribute name="pos">
355+ <dia:point val="21.9074,22.8235"/>
356+ </dia:attribute>
357+ <dia:attribute name="color">
358+ <dia:color val="#000000"/>
359+ </dia:attribute>
360+ <dia:attribute name="alignment">
361+ <dia:enum val="1"/>
362+ </dia:attribute>
363+ </dia:composite>
364+ </dia:attribute>
365+ <dia:attribute name="flip_horizontal">
366+ <dia:boolean val="false"/>
367+ </dia:attribute>
368+ <dia:attribute name="flip_vertical">
369+ <dia:boolean val="false"/>
370+ </dia:attribute>
371+ <dia:attribute name="subscale">
372+ <dia:real val="1"/>
373+ </dia:attribute>
374+ </dia:object>
375+ <dia:object type="Flowchart - Manual Input" version="1" id="O7">
376+ <dia:attribute name="obj_pos">
377+ <dia:point val="17.1578,21.6895"/>
378+ </dia:attribute>
379+ <dia:attribute name="obj_bb">
380+ <dia:rectangle val="17.1078,21.6347;25.9353,23.7395"/>
381+ </dia:attribute>
382+ <dia:attribute name="meta">
383+ <dia:composite type="dict"/>
384+ </dia:attribute>
385+ <dia:attribute name="elem_corner">
386+ <dia:point val="17.1578,21.6895"/>
387+ </dia:attribute>
388+ <dia:attribute name="elem_width">
389+ <dia:real val="8.7275000000000009"/>
390+ </dia:attribute>
391+ <dia:attribute name="elem_height">
392+ <dia:real val="2"/>
393+ </dia:attribute>
394+ <dia:attribute name="line_width">
395+ <dia:real val="0.10000000000000001"/>
396+ </dia:attribute>
397+ <dia:attribute name="line_colour">
398+ <dia:color val="#000000"/>
399+ </dia:attribute>
400+ <dia:attribute name="fill_colour">
401+ <dia:color val="#ffffff"/>
402+ </dia:attribute>
403+ <dia:attribute name="show_background">
404+ <dia:boolean val="true"/>
405+ </dia:attribute>
406+ <dia:attribute name="line_style">
407+ <dia:enum val="0"/>
408+ <dia:real val="1"/>
409+ </dia:attribute>
410+ <dia:attribute name="padding">
411+ <dia:real val="0.10000000000000001"/>
412+ </dia:attribute>
413+ <dia:attribute name="text">
414+ <dia:composite type="text">
415+ <dia:attribute name="string">
416+ <dia:string>#configuration-ghc-x.y.nix#</dia:string>
417+ </dia:attribute>
418+ <dia:attribute name="font">
419+ <dia:font family="sans" style="0" name="Helvetica"/>
420+ </dia:attribute>
421+ <dia:attribute name="height">
422+ <dia:real val="0.80000000000000004"/>
423+ </dia:attribute>
424+ <dia:attribute name="pos">
425+ <dia:point val="21.5216,23.2895"/>
426+ </dia:attribute>
427+ <dia:attribute name="color">
428+ <dia:color val="#000000"/>
429+ </dia:attribute>
430+ <dia:attribute name="alignment">
431+ <dia:enum val="1"/>
432+ </dia:attribute>
433+ </dia:composite>
434+ </dia:attribute>
435+ <dia:attribute name="flip_horizontal">
436+ <dia:boolean val="false"/>
437+ </dia:attribute>
438+ <dia:attribute name="flip_vertical">
439+ <dia:boolean val="false"/>
440+ </dia:attribute>
441+ <dia:attribute name="subscale">
442+ <dia:real val="1"/>
443+ </dia:attribute>
444+ </dia:object>
445+ <dia:object type="Flowchart - Manual Input" version="1" id="O8">
446+ <dia:attribute name="obj_pos">
447+ <dia:point val="16.7028,22.1633"/>
448+ </dia:attribute>
449+ <dia:attribute name="obj_bb">
450+ <dia:rectangle val="16.6528,22.1085;25.4803,24.2133"/>
451+ </dia:attribute>
452+ <dia:attribute name="meta">
453+ <dia:composite type="dict"/>
454+ </dia:attribute>
455+ <dia:attribute name="elem_corner">
456+ <dia:point val="16.7028,22.1633"/>
457+ </dia:attribute>
458+ <dia:attribute name="elem_width">
459+ <dia:real val="8.7275000000000009"/>
460+ </dia:attribute>
461+ <dia:attribute name="elem_height">
462+ <dia:real val="2"/>
463+ </dia:attribute>
464+ <dia:attribute name="line_width">
465+ <dia:real val="0.10000000000000001"/>
466+ </dia:attribute>
467+ <dia:attribute name="line_colour">
468+ <dia:color val="#000000"/>
469+ </dia:attribute>
470+ <dia:attribute name="fill_colour">
471+ <dia:color val="#ffffff"/>
472+ </dia:attribute>
473+ <dia:attribute name="show_background">
474+ <dia:boolean val="true"/>
475+ </dia:attribute>
476+ <dia:attribute name="line_style">
477+ <dia:enum val="0"/>
478+ <dia:real val="1"/>
479+ </dia:attribute>
480+ <dia:attribute name="padding">
481+ <dia:real val="0.10000000000000001"/>
482+ </dia:attribute>
483+ <dia:attribute name="text">
484+ <dia:composite type="text">
485+ <dia:attribute name="string">
486+ <dia:string>#configuration-ghc-x.y.nix#</dia:string>
487+ </dia:attribute>
488+ <dia:attribute name="font">
489+ <dia:font family="sans" style="0" name="Helvetica"/>
490+ </dia:attribute>
491+ <dia:attribute name="height">
492+ <dia:real val="0.80000000000000004"/>
493+ </dia:attribute>
494+ <dia:attribute name="pos">
495+ <dia:point val="21.0666,23.7633"/>
496+ </dia:attribute>
497+ <dia:attribute name="color">
498+ <dia:color val="#000000"/>
499+ </dia:attribute>
500+ <dia:attribute name="alignment">
501+ <dia:enum val="1"/>
502+ </dia:attribute>
503+ </dia:composite>
504+ </dia:attribute>
505+ <dia:attribute name="flip_horizontal">
506+ <dia:boolean val="false"/>
507+ </dia:attribute>
508+ <dia:attribute name="flip_vertical">
509+ <dia:boolean val="false"/>
510+ </dia:attribute>
511+ <dia:attribute name="subscale">
512+ <dia:real val="1"/>
513+ </dia:attribute>
514+ </dia:object>
515+ </dia:group>
516+ <dia:object type="Standard - Box" version="0" id="O9">
517+ <dia:attribute name="obj_pos">
518+ <dia:point val="6.4325,18.1"/>
519+ </dia:attribute>
520+ <dia:attribute name="obj_bb">
521+ <dia:rectangle val="6.3825,18.05;14.4,29.7"/>
522+ </dia:attribute>
523+ <dia:attribute name="elem_corner">
524+ <dia:point val="6.4325,18.1"/>
525+ </dia:attribute>
526+ <dia:attribute name="elem_width">
527+ <dia:real val="7.9174999999999933"/>
528+ </dia:attribute>
529+ <dia:attribute name="elem_height">
530+ <dia:real val="11.550000000000015"/>
531+ </dia:attribute>
532+ <dia:attribute name="border_width">
533+ <dia:real val="0.10000000149011612"/>
534+ </dia:attribute>
535+ <dia:attribute name="inner_color">
536+ <dia:color val="#bfbfbf"/>
537+ </dia:attribute>
538+ <dia:attribute name="show_background">
539+ <dia:boolean val="true"/>
540+ </dia:attribute>
541+ <dia:attribute name="line_style">
542+ <dia:enum val="4"/>
543+ </dia:attribute>
544+ </dia:object>
545+ <dia:object type="Flowchart - Parallelogram" version="0" id="O10">
546+ <dia:attribute name="obj_pos">
547+ <dia:point val="-2.10183,21.785"/>
548+ </dia:attribute>
549+ <dia:attribute name="obj_bb">
550+ <dia:rectangle val="-2.15183,21.735;5.50479,23.835"/>
551+ </dia:attribute>
552+ <dia:attribute name="elem_corner">
553+ <dia:point val="-2.10183,21.785"/>
554+ </dia:attribute>
555+ <dia:attribute name="elem_width">
556+ <dia:real val="7.5566166559453665"/>
557+ </dia:attribute>
558+ <dia:attribute name="elem_height">
559+ <dia:real val="2"/>
560+ </dia:attribute>
561+ <dia:attribute name="show_background">
562+ <dia:boolean val="true"/>
563+ </dia:attribute>
564+ <dia:attribute name="shear_angle">
565+ <dia:real val="70"/>
566+ </dia:attribute>
567+ <dia:attribute name="padding">
568+ <dia:real val="0.5"/>
569+ </dia:attribute>
570+ <dia:attribute name="text">
571+ <dia:composite type="text">
572+ <dia:attribute name="string">
573+ <dia:string>#Stackage Nightly#</dia:string>
574+ </dia:attribute>
575+ <dia:attribute name="font">
576+ <dia:font family="sans" style="0" name="Helvetica"/>
577+ </dia:attribute>
578+ <dia:attribute name="height">
579+ <dia:real val="0.80000000000000004"/>
580+ </dia:attribute>
581+ <dia:attribute name="pos">
582+ <dia:point val="1.67648,22.98"/>
583+ </dia:attribute>
584+ <dia:attribute name="color">
585+ <dia:color val="#000000"/>
586+ </dia:attribute>
587+ <dia:attribute name="alignment">
588+ <dia:enum val="1"/>
589+ </dia:attribute>
590+ </dia:composite>
591+ </dia:attribute>
592+ </dia:object>
593+ <dia:object type="Flowchart - Parallelogram" version="0" id="O11">
594+ <dia:attribute name="obj_pos">
595+ <dia:point val="-1.97933,17.3272"/>
596+ </dia:attribute>
597+ <dia:attribute name="obj_bb">
598+ <dia:rectangle val="-2.02933,17.2772;5.38229,19.3772"/>
599+ </dia:attribute>
600+ <dia:attribute name="elem_corner">
601+ <dia:point val="-1.97933,17.3272"/>
602+ </dia:attribute>
603+ <dia:attribute name="elem_width">
604+ <dia:real val="7.3116166559453664"/>
605+ </dia:attribute>
606+ <dia:attribute name="elem_height">
607+ <dia:real val="2"/>
608+ </dia:attribute>
609+ <dia:attribute name="show_background">
610+ <dia:boolean val="true"/>
611+ </dia:attribute>
612+ <dia:attribute name="shear_angle">
613+ <dia:real val="70"/>
614+ </dia:attribute>
615+ <dia:attribute name="padding">
616+ <dia:real val="0.5"/>
617+ </dia:attribute>
618+ <dia:attribute name="text">
619+ <dia:composite type="text">
620+ <dia:attribute name="string">
621+ <dia:string>#all-cabal-hashes#</dia:string>
622+ </dia:attribute>
623+ <dia:attribute name="font">
624+ <dia:font family="sans" style="0" name="Helvetica"/>
625+ </dia:attribute>
626+ <dia:attribute name="height">
627+ <dia:real val="0.80000000000000004"/>
628+ </dia:attribute>
629+ <dia:attribute name="pos">
630+ <dia:point val="1.67648,18.5222"/>
631+ </dia:attribute>
632+ <dia:attribute name="color">
633+ <dia:color val="#000000"/>
634+ </dia:attribute>
635+ <dia:attribute name="alignment">
636+ <dia:enum val="1"/>
637+ </dia:attribute>
638+ </dia:composite>
639+ </dia:attribute>
640+ </dia:object>
641+ <dia:object type="Standard - Line" version="0" id="O12">
642+ <dia:attribute name="obj_pos">
643+ <dia:point val="1.687,14.8808"/>
644+ </dia:attribute>
645+ <dia:attribute name="obj_bb">
646+ <dia:rectangle val="1.31971,14.8306;2.04331,17.4024"/>
647+ </dia:attribute>
648+ <dia:attribute name="conn_endpoints">
649+ <dia:point val="1.687,14.8808"/>
650+ <dia:point val="1.67964,17.2906"/>
651+ </dia:attribute>
652+ <dia:attribute name="numcp">
653+ <dia:int val="1"/>
654+ </dia:attribute>
655+ <dia:attribute name="end_arrow">
656+ <dia:enum val="22"/>
657+ </dia:attribute>
658+ <dia:attribute name="end_arrow_length">
659+ <dia:real val="0.5"/>
660+ </dia:attribute>
661+ <dia:attribute name="end_arrow_width">
662+ <dia:real val="0.5"/>
663+ </dia:attribute>
664+ <dia:connections>
665+ <dia:connection handle="0" to="O27" connection="14"/>
666+ <dia:connection handle="1" to="O11" connection="16"/>
667+ </dia:connections>
668+ </dia:object>
669+ <dia:object type="Standard - Line" version="0" id="O13">
670+ <dia:attribute name="obj_pos">
671+ <dia:point val="1.67648,19.3769"/>
672+ </dia:attribute>
673+ <dia:attribute name="obj_bb">
674+ <dia:rectangle val="1.31467,19.3269;2.03828,21.8471"/>
675+ </dia:attribute>
676+ <dia:attribute name="conn_endpoints">
677+ <dia:point val="1.67648,19.3769"/>
678+ <dia:point val="1.67648,21.7353"/>
679+ </dia:attribute>
680+ <dia:attribute name="numcp">
681+ <dia:int val="1"/>
682+ </dia:attribute>
683+ <dia:attribute name="end_arrow">
684+ <dia:enum val="22"/>
685+ </dia:attribute>
686+ <dia:attribute name="end_arrow_length">
687+ <dia:real val="0.5"/>
688+ </dia:attribute>
689+ <dia:attribute name="end_arrow_width">
690+ <dia:real val="0.5"/>
691+ </dia:attribute>
692+ <dia:connections>
693+ <dia:connection handle="0" to="O11" connection="16"/>
694+ <dia:connection handle="1" to="O10" connection="16"/>
695+ </dia:connections>
696+ </dia:object>
697+ <dia:object type="Flowchart - Parallelogram" version="0" id="O14">
698+ <dia:attribute name="obj_pos">
699+ <dia:point val="17.1382,13.6837"/>
700+ </dia:attribute>
701+ <dia:attribute name="obj_bb">
702+ <dia:rectangle val="17.0882,13.6337;26.4473,15.6337"/>
703+ </dia:attribute>
704+ <dia:attribute name="elem_corner">
705+ <dia:point val="17.1382,13.6837"/>
706+ </dia:attribute>
707+ <dia:attribute name="elem_width">
708+ <dia:real val="9.2591166559453661"/>
709+ </dia:attribute>
710+ <dia:attribute name="elem_height">
711+ <dia:real val="1.9000000000000001"/>
712+ </dia:attribute>
713+ <dia:attribute name="show_background">
714+ <dia:boolean val="true"/>
715+ </dia:attribute>
716+ <dia:attribute name="shear_angle">
717+ <dia:real val="70"/>
718+ </dia:attribute>
719+ <dia:attribute name="padding">
720+ <dia:real val="0.5"/>
721+ </dia:attribute>
722+ <dia:attribute name="text">
723+ <dia:composite type="text">
724+ <dia:attribute name="string">
725+ <dia:string>#hackage-packages.nix#</dia:string>
726+ </dia:attribute>
727+ <dia:attribute name="font">
728+ <dia:font family="sans" style="0" name="Helvetica"/>
729+ </dia:attribute>
730+ <dia:attribute name="height">
731+ <dia:real val="0.80000000000000004"/>
732+ </dia:attribute>
733+ <dia:attribute name="pos">
734+ <dia:point val="21.7678,14.8287"/>
735+ </dia:attribute>
736+ <dia:attribute name="color">
737+ <dia:color val="#000000"/>
738+ </dia:attribute>
739+ <dia:attribute name="alignment">
740+ <dia:enum val="1"/>
741+ </dia:attribute>
742+ </dia:composite>
743+ </dia:attribute>
744+ </dia:object>
745+ <dia:object type="Standard - Line" version="0" id="O15">
746+ <dia:attribute name="obj_pos">
747+ <dia:point val="3.68637,17.3272"/>
748+ </dia:attribute>
749+ <dia:attribute name="obj_bb">
750+ <dia:rectangle val="3.61566,13.6496;7.30368,17.3979"/>
751+ </dia:attribute>
752+ <dia:attribute name="conn_endpoints">
753+ <dia:point val="3.68637,17.3272"/>
754+ <dia:point val="7.22528,13.7293"/>
755+ </dia:attribute>
756+ <dia:attribute name="numcp">
757+ <dia:int val="1"/>
758+ </dia:attribute>
759+ <dia:attribute name="end_arrow">
760+ <dia:enum val="22"/>
761+ </dia:attribute>
762+ <dia:attribute name="end_arrow_length">
763+ <dia:real val="0.5"/>
764+ </dia:attribute>
765+ <dia:attribute name="end_arrow_width">
766+ <dia:real val="0.5"/>
767+ </dia:attribute>
768+ <dia:connections>
769+ <dia:connection handle="0" to="O11" connection="3"/>
770+ <dia:connection handle="1" to="O16" connection="5"/>
771+ </dia:connections>
772+ </dia:object>
773+ <dia:object type="Flowchart - Box" version="0" id="O16">
774+ <dia:attribute name="obj_pos">
775+ <dia:point val="7.22528,13.2543"/>
776+ </dia:attribute>
777+ <dia:attribute name="obj_bb">
778+ <dia:rectangle val="7.17528,13.2043;13.55,15.2043"/>
779+ </dia:attribute>
780+ <dia:attribute name="elem_corner">
781+ <dia:point val="7.22528,13.2543"/>
782+ </dia:attribute>
783+ <dia:attribute name="elem_width">
784+ <dia:real val="6.2747199992549376"/>
785+ </dia:attribute>
786+ <dia:attribute name="elem_height">
787+ <dia:real val="1.9000000014901162"/>
788+ </dia:attribute>
789+ <dia:attribute name="border_width">
790+ <dia:real val="0.10000000149011612"/>
791+ </dia:attribute>
792+ <dia:attribute name="border_color">
793+ <dia:color val="#ff0000"/>
794+ </dia:attribute>
795+ <dia:attribute name="show_background">
796+ <dia:boolean val="true"/>
797+ </dia:attribute>
798+ <dia:attribute name="padding">
799+ <dia:real val="0.5"/>
800+ </dia:attribute>
801+ <dia:attribute name="text">
802+ <dia:composite type="text">
803+ <dia:attribute name="string">
804+ <dia:string>#hackage2nix#</dia:string>
805+ </dia:attribute>
806+ <dia:attribute name="font">
807+ <dia:font family="sans" style="0" name="Helvetica"/>
808+ </dia:attribute>
809+ <dia:attribute name="height">
810+ <dia:real val="0.80000000000000004"/>
811+ </dia:attribute>
812+ <dia:attribute name="pos">
813+ <dia:point val="10.3626,14.3993"/>
814+ </dia:attribute>
815+ <dia:attribute name="color">
816+ <dia:color val="#000000"/>
817+ </dia:attribute>
818+ <dia:attribute name="alignment">
819+ <dia:enum val="1"/>
820+ </dia:attribute>
821+ </dia:composite>
822+ </dia:attribute>
823+ </dia:object>
824+ <dia:object type="Standard - Line" version="0" id="O17">
825+ <dia:attribute name="obj_pos">
826+ <dia:point val="3.74762,21.785"/>
827+ </dia:attribute>
828+ <dia:attribute name="obj_bb">
829+ <dia:rectangle val="3.68011,15.0553;7.29507,21.8526"/>
830+ </dia:attribute>
831+ <dia:attribute name="conn_endpoints">
832+ <dia:point val="3.74762,21.785"/>
833+ <dia:point val="7.22528,15.1543"/>
834+ </dia:attribute>
835+ <dia:attribute name="numcp">
836+ <dia:int val="1"/>
837+ </dia:attribute>
838+ <dia:attribute name="end_arrow">
839+ <dia:enum val="22"/>
840+ </dia:attribute>
841+ <dia:attribute name="end_arrow_length">
842+ <dia:real val="0.5"/>
843+ </dia:attribute>
844+ <dia:attribute name="end_arrow_width">
845+ <dia:real val="0.5"/>
846+ </dia:attribute>
847+ <dia:connections>
848+ <dia:connection handle="0" to="O10" connection="3"/>
849+ <dia:connection handle="1" to="O16" connection="11"/>
850+ </dia:connections>
851+ </dia:object>
852+ <dia:object type="Flowchart - Manual Input" version="1" id="O18">
853+ <dia:attribute name="obj_pos">
854+ <dia:point val="17.0732,17.4036"/>
855+ </dia:attribute>
856+ <dia:attribute name="obj_bb">
857+ <dia:rectangle val="17.0232,17.3488;25.8507,19.4536"/>
858+ </dia:attribute>
859+ <dia:attribute name="meta">
860+ <dia:composite type="dict"/>
861+ </dia:attribute>
862+ <dia:attribute name="elem_corner">
863+ <dia:point val="17.0732,17.4036"/>
864+ </dia:attribute>
865+ <dia:attribute name="elem_width">
866+ <dia:real val="8.7275000000000009"/>
867+ </dia:attribute>
868+ <dia:attribute name="elem_height">
869+ <dia:real val="2"/>
870+ </dia:attribute>
871+ <dia:attribute name="line_width">
872+ <dia:real val="0.10000000000000001"/>
873+ </dia:attribute>
874+ <dia:attribute name="line_colour">
875+ <dia:color val="#000000"/>
876+ </dia:attribute>
877+ <dia:attribute name="fill_colour">
878+ <dia:color val="#ffffff"/>
879+ </dia:attribute>
880+ <dia:attribute name="show_background">
881+ <dia:boolean val="true"/>
882+ </dia:attribute>
883+ <dia:attribute name="line_style">
884+ <dia:enum val="0"/>
885+ <dia:real val="1"/>
886+ </dia:attribute>
887+ <dia:attribute name="padding">
888+ <dia:real val="0.10000000000000001"/>
889+ </dia:attribute>
890+ <dia:attribute name="text">
891+ <dia:composite type="text">
892+ <dia:attribute name="string">
893+ <dia:string>#configuration-common.nix#</dia:string>
894+ </dia:attribute>
895+ <dia:attribute name="font">
896+ <dia:font family="sans" style="0" name="Helvetica"/>
897+ </dia:attribute>
898+ <dia:attribute name="height">
899+ <dia:real val="0.80000000000000004"/>
900+ </dia:attribute>
901+ <dia:attribute name="pos">
902+ <dia:point val="21.437,19.0036"/>
903+ </dia:attribute>
904+ <dia:attribute name="color">
905+ <dia:color val="#000000"/>
906+ </dia:attribute>
907+ <dia:attribute name="alignment">
908+ <dia:enum val="1"/>
909+ </dia:attribute>
910+ </dia:composite>
911+ </dia:attribute>
912+ <dia:attribute name="flip_horizontal">
913+ <dia:boolean val="false"/>
914+ </dia:attribute>
915+ <dia:attribute name="flip_vertical">
916+ <dia:boolean val="false"/>
917+ </dia:attribute>
918+ <dia:attribute name="subscale">
919+ <dia:real val="1"/>
920+ </dia:attribute>
921+ </dia:object>
922+ <dia:object type="Standard - Line" version="0" id="O19">
923+ <dia:attribute name="obj_pos">
924+ <dia:point val="13.5,14.2043"/>
925+ </dia:attribute>
926+ <dia:attribute name="obj_bb">
927+ <dia:rectangle val="13.4449,14.1492;17.5951,14.9279"/>
928+ </dia:attribute>
929+ <dia:attribute name="conn_endpoints">
930+ <dia:point val="13.5,14.2043"/>
931+ <dia:point val="17.484,14.6337"/>
932+ </dia:attribute>
933+ <dia:attribute name="numcp">
934+ <dia:int val="1"/>
935+ </dia:attribute>
936+ <dia:attribute name="end_arrow">
937+ <dia:enum val="22"/>
938+ </dia:attribute>
939+ <dia:attribute name="end_arrow_length">
940+ <dia:real val="0.5"/>
941+ </dia:attribute>
942+ <dia:attribute name="end_arrow_width">
943+ <dia:real val="0.5"/>
944+ </dia:attribute>
945+ <dia:connections>
946+ <dia:connection handle="0" to="O16" connection="8"/>
947+ <dia:connection handle="1" to="O14" connection="7"/>
948+ </dia:connections>
949+ </dia:object>
950+ <dia:object type="Standard - Line" version="0" id="O20">
951+ <dia:attribute name="obj_pos">
952+ <dia:point val="13.5,15.1543"/>
953+ </dia:attribute>
954+ <dia:attribute name="obj_bb">
955+ <dia:rectangle val="13.437,15.0913;17.2977,26.5157"/>
956+ </dia:attribute>
957+ <dia:attribute name="conn_endpoints">
958+ <dia:point val="13.5,15.1543"/>
959+ <dia:point val="17.1418,26.4093"/>
960+ </dia:attribute>
961+ <dia:attribute name="numcp">
962+ <dia:int val="1"/>
963+ </dia:attribute>
964+ <dia:attribute name="end_arrow">
965+ <dia:enum val="22"/>
966+ </dia:attribute>
967+ <dia:attribute name="end_arrow_length">
968+ <dia:real val="0.5"/>
969+ </dia:attribute>
970+ <dia:attribute name="end_arrow_width">
971+ <dia:real val="0.5"/>
972+ </dia:attribute>
973+ <dia:connections>
974+ <dia:connection handle="0" to="O16" connection="15"/>
975+ <dia:connection handle="1" to="O3" connection="0"/>
976+ </dia:connections>
977+ </dia:object>
978+ <dia:object type="Standard - Line" version="0" id="O21">
979+ <dia:attribute name="obj_pos">
980+ <dia:point val="21.422,15.5837"/>
981+ </dia:attribute>
982+ <dia:attribute name="obj_bb">
983+ <dia:rectangle val="21.071,15.5334;21.7946,17.9154"/>
984+ </dia:attribute>
985+ <dia:attribute name="conn_endpoints">
986+ <dia:point val="21.422,15.5837"/>
987+ <dia:point val="21.437,17.8036"/>
988+ </dia:attribute>
989+ <dia:attribute name="numcp">
990+ <dia:int val="1"/>
991+ </dia:attribute>
992+ <dia:attribute name="end_arrow">
993+ <dia:enum val="22"/>
994+ </dia:attribute>
995+ <dia:attribute name="end_arrow_length">
996+ <dia:real val="0.5"/>
997+ </dia:attribute>
998+ <dia:attribute name="end_arrow_width">
999+ <dia:real val="0.5"/>
1000+ </dia:attribute>
1001+ <dia:connections>
1002+ <dia:connection handle="0" to="O14" connection="13"/>
1003+ <dia:connection handle="1" to="O18" connection="2"/>
1004+ </dia:connections>
1005+ </dia:object>
1006+ <dia:object type="Standard - Line" version="0" id="O22">
1007+ <dia:attribute name="obj_pos">
1008+ <dia:point val="21.461,19.4533"/>
1009+ </dia:attribute>
1010+ <dia:attribute name="obj_bb">
1011+ <dia:rectangle val="21.1458,19.4022;21.8692,22.2013"/>
1012+ </dia:attribute>
1013+ <dia:attribute name="conn_endpoints">
1014+ <dia:point val="21.461,19.4533"/>
1015+ <dia:point val="21.5216,22.0895"/>
1016+ </dia:attribute>
1017+ <dia:attribute name="numcp">
1018+ <dia:int val="1"/>
1019+ </dia:attribute>
1020+ <dia:attribute name="end_arrow">
1021+ <dia:enum val="22"/>
1022+ </dia:attribute>
1023+ <dia:attribute name="end_arrow_length">
1024+ <dia:real val="0.5"/>
1025+ </dia:attribute>
1026+ <dia:attribute name="end_arrow_width">
1027+ <dia:real val="0.5"/>
1028+ </dia:attribute>
1029+ <dia:connections>
1030+ <dia:connection handle="0" to="O18" connection="16"/>
1031+ <dia:connection handle="1" to="O7" connection="2"/>
1032+ </dia:connections>
1033+ </dia:object>
1034+ <dia:object type="Flowchart - Manual Input" version="1" id="O23">
1035+ <dia:attribute name="obj_pos">
1036+ <dia:point val="6.9465,22.8184"/>
1037+ </dia:attribute>
1038+ <dia:attribute name="obj_bb">
1039+ <dia:rectangle val="6.8965,22.7619;13.6137,24.8684"/>
1040+ </dia:attribute>
1041+ <dia:attribute name="meta">
1042+ <dia:composite type="dict"/>
1043+ </dia:attribute>
1044+ <dia:attribute name="elem_corner">
1045+ <dia:point val="6.9465,22.8184"/>
1046+ </dia:attribute>
1047+ <dia:attribute name="elem_width">
1048+ <dia:real val="6.6171688018521273"/>
1049+ </dia:attribute>
1050+ <dia:attribute name="elem_height">
1051+ <dia:real val="2"/>
1052+ </dia:attribute>
1053+ <dia:attribute name="line_width">
1054+ <dia:real val="0.10000000000000001"/>
1055+ </dia:attribute>
1056+ <dia:attribute name="line_colour">
1057+ <dia:color val="#000000"/>
1058+ </dia:attribute>
1059+ <dia:attribute name="fill_colour">
1060+ <dia:color val="#ffffff"/>
1061+ </dia:attribute>
1062+ <dia:attribute name="show_background">
1063+ <dia:boolean val="true"/>
1064+ </dia:attribute>
1065+ <dia:attribute name="line_style">
1066+ <dia:enum val="0"/>
1067+ <dia:real val="1"/>
1068+ </dia:attribute>
1069+ <dia:attribute name="padding">
1070+ <dia:real val="0.10000000000000001"/>
1071+ </dia:attribute>
1072+ <dia:attribute name="text">
1073+ <dia:composite type="text">
1074+ <dia:attribute name="string">
1075+ <dia:string>#packageOverrides#</dia:string>
1076+ </dia:attribute>
1077+ <dia:attribute name="font">
1078+ <dia:font family="sans" style="0" name="Helvetica"/>
1079+ </dia:attribute>
1080+ <dia:attribute name="height">
1081+ <dia:real val="0.80000000000000004"/>
1082+ </dia:attribute>
1083+ <dia:attribute name="pos">
1084+ <dia:point val="10.2551,24.4184"/>
1085+ </dia:attribute>
1086+ <dia:attribute name="color">
1087+ <dia:color val="#000000"/>
1088+ </dia:attribute>
1089+ <dia:attribute name="alignment">
1090+ <dia:enum val="1"/>
1091+ </dia:attribute>
1092+ </dia:composite>
1093+ </dia:attribute>
1094+ <dia:attribute name="flip_horizontal">
1095+ <dia:boolean val="false"/>
1096+ </dia:attribute>
1097+ <dia:attribute name="flip_vertical">
1098+ <dia:boolean val="false"/>
1099+ </dia:attribute>
1100+ <dia:attribute name="subscale">
1101+ <dia:real val="1"/>
1102+ </dia:attribute>
1103+ </dia:object>
1104+ <dia:object type="Standard - Line" version="0" id="O24">
1105+ <dia:attribute name="obj_pos">
1106+ <dia:point val="21.4301,17.3918"/>
1107+ </dia:attribute>
1108+ <dia:attribute name="obj_bb">
1109+ <dia:rectangle val="21.3798,17.3415;21.4829,17.8048"/>
1110+ </dia:attribute>
1111+ <dia:attribute name="conn_endpoints">
1112+ <dia:point val="21.4301,17.3918"/>
1113+ <dia:point val="21.4326,17.7544"/>
1114+ </dia:attribute>
1115+ <dia:attribute name="numcp">
1116+ <dia:int val="1"/>
1117+ </dia:attribute>
1118+ <dia:connections>
1119+ <dia:connection handle="1" to="O18" connection="16"/>
1120+ </dia:connections>
1121+ </dia:object>
1122+ <dia:object type="Standard - Line" version="0" id="O25">
1123+ <dia:attribute name="obj_pos">
1124+ <dia:point val="10.2551,24.8184"/>
1125+ </dia:attribute>
1126+ <dia:attribute name="obj_bb">
1127+ <dia:rectangle val="9.92777,24.7671;10.6512,26.9271"/>
1128+ </dia:attribute>
1129+ <dia:attribute name="conn_endpoints">
1130+ <dia:point val="10.2551,24.8184"/>
1131+ <dia:point val="10.3046,26.8153"/>
1132+ </dia:attribute>
1133+ <dia:attribute name="numcp">
1134+ <dia:int val="1"/>
1135+ </dia:attribute>
1136+ <dia:attribute name="end_arrow">
1137+ <dia:enum val="22"/>
1138+ </dia:attribute>
1139+ <dia:attribute name="end_arrow_length">
1140+ <dia:real val="0.5"/>
1141+ </dia:attribute>
1142+ <dia:attribute name="end_arrow_width">
1143+ <dia:real val="0.5"/>
1144+ </dia:attribute>
1145+ <dia:connections>
1146+ <dia:connection handle="0" to="O23" connection="14"/>
1147+ <dia:connection handle="1" to="O26" connection="2"/>
1148+ </dia:connections>
1149+ </dia:object>
1150+ <dia:object type="Flowchart - Terminal" version="1" id="O26">
1151+ <dia:attribute name="obj_pos">
1152+ <dia:point val="7.42276,26.8153"/>
1153+ </dia:attribute>
1154+ <dia:attribute name="obj_bb">
1155+ <dia:rectangle val="7.37276,26.7653;13.2365,28.8653"/>
1156+ </dia:attribute>
1157+ <dia:attribute name="meta">
1158+ <dia:composite type="dict"/>
1159+ </dia:attribute>
1160+ <dia:attribute name="elem_corner">
1161+ <dia:point val="7.42276,26.8153"/>
1162+ </dia:attribute>
1163+ <dia:attribute name="elem_width">
1164+ <dia:real val="5.7637499999999999"/>
1165+ </dia:attribute>
1166+ <dia:attribute name="elem_height">
1167+ <dia:real val="2"/>
1168+ </dia:attribute>
1169+ <dia:attribute name="line_width">
1170+ <dia:real val="0.10000000000000001"/>
1171+ </dia:attribute>
1172+ <dia:attribute name="line_colour">
1173+ <dia:color val="#000000"/>
1174+ </dia:attribute>
1175+ <dia:attribute name="fill_colour">
1176+ <dia:color val="#ffffff"/>
1177+ </dia:attribute>
1178+ <dia:attribute name="show_background">
1179+ <dia:boolean val="true"/>
1180+ </dia:attribute>
1181+ <dia:attribute name="line_style">
1182+ <dia:enum val="0"/>
1183+ <dia:real val="1"/>
1184+ </dia:attribute>
1185+ <dia:attribute name="padding">
1186+ <dia:real val="0.10000000000000001"/>
1187+ </dia:attribute>
1188+ <dia:attribute name="text">
1189+ <dia:composite type="text">
1190+ <dia:attribute name="string">
1191+ <dia:string>#Installation#</dia:string>
1192+ </dia:attribute>
1193+ <dia:attribute name="font">
1194+ <dia:font family="sans" style="0" name="Helvetica"/>
1195+ </dia:attribute>
1196+ <dia:attribute name="height">
1197+ <dia:real val="0.80000000000000004"/>
1198+ </dia:attribute>
1199+ <dia:attribute name="pos">
1200+ <dia:point val="10.3046,28.0153"/>
1201+ </dia:attribute>
1202+ <dia:attribute name="color">
1203+ <dia:color val="#000000"/>
1204+ </dia:attribute>
1205+ <dia:attribute name="alignment">
1206+ <dia:enum val="1"/>
1207+ </dia:attribute>
1208+ </dia:composite>
1209+ </dia:attribute>
1210+ <dia:attribute name="flip_horizontal">
1211+ <dia:boolean val="false"/>
1212+ </dia:attribute>
1213+ <dia:attribute name="flip_vertical">
1214+ <dia:boolean val="false"/>
1215+ </dia:attribute>
1216+ <dia:attribute name="subscale">
1217+ <dia:real val="1"/>
1218+ </dia:attribute>
1219+ </dia:object>
1220+ <dia:object type="Flowchart - Terminal" version="1" id="O27">
1221+ <dia:attribute name="obj_pos">
1222+ <dia:point val="-0.624878,12.8808"/>
1223+ </dia:attribute>
1224+ <dia:attribute name="obj_bb">
1225+ <dia:rectangle val="-0.674878,12.8308;4.04887,14.9308"/>
1226+ </dia:attribute>
1227+ <dia:attribute name="meta">
1228+ <dia:composite type="dict"/>
1229+ </dia:attribute>
1230+ <dia:attribute name="elem_corner">
1231+ <dia:point val="-0.624878,12.8808"/>
1232+ </dia:attribute>
1233+ <dia:attribute name="elem_width">
1234+ <dia:real val="4.6237500000000002"/>
1235+ </dia:attribute>
1236+ <dia:attribute name="elem_height">
1237+ <dia:real val="2"/>
1238+ </dia:attribute>
1239+ <dia:attribute name="line_width">
1240+ <dia:real val="0.10000000000000001"/>
1241+ </dia:attribute>
1242+ <dia:attribute name="line_colour">
1243+ <dia:color val="#000000"/>
1244+ </dia:attribute>
1245+ <dia:attribute name="fill_colour">
1246+ <dia:color val="#ffffff"/>
1247+ </dia:attribute>
1248+ <dia:attribute name="show_background">
1249+ <dia:boolean val="true"/>
1250+ </dia:attribute>
1251+ <dia:attribute name="line_style">
1252+ <dia:enum val="0"/>
1253+ <dia:real val="1"/>
1254+ </dia:attribute>
1255+ <dia:attribute name="padding">
1256+ <dia:real val="0.10000000000000001"/>
1257+ </dia:attribute>
1258+ <dia:attribute name="text">
1259+ <dia:composite type="text">
1260+ <dia:attribute name="string">
1261+ <dia:string>#Hackage#</dia:string>
1262+ </dia:attribute>
1263+ <dia:attribute name="font">
1264+ <dia:font family="sans" style="0" name="Helvetica"/>
1265+ </dia:attribute>
1266+ <dia:attribute name="height">
1267+ <dia:real val="0.80000000000000004"/>
1268+ </dia:attribute>
1269+ <dia:attribute name="pos">
1270+ <dia:point val="1.687,14.0808"/>
1271+ </dia:attribute>
1272+ <dia:attribute name="color">
1273+ <dia:color val="#000000"/>
1274+ </dia:attribute>
1275+ <dia:attribute name="alignment">
1276+ <dia:enum val="1"/>
1277+ </dia:attribute>
1278+ </dia:composite>
1279+ </dia:attribute>
1280+ <dia:attribute name="flip_horizontal">
1281+ <dia:boolean val="false"/>
1282+ </dia:attribute>
1283+ <dia:attribute name="flip_vertical">
1284+ <dia:boolean val="false"/>
1285+ </dia:attribute>
1286+ <dia:attribute name="subscale">
1287+ <dia:real val="1"/>
1288+ </dia:attribute>
1289+ </dia:object>
1290+ <dia:object type="Standard - Line" version="0" id="O28">
1291+ <dia:attribute name="obj_pos">
1292+ <dia:point val="16.0788,27.8153"/>
1293+ </dia:attribute>
1294+ <dia:attribute name="obj_bb">
1295+ <dia:rectangle val="11.8186,24.7486;16.1486,27.8851"/>
1296+ </dia:attribute>
1297+ <dia:attribute name="conn_endpoints">
1298+ <dia:point val="16.0788,27.8153"/>
1299+ <dia:point val="11.9094,24.8184"/>
1300+ </dia:attribute>
1301+ <dia:attribute name="numcp">
1302+ <dia:int val="1"/>
1303+ </dia:attribute>
1304+ <dia:attribute name="end_arrow">
1305+ <dia:enum val="22"/>
1306+ </dia:attribute>
1307+ <dia:attribute name="end_arrow_length">
1308+ <dia:real val="0.5"/>
1309+ </dia:attribute>
1310+ <dia:attribute name="end_arrow_width">
1311+ <dia:real val="0.5"/>
1312+ </dia:attribute>
1313+ <dia:connections>
1314+ <dia:connection handle="0" to="O4" connection="7"/>
1315+ <dia:connection handle="1" to="O23" connection="15"/>
1316+ </dia:connections>
1317+ </dia:object>
1318+ <dia:object type="Standard - Arc" version="0" id="O29">
1319+ <dia:attribute name="obj_pos">
1320+ <dia:point val="17.1578,22.4895"/>
1321+ </dia:attribute>
1322+ <dia:attribute name="obj_bb">
1323+ <dia:rectangle val="11.6677,20.6742;17.2126,23.0731"/>
1324+ </dia:attribute>
1325+ <dia:attribute name="conn_endpoints">
1326+ <dia:point val="17.1578,22.4895"/>
1327+ <dia:point val="11.9094,23.0184"/>
1328+ </dia:attribute>
1329+ <dia:attribute name="curve_distance">
1330+ <dia:real val="2.0262286951573065"/>
1331+ </dia:attribute>
1332+ <dia:attribute name="line_width">
1333+ <dia:real val="0.10000000149011612"/>
1334+ </dia:attribute>
1335+ <dia:attribute name="end_arrow">
1336+ <dia:enum val="22"/>
1337+ </dia:attribute>
1338+ <dia:attribute name="end_arrow_length">
1339+ <dia:real val="0.5"/>
1340+ </dia:attribute>
1341+ <dia:attribute name="end_arrow_width">
1342+ <dia:real val="0.5"/>
1343+ </dia:attribute>
1344+ <dia:connections>
1345+ <dia:connection handle="0" to="O7" connection="0"/>
1346+ <dia:connection handle="1" to="O23" connection="3"/>
1347+ </dia:connections>
1348+ </dia:object>
1349+ <dia:object type="Standard - Text" version="1" id="O30">
1350+ <dia:attribute name="obj_pos">
1351+ <dia:point val="-0.02875,30.75"/>
1352+ </dia:attribute>
1353+ <dia:attribute name="obj_bb">
1354+ <dia:rectangle val="-0.02875,30.155;2.92875,30.9"/>
1355+ </dia:attribute>
1356+ <dia:attribute name="text">
1357+ <dia:composite type="text">
1358+ <dia:attribute name="string">
1359+ <dia:string>#Stackage#</dia:string>
1360+ </dia:attribute>
1361+ <dia:attribute name="font">
1362+ <dia:font family="sans" style="0" name="Helvetica"/>
1363+ </dia:attribute>
1364+ <dia:attribute name="height">
1365+ <dia:real val="0.80000000000000004"/>
1366+ </dia:attribute>
1367+ <dia:attribute name="pos">
1368+ <dia:point val="-0.02875,30.75"/>
1369+ </dia:attribute>
1370+ <dia:attribute name="color">
1371+ <dia:color val="#000000"/>
1372+ </dia:attribute>
1373+ <dia:attribute name="alignment">
1374+ <dia:enum val="0"/>
1375+ </dia:attribute>
1376+ </dia:composite>
1377+ </dia:attribute>
1378+ <dia:attribute name="valign">
1379+ <dia:enum val="3"/>
1380+ </dia:attribute>
1381+ </dia:object>
1382+ <dia:object type="Standard - Text" version="1" id="O31">
1383+ <dia:attribute name="obj_pos">
1384+ <dia:point val="9.6625,30.75"/>
1385+ </dia:attribute>
1386+ <dia:attribute name="obj_bb">
1387+ <dia:rectangle val="9.6625,30.155;11.12,30.9"/>
1388+ </dia:attribute>
1389+ <dia:attribute name="text">
1390+ <dia:composite type="text">
1391+ <dia:attribute name="string">
1392+ <dia:string>#User#</dia:string>
1393+ </dia:attribute>
1394+ <dia:attribute name="font">
1395+ <dia:font family="sans" style="0" name="Helvetica"/>
1396+ </dia:attribute>
1397+ <dia:attribute name="height">
1398+ <dia:real val="0.80000000000000004"/>
1399+ </dia:attribute>
1400+ <dia:attribute name="pos">
1401+ <dia:point val="9.6625,30.75"/>
1402+ </dia:attribute>
1403+ <dia:attribute name="color">
1404+ <dia:color val="#000000"/>
1405+ </dia:attribute>
1406+ <dia:attribute name="alignment">
1407+ <dia:enum val="0"/>
1408+ </dia:attribute>
1409+ </dia:composite>
1410+ </dia:attribute>
1411+ <dia:attribute name="valign">
1412+ <dia:enum val="3"/>
1413+ </dia:attribute>
1414+ </dia:object>
1415+ <dia:object type="Standard - Text" version="1" id="O32">
1416+ <dia:attribute name="obj_pos">
1417+ <dia:point val="19.905,30.75"/>
1418+ </dia:attribute>
1419+ <dia:attribute name="obj_bb">
1420+ <dia:rectangle val="19.905,30.155;22.46,30.9"/>
1421+ </dia:attribute>
1422+ <dia:attribute name="text">
1423+ <dia:composite type="text">
1424+ <dia:attribute name="string">
1425+ <dia:string>#Nixpkgs#</dia:string>
1426+ </dia:attribute>
1427+ <dia:attribute name="font">
1428+ <dia:font family="sans" style="0" name="Helvetica"/>
1429+ </dia:attribute>
1430+ <dia:attribute name="height">
1431+ <dia:real val="0.80000000000000004"/>
1432+ </dia:attribute>
1433+ <dia:attribute name="pos">
1434+ <dia:point val="19.905,30.75"/>
1435+ </dia:attribute>
1436+ <dia:attribute name="color">
1437+ <dia:color val="#000000"/>
1438+ </dia:attribute>
1439+ <dia:attribute name="alignment">
1440+ <dia:enum val="0"/>
1441+ </dia:attribute>
1442+ </dia:composite>
1443+ </dia:attribute>
1444+ <dia:attribute name="valign">
1445+ <dia:enum val="3"/>
1446+ </dia:attribute>
1447+ </dia:object>
1448+ <dia:object type="Standard - Arc" version="0" id="O33">
1449+ <dia:attribute name="obj_pos">
1450+ <dia:point val="-0.333411,19.3272"/>
1451+ </dia:attribute>
1452+ <dia:attribute name="obj_bb">
1453+ <dia:rectangle val="-2.80954,19.2707;-0.276884,26.5994"/>
1454+ </dia:attribute>
1455+ <dia:attribute name="conn_endpoints">
1456+ <dia:point val="-0.333411,19.3272"/>
1457+ <dia:point val="-1.35706,26.5429"/>
1458+ </dia:attribute>
1459+ <dia:attribute name="curve_distance">
1460+ <dia:real val="1.8888235106861362"/>
1461+ </dia:attribute>
1462+ <dia:attribute name="line_width">
1463+ <dia:real val="0.10000000149011612"/>
1464+ </dia:attribute>
1465+ <dia:attribute name="end_arrow">
1466+ <dia:enum val="22"/>
1467+ </dia:attribute>
1468+ <dia:attribute name="end_arrow_length">
1469+ <dia:real val="0.5"/>
1470+ </dia:attribute>
1471+ <dia:attribute name="end_arrow_width">
1472+ <dia:real val="0.5"/>
1473+ </dia:attribute>
1474+ <dia:connections>
1475+ <dia:connection handle="0" to="O11" connection="12"/>
1476+ <dia:connection handle="1" to="O35" connection="0"/>
1477+ </dia:connections>
1478+ </dia:object>
1479+ <dia:group>
1480+ <dia:object type="Flowchart - Parallelogram" version="0" id="O34">
1481+ <dia:attribute name="obj_pos">
1482+ <dia:point val="-1.635,26.2429"/>
1483+ </dia:attribute>
1484+ <dia:attribute name="obj_bb">
1485+ <dia:rectangle val="-1.685,26.1929;5.27412,28.2929"/>
1486+ </dia:attribute>
1487+ <dia:attribute name="elem_corner">
1488+ <dia:point val="-1.635,26.2429"/>
1489+ </dia:attribute>
1490+ <dia:attribute name="elem_width">
1491+ <dia:real val="6.8591166559453667"/>
1492+ </dia:attribute>
1493+ <dia:attribute name="elem_height">
1494+ <dia:real val="2"/>
1495+ </dia:attribute>
1496+ <dia:attribute name="show_background">
1497+ <dia:boolean val="true"/>
1498+ </dia:attribute>
1499+ <dia:attribute name="shear_angle">
1500+ <dia:real val="70"/>
1501+ </dia:attribute>
1502+ <dia:attribute name="padding">
1503+ <dia:real val="0.5"/>
1504+ </dia:attribute>
1505+ <dia:attribute name="text">
1506+ <dia:composite type="text">
1507+ <dia:attribute name="string">
1508+ <dia:string>#LTS Haskell x.y#</dia:string>
1509+ </dia:attribute>
1510+ <dia:attribute name="font">
1511+ <dia:font family="sans" style="0" name="Helvetica"/>
1512+ </dia:attribute>
1513+ <dia:attribute name="height">
1514+ <dia:real val="0.80000000000000004"/>
1515+ </dia:attribute>
1516+ <dia:attribute name="pos">
1517+ <dia:point val="1.79456,27.4379"/>
1518+ </dia:attribute>
1519+ <dia:attribute name="color">
1520+ <dia:color val="#000000"/>
1521+ </dia:attribute>
1522+ <dia:attribute name="alignment">
1523+ <dia:enum val="1"/>
1524+ </dia:attribute>
1525+ </dia:composite>
1526+ </dia:attribute>
1527+ </dia:object>
1528+ <dia:object type="Flowchart - Parallelogram" version="0" id="O35">
1529+ <dia:attribute name="obj_pos">
1530+ <dia:point val="-2.085,26.5429"/>
1531+ </dia:attribute>
1532+ <dia:attribute name="obj_bb">
1533+ <dia:rectangle val="-2.135,26.4929;4.82412,28.5929"/>
1534+ </dia:attribute>
1535+ <dia:attribute name="elem_corner">
1536+ <dia:point val="-2.085,26.5429"/>
1537+ </dia:attribute>
1538+ <dia:attribute name="elem_width">
1539+ <dia:real val="6.8591166559453667"/>
1540+ </dia:attribute>
1541+ <dia:attribute name="elem_height">
1542+ <dia:real val="2"/>
1543+ </dia:attribute>
1544+ <dia:attribute name="show_background">
1545+ <dia:boolean val="true"/>
1546+ </dia:attribute>
1547+ <dia:attribute name="shear_angle">
1548+ <dia:real val="70"/>
1549+ </dia:attribute>
1550+ <dia:attribute name="padding">
1551+ <dia:real val="0.5"/>
1552+ </dia:attribute>
1553+ <dia:attribute name="text">
1554+ <dia:composite type="text">
1555+ <dia:attribute name="string">
1556+ <dia:string>#LTS Haskell x.y#</dia:string>
1557+ </dia:attribute>
1558+ <dia:attribute name="font">
1559+ <dia:font family="sans" style="0" name="Helvetica"/>
1560+ </dia:attribute>
1561+ <dia:attribute name="height">
1562+ <dia:real val="0.80000000000000004"/>
1563+ </dia:attribute>
1564+ <dia:attribute name="pos">
1565+ <dia:point val="1.34456,27.7379"/>
1566+ </dia:attribute>
1567+ <dia:attribute name="color">
1568+ <dia:color val="#000000"/>
1569+ </dia:attribute>
1570+ <dia:attribute name="alignment">
1571+ <dia:enum val="1"/>
1572+ </dia:attribute>
1573+ </dia:composite>
1574+ </dia:attribute>
1575+ </dia:object>
1576+ <dia:object type="Flowchart - Parallelogram" version="0" id="O36">
1577+ <dia:attribute name="obj_pos">
1578+ <dia:point val="-2.55308,26.8153"/>
1579+ </dia:attribute>
1580+ <dia:attribute name="obj_bb">
1581+ <dia:rectangle val="-2.60308,26.7653;4.35604,28.8653"/>
1582+ </dia:attribute>
1583+ <dia:attribute name="elem_corner">
1584+ <dia:point val="-2.55308,26.8153"/>
1585+ </dia:attribute>
1586+ <dia:attribute name="elem_width">
1587+ <dia:real val="6.8591166559453667"/>
1588+ </dia:attribute>
1589+ <dia:attribute name="elem_height">
1590+ <dia:real val="2"/>
1591+ </dia:attribute>
1592+ <dia:attribute name="show_background">
1593+ <dia:boolean val="true"/>
1594+ </dia:attribute>
1595+ <dia:attribute name="shear_angle">
1596+ <dia:real val="70"/>
1597+ </dia:attribute>
1598+ <dia:attribute name="padding">
1599+ <dia:real val="0.5"/>
1600+ </dia:attribute>
1601+ <dia:attribute name="text">
1602+ <dia:composite type="text">
1603+ <dia:attribute name="string">
1604+ <dia:string>#LTS Haskell x.y#</dia:string>
1605+ </dia:attribute>
1606+ <dia:attribute name="font">
1607+ <dia:font family="sans" style="0" name="Helvetica"/>
1608+ </dia:attribute>
1609+ <dia:attribute name="height">
1610+ <dia:real val="0.80000000000000004"/>
1611+ </dia:attribute>
1612+ <dia:attribute name="pos">
1613+ <dia:point val="0.876478,28.0103"/>
1614+ </dia:attribute>
1615+ <dia:attribute name="color">
1616+ <dia:color val="#000000"/>
1617+ </dia:attribute>
1618+ <dia:attribute name="alignment">
1619+ <dia:enum val="1"/>
1620+ </dia:attribute>
1621+ </dia:composite>
1622+ </dia:attribute>
1623+ </dia:object>
1624+ </dia:group>
1625+ <dia:object type="Flowchart - Box" version="0" id="O37">
1626+ <dia:attribute name="obj_pos">
1627+ <dia:point val="7.665,18.915"/>
1628+ </dia:attribute>
1629+ <dia:attribute name="obj_bb">
1630+ <dia:rectangle val="7.615,18.865;12.956,20.865"/>
1631+ </dia:attribute>
1632+ <dia:attribute name="elem_corner">
1633+ <dia:point val="7.665,18.915"/>
1634+ </dia:attribute>
1635+ <dia:attribute name="elem_width">
1636+ <dia:real val="5.2410062688035248"/>
1637+ </dia:attribute>
1638+ <dia:attribute name="elem_height">
1639+ <dia:real val="1.9000000014901162"/>
1640+ </dia:attribute>
1641+ <dia:attribute name="border_width">
1642+ <dia:real val="0.10000000149011612"/>
1643+ </dia:attribute>
1644+ <dia:attribute name="border_color">
1645+ <dia:color val="#ff0000"/>
1646+ </dia:attribute>
1647+ <dia:attribute name="show_background">
1648+ <dia:boolean val="true"/>
1649+ </dia:attribute>
1650+ <dia:attribute name="padding">
1651+ <dia:real val="0.5"/>
1652+ </dia:attribute>
1653+ <dia:attribute name="text">
1654+ <dia:composite type="text">
1655+ <dia:attribute name="string">
1656+ <dia:string>#cabal2nix#</dia:string>
1657+ </dia:attribute>
1658+ <dia:attribute name="font">
1659+ <dia:font family="sans" style="0" name="Helvetica"/>
1660+ </dia:attribute>
1661+ <dia:attribute name="height">
1662+ <dia:real val="0.80000000000000004"/>
1663+ </dia:attribute>
1664+ <dia:attribute name="pos">
1665+ <dia:point val="10.2855,20.06"/>
1666+ </dia:attribute>
1667+ <dia:attribute name="color">
1668+ <dia:color val="#000000"/>
1669+ </dia:attribute>
1670+ <dia:attribute name="alignment">
1671+ <dia:enum val="1"/>
1672+ </dia:attribute>
1673+ </dia:composite>
1674+ </dia:attribute>
1675+ </dia:object>
1676+ <dia:object type="Standard - Arc" version="0" id="O38">
1677+ <dia:attribute name="obj_pos">
1678+ <dia:point val="3.77316,14.5879"/>
1679+ </dia:attribute>
1680+ <dia:attribute name="obj_bb">
1681+ <dia:rectangle val="3.70274,14.5175;9.04567,18.9854"/>
1682+ </dia:attribute>
1683+ <dia:attribute name="conn_endpoints">
1684+ <dia:point val="3.77316,14.5879"/>
1685+ <dia:point val="8.97525,18.915"/>
1686+ </dia:attribute>
1687+ <dia:attribute name="curve_distance">
1688+ <dia:real val="-0.48495657994633201"/>
1689+ </dia:attribute>
1690+ <dia:attribute name="line_width">
1691+ <dia:real val="0.10000000149011612"/>
1692+ </dia:attribute>
1693+ <dia:attribute name="end_arrow">
1694+ <dia:enum val="22"/>
1695+ </dia:attribute>
1696+ <dia:attribute name="end_arrow_length">
1697+ <dia:real val="0.5"/>
1698+ </dia:attribute>
1699+ <dia:attribute name="end_arrow_width">
1700+ <dia:real val="0.5"/>
1701+ </dia:attribute>
1702+ <dia:connections>
1703+ <dia:connection handle="0" to="O27" connection="11"/>
1704+ <dia:connection handle="1" to="O37" connection="1"/>
1705+ </dia:connections>
1706+ </dia:object>
1707+ <dia:object type="Standard - Line" version="0" id="O39">
1708+ <dia:attribute name="obj_pos">
1709+ <dia:point val="10.2855,20.815"/>
1710+ </dia:attribute>
1711+ <dia:attribute name="obj_bb">
1712+ <dia:rectangle val="9.90105,20.7644;10.6246,23.3301"/>
1713+ </dia:attribute>
1714+ <dia:attribute name="conn_endpoints">
1715+ <dia:point val="10.2855,20.815"/>
1716+ <dia:point val="10.2551,23.2184"/>
1717+ </dia:attribute>
1718+ <dia:attribute name="numcp">
1719+ <dia:int val="1"/>
1720+ </dia:attribute>
1721+ <dia:attribute name="end_arrow">
1722+ <dia:enum val="22"/>
1723+ </dia:attribute>
1724+ <dia:attribute name="end_arrow_length">
1725+ <dia:real val="0.5"/>
1726+ </dia:attribute>
1727+ <dia:attribute name="end_arrow_width">
1728+ <dia:real val="0.5"/>
1729+ </dia:attribute>
1730+ <dia:connections>
1731+ <dia:connection handle="0" to="O37" connection="13"/>
1732+ <dia:connection handle="1" to="O23" connection="2"/>
1733+ </dia:connections>
1734+ </dia:object>
1735+ <dia:object type="Standard - Arc" version="0" id="O40">
1736+ <dia:attribute name="obj_pos">
1737+ <dia:point val="3.69132,26.2429"/>
1738+ </dia:attribute>
1739+ <dia:attribute name="obj_bb">
1740+ <dia:rectangle val="3.625,15.088;8.92045,26.3092"/>
1741+ </dia:attribute>
1742+ <dia:attribute name="conn_endpoints">
1743+ <dia:point val="3.69132,26.2429"/>
1744+ <dia:point val="8.79396,15.1543"/>
1745+ </dia:attribute>
1746+ <dia:attribute name="curve_distance">
1747+ <dia:real val="0.38078805475472505"/>
1748+ </dia:attribute>
1749+ <dia:attribute name="line_width">
1750+ <dia:real val="0.10000000149011612"/>
1751+ </dia:attribute>
1752+ <dia:attribute name="end_arrow">
1753+ <dia:enum val="22"/>
1754+ </dia:attribute>
1755+ <dia:attribute name="end_arrow_length">
1756+ <dia:real val="0.5"/>
1757+ </dia:attribute>
1758+ <dia:attribute name="end_arrow_width">
1759+ <dia:real val="0.5"/>
1760+ </dia:attribute>
1761+ <dia:connections>
1762+ <dia:connection handle="0" to="O34" connection="3"/>
1763+ <dia:connection handle="1" to="O16" connection="12"/>
1764+ </dia:connections>
1765+ </dia:object>
1766+ </dia:layer>
1767+</dia:diagram>
doc/pipeline-overview.dianew file+625
@@ -0,0 +1,625 @@
1+<?xml version="1.0" encoding="UTF-8"?>
2+<dia:diagram xmlns:dia="http://www.lysator.liu.se/~alla/dia/">
3+ <dia:diagramdata>
4+ <dia:attribute name="background">
5+ <dia:color val="#ffffff"/>
6+ </dia:attribute>
7+ <dia:attribute name="pagebreak">
8+ <dia:color val="#000099"/>
9+ </dia:attribute>
10+ <dia:attribute name="paper">
11+ <dia:composite type="paper">
12+ <dia:attribute name="name">
13+ <dia:string>#A4#</dia:string>
14+ </dia:attribute>
15+ <dia:attribute name="tmargin">
16+ <dia:real val="2.8199999332427979"/>
17+ </dia:attribute>
18+ <dia:attribute name="bmargin">
19+ <dia:real val="2.8222000598907471"/>
20+ </dia:attribute>
21+ <dia:attribute name="lmargin">
22+ <dia:real val="2.8222000598907471"/>
23+ </dia:attribute>
24+ <dia:attribute name="rmargin">
25+ <dia:real val="2.8222000598907471"/>
26+ </dia:attribute>
27+ <dia:attribute name="is_portrait">
28+ <dia:boolean val="true"/>
29+ </dia:attribute>
30+ <dia:attribute name="scaling">
31+ <dia:real val="0.90529471635818481"/>
32+ </dia:attribute>
33+ <dia:attribute name="fitto">
34+ <dia:boolean val="true"/>
35+ </dia:attribute>
36+ <dia:attribute name="fitwidth">
37+ <dia:int val="1"/>
38+ </dia:attribute>
39+ <dia:attribute name="fitheight">
40+ <dia:int val="1"/>
41+ </dia:attribute>
42+ </dia:composite>
43+ </dia:attribute>
44+ <dia:attribute name="grid">
45+ <dia:composite type="grid">
46+ <dia:attribute name="width_x">
47+ <dia:real val="1"/>
48+ </dia:attribute>
49+ <dia:attribute name="width_y">
50+ <dia:real val="1"/>
51+ </dia:attribute>
52+ <dia:attribute name="visible_x">
53+ <dia:int val="1"/>
54+ </dia:attribute>
55+ <dia:attribute name="visible_y">
56+ <dia:int val="1"/>
57+ </dia:attribute>
58+ <dia:composite type="color"/>
59+ </dia:composite>
60+ </dia:attribute>
61+ <dia:attribute name="color">
62+ <dia:color val="#d8e5e5"/>
63+ </dia:attribute>
64+ <dia:attribute name="guides">
65+ <dia:composite type="guides">
66+ <dia:attribute name="hguides"/>
67+ <dia:attribute name="vguides"/>
68+ </dia:composite>
69+ </dia:attribute>
70+ </dia:diagramdata>
71+ <dia:layer name="Background" visible="true" active="true">
72+ <dia:object type="Network - Storage" version="1" id="O0">
73+ <dia:attribute name="obj_pos">
74+ <dia:point val="1.88131,8.06715"/>
75+ </dia:attribute>
76+ <dia:attribute name="obj_bb">
77+ <dia:rectangle val="1.16131,8.01715;4.30131,10.9621"/>
78+ </dia:attribute>
79+ <dia:attribute name="meta">
80+ <dia:composite type="dict"/>
81+ </dia:attribute>
82+ <dia:attribute name="elem_corner">
83+ <dia:point val="1.88131,8.06715"/>
84+ </dia:attribute>
85+ <dia:attribute name="elem_width">
86+ <dia:real val="1.7"/>
87+ </dia:attribute>
88+ <dia:attribute name="elem_height">
89+ <dia:real val="2"/>
90+ </dia:attribute>
91+ <dia:attribute name="line_width">
92+ <dia:real val="0.10000000149011612"/>
93+ </dia:attribute>
94+ <dia:attribute name="line_colour">
95+ <dia:color val="#000000"/>
96+ </dia:attribute>
97+ <dia:attribute name="fill_colour">
98+ <dia:color val="#ffffff"/>
99+ </dia:attribute>
100+ <dia:attribute name="show_background">
101+ <dia:boolean val="true"/>
102+ </dia:attribute>
103+ <dia:attribute name="line_style">
104+ <dia:enum val="0"/>
105+ <dia:real val="1"/>
106+ </dia:attribute>
107+ <dia:attribute name="padding">
108+ <dia:real val="0.10000000000000001"/>
109+ </dia:attribute>
110+ <dia:attribute name="text">
111+ <dia:composite type="text">
112+ <dia:attribute name="string">
113+ <dia:string>#Hackage#</dia:string>
114+ </dia:attribute>
115+ <dia:attribute name="font">
116+ <dia:font family="sans" style="0" name="Helvetica"/>
117+ </dia:attribute>
118+ <dia:attribute name="height">
119+ <dia:real val="0.84666663408279419"/>
120+ </dia:attribute>
121+ <dia:attribute name="pos">
122+ <dia:point val="2.73131,10.7021"/>
123+ </dia:attribute>
124+ <dia:attribute name="color">
125+ <dia:color val="#000000"/>
126+ </dia:attribute>
127+ <dia:attribute name="alignment">
128+ <dia:enum val="1"/>
129+ </dia:attribute>
130+ </dia:composite>
131+ </dia:attribute>
132+ <dia:attribute name="flip_horizontal">
133+ <dia:boolean val="false"/>
134+ </dia:attribute>
135+ <dia:attribute name="flip_vertical">
136+ <dia:boolean val="false"/>
137+ </dia:attribute>
138+ <dia:attribute name="subscale">
139+ <dia:real val="1"/>
140+ </dia:attribute>
141+ </dia:object>
142+ <dia:object type="Network - Storage" version="1" id="O1">
143+ <dia:attribute name="obj_pos">
144+ <dia:point val="6.68779,8.06715"/>
145+ </dia:attribute>
146+ <dia:attribute name="obj_bb">
147+ <dia:rectangle val="5.87529,8.01715;9.20029,10.9621"/>
148+ </dia:attribute>
149+ <dia:attribute name="meta">
150+ <dia:composite type="dict"/>
151+ </dia:attribute>
152+ <dia:attribute name="elem_corner">
153+ <dia:point val="6.68779,8.06715"/>
154+ </dia:attribute>
155+ <dia:attribute name="elem_width">
156+ <dia:real val="1.7"/>
157+ </dia:attribute>
158+ <dia:attribute name="elem_height">
159+ <dia:real val="2"/>
160+ </dia:attribute>
161+ <dia:attribute name="line_width">
162+ <dia:real val="0.10000000149011612"/>
163+ </dia:attribute>
164+ <dia:attribute name="line_colour">
165+ <dia:color val="#000000"/>
166+ </dia:attribute>
167+ <dia:attribute name="fill_colour">
168+ <dia:color val="#ffffff"/>
169+ </dia:attribute>
170+ <dia:attribute name="show_background">
171+ <dia:boolean val="true"/>
172+ </dia:attribute>
173+ <dia:attribute name="line_style">
174+ <dia:enum val="0"/>
175+ <dia:real val="1"/>
176+ </dia:attribute>
177+ <dia:attribute name="padding">
178+ <dia:real val="0.10000000000000001"/>
179+ </dia:attribute>
180+ <dia:attribute name="text">
181+ <dia:composite type="text">
182+ <dia:attribute name="string">
183+ <dia:string>#Stackage#</dia:string>
184+ </dia:attribute>
185+ <dia:attribute name="font">
186+ <dia:font family="sans" style="0" name="Helvetica"/>
187+ </dia:attribute>
188+ <dia:attribute name="height">
189+ <dia:real val="0.84666663408279419"/>
190+ </dia:attribute>
191+ <dia:attribute name="pos">
192+ <dia:point val="7.53779,10.7021"/>
193+ </dia:attribute>
194+ <dia:attribute name="color">
195+ <dia:color val="#000000"/>
196+ </dia:attribute>
197+ <dia:attribute name="alignment">
198+ <dia:enum val="1"/>
199+ </dia:attribute>
200+ </dia:composite>
201+ </dia:attribute>
202+ <dia:attribute name="flip_horizontal">
203+ <dia:boolean val="false"/>
204+ </dia:attribute>
205+ <dia:attribute name="flip_vertical">
206+ <dia:boolean val="false"/>
207+ </dia:attribute>
208+ <dia:attribute name="subscale">
209+ <dia:real val="1"/>
210+ </dia:attribute>
211+ </dia:object>
212+ <dia:object type="Network - Storage" version="1" id="O2">
213+ <dia:attribute name="obj_pos">
214+ <dia:point val="11.3743,8.06715"/>
215+ </dia:attribute>
216+ <dia:attribute name="obj_bb">
217+ <dia:rectangle val="10.7743,8.01715;13.6743,10.9621"/>
218+ </dia:attribute>
219+ <dia:attribute name="meta">
220+ <dia:composite type="dict"/>
221+ </dia:attribute>
222+ <dia:attribute name="elem_corner">
223+ <dia:point val="11.3743,8.06715"/>
224+ </dia:attribute>
225+ <dia:attribute name="elem_width">
226+ <dia:real val="1.7"/>
227+ </dia:attribute>
228+ <dia:attribute name="elem_height">
229+ <dia:real val="2"/>
230+ </dia:attribute>
231+ <dia:attribute name="line_width">
232+ <dia:real val="0.10000000149011612"/>
233+ </dia:attribute>
234+ <dia:attribute name="line_colour">
235+ <dia:color val="#000000"/>
236+ </dia:attribute>
237+ <dia:attribute name="fill_colour">
238+ <dia:color val="#ffffff"/>
239+ </dia:attribute>
240+ <dia:attribute name="show_background">
241+ <dia:boolean val="true"/>
242+ </dia:attribute>
243+ <dia:attribute name="line_style">
244+ <dia:enum val="0"/>
245+ <dia:real val="1"/>
246+ </dia:attribute>
247+ <dia:attribute name="padding">
248+ <dia:real val="0.10000000000000001"/>
249+ </dia:attribute>
250+ <dia:attribute name="text">
251+ <dia:composite type="text">
252+ <dia:attribute name="string">
253+ <dia:string>#Nixpkgs#</dia:string>
254+ </dia:attribute>
255+ <dia:attribute name="font">
256+ <dia:font family="sans" style="0" name="Helvetica"/>
257+ </dia:attribute>
258+ <dia:attribute name="height">
259+ <dia:real val="0.84666663408279419"/>
260+ </dia:attribute>
261+ <dia:attribute name="pos">
262+ <dia:point val="12.2243,10.7021"/>
263+ </dia:attribute>
264+ <dia:attribute name="color">
265+ <dia:color val="#000000"/>
266+ </dia:attribute>
267+ <dia:attribute name="alignment">
268+ <dia:enum val="1"/>
269+ </dia:attribute>
270+ </dia:composite>
271+ </dia:attribute>
272+ <dia:attribute name="flip_horizontal">
273+ <dia:boolean val="false"/>
274+ </dia:attribute>
275+ <dia:attribute name="flip_vertical">
276+ <dia:boolean val="false"/>
277+ </dia:attribute>
278+ <dia:attribute name="subscale">
279+ <dia:real val="1"/>
280+ </dia:attribute>
281+ </dia:object>
282+ <dia:object type="Network - Cloud" version="1" id="O3">
283+ <dia:attribute name="obj_pos">
284+ <dia:point val="11.7702,3.33165"/>
285+ </dia:attribute>
286+ <dia:attribute name="obj_bb">
287+ <dia:rectangle val="11.7702,3.33165;17.2182,5.64688"/>
288+ </dia:attribute>
289+ <dia:attribute name="meta">
290+ <dia:composite type="dict"/>
291+ </dia:attribute>
292+ <dia:attribute name="elem_corner">
293+ <dia:point val="11.7702,3.33165"/>
294+ </dia:attribute>
295+ <dia:attribute name="elem_width">
296+ <dia:real val="5.4479782276937048"/>
297+ </dia:attribute>
298+ <dia:attribute name="elem_height">
299+ <dia:real val="2.3152317880599642"/>
300+ </dia:attribute>
301+ <dia:attribute name="line_width">
302+ <dia:real val="0.10000000149011612"/>
303+ </dia:attribute>
304+ <dia:attribute name="line_colour">
305+ <dia:color val="#000000"/>
306+ </dia:attribute>
307+ <dia:attribute name="fill_colour">
308+ <dia:color val="#ffffff"/>
309+ </dia:attribute>
310+ <dia:attribute name="show_background">
311+ <dia:boolean val="true"/>
312+ </dia:attribute>
313+ <dia:attribute name="line_style">
314+ <dia:enum val="0"/>
315+ <dia:real val="1"/>
316+ </dia:attribute>
317+ <dia:attribute name="padding">
318+ <dia:real val="0.10000000000000001"/>
319+ </dia:attribute>
320+ <dia:attribute name="text">
321+ <dia:composite type="text">
322+ <dia:attribute name="string">
323+ <dia:string>#Internet#</dia:string>
324+ </dia:attribute>
325+ <dia:attribute name="font">
326+ <dia:font family="sans" style="0" name="Helvetica"/>
327+ </dia:attribute>
328+ <dia:attribute name="height">
329+ <dia:real val="0.84666663408279419"/>
330+ </dia:attribute>
331+ <dia:attribute name="pos">
332+ <dia:point val="14.6402,4.74175"/>
333+ </dia:attribute>
334+ <dia:attribute name="color">
335+ <dia:color val="#000000"/>
336+ </dia:attribute>
337+ <dia:attribute name="alignment">
338+ <dia:enum val="1"/>
339+ </dia:attribute>
340+ </dia:composite>
341+ </dia:attribute>
342+ <dia:attribute name="flip_horizontal">
343+ <dia:boolean val="false"/>
344+ </dia:attribute>
345+ <dia:attribute name="flip_vertical">
346+ <dia:boolean val="false"/>
347+ </dia:attribute>
348+ <dia:attribute name="subscale">
349+ <dia:real val="1"/>
350+ </dia:attribute>
351+ </dia:object>
352+ <dia:object type="Standard - Line" version="0" id="O4">
353+ <dia:attribute name="obj_pos">
354+ <dia:point val="3.63144,9.06715"/>
355+ </dia:attribute>
356+ <dia:attribute name="obj_bb">
357+ <dia:rectangle val="3.58144,8.70535;6.74994,9.42895"/>
358+ </dia:attribute>
359+ <dia:attribute name="conn_endpoints">
360+ <dia:point val="3.63144,9.06715"/>
361+ <dia:point val="6.63813,9.06715"/>
362+ </dia:attribute>
363+ <dia:attribute name="numcp">
364+ <dia:int val="1"/>
365+ </dia:attribute>
366+ <dia:attribute name="end_arrow">
367+ <dia:enum val="22"/>
368+ </dia:attribute>
369+ <dia:attribute name="end_arrow_length">
370+ <dia:real val="0.5"/>
371+ </dia:attribute>
372+ <dia:attribute name="end_arrow_width">
373+ <dia:real val="0.5"/>
374+ </dia:attribute>
375+ <dia:connections>
376+ <dia:connection handle="0" to="O0" connection="2"/>
377+ <dia:connection handle="1" to="O1" connection="2"/>
378+ </dia:connections>
379+ </dia:object>
380+ <dia:object type="Standard - Line" version="0" id="O5">
381+ <dia:attribute name="obj_pos">
382+ <dia:point val="8.42921,9.06715"/>
383+ </dia:attribute>
384+ <dia:attribute name="obj_bb">
385+ <dia:rectangle val="8.37921,8.70535;11.4369,9.42895"/>
386+ </dia:attribute>
387+ <dia:attribute name="conn_endpoints">
388+ <dia:point val="8.42921,9.06715"/>
389+ <dia:point val="11.3251,9.06715"/>
390+ </dia:attribute>
391+ <dia:attribute name="numcp">
392+ <dia:int val="1"/>
393+ </dia:attribute>
394+ <dia:attribute name="end_arrow">
395+ <dia:enum val="22"/>
396+ </dia:attribute>
397+ <dia:attribute name="end_arrow_length">
398+ <dia:real val="0.5"/>
399+ </dia:attribute>
400+ <dia:attribute name="end_arrow_width">
401+ <dia:real val="0.5"/>
402+ </dia:attribute>
403+ <dia:connections>
404+ <dia:connection handle="0" to="O1" connection="2"/>
405+ <dia:connection handle="1" to="O2" connection="2"/>
406+ </dia:connections>
407+ </dia:object>
408+ <dia:object type="Standard - Line" version="0" id="O6">
409+ <dia:attribute name="obj_pos">
410+ <dia:point val="13.1243,9.06419"/>
411+ </dia:attribute>
412+ <dia:attribute name="obj_bb">
413+ <dia:rectangle val="13.0741,8.69217;16.4349,9.41577"/>
414+ </dia:attribute>
415+ <dia:attribute name="conn_endpoints">
416+ <dia:point val="13.1243,9.06419"/>
417+ <dia:point val="16.3231,9.05155"/>
418+ </dia:attribute>
419+ <dia:attribute name="numcp">
420+ <dia:int val="1"/>
421+ </dia:attribute>
422+ <dia:attribute name="end_arrow">
423+ <dia:enum val="22"/>
424+ </dia:attribute>
425+ <dia:attribute name="end_arrow_length">
426+ <dia:real val="0.5"/>
427+ </dia:attribute>
428+ <dia:attribute name="end_arrow_width">
429+ <dia:real val="0.5"/>
430+ </dia:attribute>
431+ <dia:connections>
432+ <dia:connection handle="0" to="O2" connection="2"/>
433+ <dia:connection handle="1" to="O7" connection="2"/>
434+ </dia:connections>
435+ </dia:object>
436+ <dia:object type="Network - Storage" version="1" id="O7">
437+ <dia:attribute name="obj_pos">
438+ <dia:point val="16.3733,8.0474"/>
439+ </dia:attribute>
440+ <dia:attribute name="obj_bb">
441+ <dia:rectangle val="16.3233,7.9974;18.1233,10.9424"/>
442+ </dia:attribute>
443+ <dia:attribute name="meta">
444+ <dia:composite type="dict"/>
445+ </dia:attribute>
446+ <dia:attribute name="elem_corner">
447+ <dia:point val="16.3733,8.0474"/>
448+ </dia:attribute>
449+ <dia:attribute name="elem_width">
450+ <dia:real val="1.7"/>
451+ </dia:attribute>
452+ <dia:attribute name="elem_height">
453+ <dia:real val="2"/>
454+ </dia:attribute>
455+ <dia:attribute name="line_width">
456+ <dia:real val="0.10000000149011612"/>
457+ </dia:attribute>
458+ <dia:attribute name="line_colour">
459+ <dia:color val="#000000"/>
460+ </dia:attribute>
461+ <dia:attribute name="fill_colour">
462+ <dia:color val="#ffffff"/>
463+ </dia:attribute>
464+ <dia:attribute name="show_background">
465+ <dia:boolean val="true"/>
466+ </dia:attribute>
467+ <dia:attribute name="line_style">
468+ <dia:enum val="0"/>
469+ <dia:real val="1"/>
470+ </dia:attribute>
471+ <dia:attribute name="padding">
472+ <dia:real val="0.10000000000000001"/>
473+ </dia:attribute>
474+ <dia:attribute name="text">
475+ <dia:composite type="text">
476+ <dia:attribute name="string">
477+ <dia:string>#User#</dia:string>
478+ </dia:attribute>
479+ <dia:attribute name="font">
480+ <dia:font family="sans" style="0" name="Helvetica"/>
481+ </dia:attribute>
482+ <dia:attribute name="height">
483+ <dia:real val="0.84666663408279419"/>
484+ </dia:attribute>
485+ <dia:attribute name="pos">
486+ <dia:point val="17.2233,10.6824"/>
487+ </dia:attribute>
488+ <dia:attribute name="color">
489+ <dia:color val="#000000"/>
490+ </dia:attribute>
491+ <dia:attribute name="alignment">
492+ <dia:enum val="1"/>
493+ </dia:attribute>
494+ </dia:composite>
495+ </dia:attribute>
496+ <dia:attribute name="flip_horizontal">
497+ <dia:boolean val="false"/>
498+ </dia:attribute>
499+ <dia:attribute name="flip_vertical">
500+ <dia:boolean val="false"/>
501+ </dia:attribute>
502+ <dia:attribute name="subscale">
503+ <dia:real val="1"/>
504+ </dia:attribute>
505+ </dia:object>
506+ <dia:object type="Standard - Arc" version="0" id="O8">
507+ <dia:attribute name="obj_pos">
508+ <dia:point val="2.88131,9.06715"/>
509+ </dia:attribute>
510+ <dia:attribute name="obj_bb">
511+ <dia:rectangle val="2.83131,6.80516;12.4243,9.11715"/>
512+ </dia:attribute>
513+ <dia:attribute name="conn_endpoints">
514+ <dia:point val="2.88131,9.06715"/>
515+ <dia:point val="12.3743,9.06715"/>
516+ </dia:attribute>
517+ <dia:attribute name="curve_distance">
518+ <dia:real val="-2.2119853006179615"/>
519+ </dia:attribute>
520+ <dia:attribute name="line_width">
521+ <dia:real val="0.10000000149011612"/>
522+ </dia:attribute>
523+ <dia:attribute name="end_arrow">
524+ <dia:enum val="22"/>
525+ </dia:attribute>
526+ <dia:attribute name="end_arrow_length">
527+ <dia:real val="0.5"/>
528+ </dia:attribute>
529+ <dia:attribute name="end_arrow_width">
530+ <dia:real val="0.5"/>
531+ </dia:attribute>
532+ <dia:connections>
533+ <dia:connection handle="0" to="O0" connection="2"/>
534+ <dia:connection handle="1" to="O2" connection="2"/>
535+ </dia:connections>
536+ </dia:object>
537+ <dia:object type="Standard - Line" version="0" id="O9">
538+ <dia:attribute name="obj_pos">
539+ <dia:point val="13.9888,5.58092"/>
540+ </dia:attribute>
541+ <dia:attribute name="obj_bb">
542+ <dia:rectangle val="12.7291,5.51454;14.0552,8.21461"/>
543+ </dia:attribute>
544+ <dia:attribute name="conn_endpoints">
545+ <dia:point val="13.9888,5.58092"/>
546+ <dia:point val="12.8161,8.11315"/>
547+ </dia:attribute>
548+ <dia:attribute name="numcp">
549+ <dia:int val="1"/>
550+ </dia:attribute>
551+ <dia:attribute name="end_arrow">
552+ <dia:enum val="22"/>
553+ </dia:attribute>
554+ <dia:attribute name="end_arrow_length">
555+ <dia:real val="0.5"/>
556+ </dia:attribute>
557+ <dia:attribute name="end_arrow_width">
558+ <dia:real val="0.5"/>
559+ </dia:attribute>
560+ <dia:connections>
561+ <dia:connection handle="0" to="O3" connection="4"/>
562+ <dia:connection handle="1" to="O2" connection="2"/>
563+ </dia:connections>
564+ </dia:object>
565+ <dia:object type="Standard - Line" version="0" id="O10">
566+ <dia:attribute name="obj_pos">
567+ <dia:point val="15.0831,5.40979"/>
568+ </dia:attribute>
569+ <dia:attribute name="obj_bb">
570+ <dia:rectangle val="15.0142,5.34083;16.82,8.15366"/>
571+ </dia:attribute>
572+ <dia:attribute name="conn_endpoints">
573+ <dia:point val="15.0831,5.40979"/>
574+ <dia:point val="16.7511,8.05905"/>
575+ </dia:attribute>
576+ <dia:attribute name="numcp">
577+ <dia:int val="1"/>
578+ </dia:attribute>
579+ <dia:attribute name="end_arrow">
580+ <dia:enum val="22"/>
581+ </dia:attribute>
582+ <dia:attribute name="end_arrow_length">
583+ <dia:real val="0.5"/>
584+ </dia:attribute>
585+ <dia:attribute name="end_arrow_width">
586+ <dia:real val="0.5"/>
587+ </dia:attribute>
588+ <dia:connections>
589+ <dia:connection handle="0" to="O3" connection="4"/>
590+ <dia:connection handle="1" to="O7" connection="2"/>
591+ </dia:connections>
592+ </dia:object>
593+ <dia:object type="Standard - Arc" version="0" id="O11">
594+ <dia:attribute name="obj_pos">
595+ <dia:point val="2.73131,8.06715"/>
596+ </dia:attribute>
597+ <dia:attribute name="obj_bb">
598+ <dia:rectangle val="2.67808,5.82924;17.4265,9.10063"/>
599+ </dia:attribute>
600+ <dia:attribute name="conn_endpoints">
601+ <dia:point val="2.73131,8.06715"/>
602+ <dia:point val="17.3733,9.0474"/>
603+ </dia:attribute>
604+ <dia:attribute name="curve_distance">
605+ <dia:real val="-2.6583884076175863"/>
606+ </dia:attribute>
607+ <dia:attribute name="line_width">
608+ <dia:real val="0.10000000149011612"/>
609+ </dia:attribute>
610+ <dia:attribute name="end_arrow">
611+ <dia:enum val="22"/>
612+ </dia:attribute>
613+ <dia:attribute name="end_arrow_length">
614+ <dia:real val="0.5"/>
615+ </dia:attribute>
616+ <dia:attribute name="end_arrow_width">
617+ <dia:real val="0.5"/>
618+ </dia:attribute>
619+ <dia:connections>
620+ <dia:connection handle="0" to="O0" connection="0"/>
621+ <dia:connection handle="1" to="O7" connection="2"/>
622+ </dia:connections>
623+ </dia:object>
624+ </dia:layer>
625+</dia:diagram>
doc/user-guide.mddeleted−569
@@ -1,569 +0,0 @@
1−---
2−title: User's Guide for Haskell in Nixpkgs
3−author: Peter Simons
4−date: 2015-06-01
5−---
6−
7−# How to install Haskell packages
8−
9−Nixpkgs distributes build instructions for all Haskell packages registered on
10−[Hackage](http://hackage.haskell.org/), but strangely enough normal Nix package
11−lookups don't seem to discover any of them:
12−
13− $ nix-env -qa cabal-install
14− error: selector ‘cabal-install’ matches no derivations
15−
16− $ nix-env -i ghc
17− error: selector ‘ghc’ matches no derivations
18−
19−The Haskell package set is not registered in the top-level namespace because it
20−is *huge*. If all Haskell packages were visible to these commands, then
21−name-based search/install operations would be much slower than they are now. We
22−avoided that by keeping all Haskell-related packages in a separate attribute
23−set called `haskellPackages`, which the following command will list:
24−
25− $ nix-env -f "<nixpkgs>" -qaP -A haskellPackages
26− haskellPackages.a50 a50-0.5
27− haskellPackages.abacate haskell-abacate-0.0.0.0
28− haskellPackages.abcBridge haskell-abcBridge-0.12
29− haskellPackages.afv afv-0.1.1
30− haskellPackages.alex alex-3.1.4
31− haskellPackages.Allure Allure-0.4.101.1
32− haskellPackages.alms alms-0.6.7
33− [... some 8000 entries omitted ...]
34−
35−To install any of those packages into your profile, refer to them by their
36−attribute path (first column):
37−
38− $ nix-env -f "<nixpkgs>" -iA haskellPackages.Allure ...
39−
40−The attribute path of any Haskell packages corresponds to the name of that
41−particular package on Hackage: the package `cabal-install` has the attribute
42−`haskellPackages.cabal-install`, and so on. (Actually, this convention causes
43−trouble with packages like `3dmodels` and `4Blocks`, because these names are
44−invalid identifiers in the Nix language. The issue of how to deal with these
45−rare corner cases is currently unresolved.)
46−
47−Haskell packages who's Nix name (second column) begins with a `haskell-` prefix
48−are packages that provide a library whereas packages without that prefix
49−provide just executables. Libraries may provide executables too, though: the
50−package `haskell-pandoc`, for example, installs both a library and an
51−application. You can install and use Haskell executables just like any other
52−program in Nixpkgs, but using Haskell libraries for development is a bit
53−trickier and we'll address that subject in great detail in section [How to
54−create a development environment].
55−
56−Attribute paths are deterministic inside of Nixpkgs, but the path necessary to
57−reach Nixpkgs varies from system to system. We dodged that problem by giving
58−`nix-env` an explicit `-f "<nixpkgs>"` parameter, but if you call `nix-env`
59−without that flag, then chances are the invocation fails:
60−
61− $ nix-env -iA haskellPackages.cabal-install
62− error: attribute ‘haskellPackages’ in selection path
63− ‘haskellPackages.cabal-install’ not found
64−
65−On NixOS, for example, Nixpkgs does *not* exist in the top-level namespace by
66−default. To figure out the proper attribute path, it's easiest to query for the
67−path of a well-known Nixpkgs package, i.e.:
68−
69− $ nix-env -qaP coreutils
70− nixos.pkgs.coreutils coreutils-8.23
71−
72−If your system responds like that (most NixOS installatios will), then the
73−attribute path to `haskellPackages` is `nixos.pkgs.haskellPackages`. Thus, if
74−you want to use `nix-env` without giving an explicit `-f` flag, then that's the
75−way to do it:
76−
77− $ nix-env -qaP -A nixos.pkgs.haskellPackages
78− $ nix-env -iA nixos.pkgs.haskellPackages.cabal-install
79−
80−Our current default compiler is GHC 7.10.x and the `haskellPackages` set
81−contains packages built with that particular version. Nixpkgs contains the
82−latest major release of every GHC since 6.10.4, however, and there is a whole
83−family of package sets available that defines Hackage packages built with each
84−of those compilers, too:
85−
86− $ nix-env -f "<nixpkgs>" -qaP -A haskell.packages.ghc6123
87− $ nix-env -f "<nixpkgs>" -qaP -A haskell.packages.ghc763
88−
89−The name `haskellPackages` is really just a synonym for
90−`haskell.packages.ghc7101`, because we prefer that package set internally and
91−recommend it to our users as their default choice, but ultimately you are free
92−to compile your Haskell packages with any GHC version you please. The following
93−command displays the complete list of available compilers:
94−
95− $ nix-env -f "<nixpkgs>" -qaP -A haskell.compiler
96− haskell.compiler.ghc6104 ghc-6.10.4
97− haskell.compiler.ghc6123 ghc-6.12.3
98− haskell.compiler.ghc704 ghc-7.0.4
99− haskell.compiler.ghc722 ghc-7.2.2
100− haskell.compiler.ghc742 ghc-7.4.2
101− haskell.compiler.ghc763 ghc-7.6.3
102− haskell.compiler.ghc784 ghc-7.8.4
103− haskell.compiler.ghc7101 ghc-7.10.1
104− haskell.compiler.ghcHEAD ghc-7.11.20150402
105− haskell.compiler.ghcjs ghcjs-0.1.0
106− haskell.compiler.jhc jhc-0.8.2
107− haskell.compiler.uhc uhc-1.1.9.0
108−
109−We have no package sets for `jhc` or `uhc` yet, unfortunately, but for every
110−version of GHC listed above, there exists a package set based on that compiler.
111−Also, the attributes `haskell.compiler.ghcXYC` and
112−`haskell.packages.ghcXYC.ghc` are synonymous for the sake of convenience.
113−
114−# How to create a development environment
115−
116−## How to install a compiler
117−
118−A simple development environment consists of a Haskell compiler and the tool
119−`cabal-install`, and we saw in section [How to install Haskell packages] how
120−you can install those programs into your user profile:
121−
122− $ nix-env -f "<nixpkgs>" -iA haskellPackages.ghc haskellPackages.cabal-install
123−
124−Instead of the default package set `haskellPackages`, you can also use the more
125−precise name `haskell.compiler.ghc7101`, which has the advantage that it refers
126−to the same GHC version regardless of what Nixpkgs considers "default" at any
127−given time.
128−
129−Once you've made those tools available in `$PATH`, it's possible to build
130−Hackage packages the same way people without access to Nix do it all the time:
131−
132− $ cabal get lens-4.11 && cd lens-4.11
133− $ cabal install -j --dependencies-only
134− $ cabal configure
135− $ cabal build
136−
137−If you enjoy working with Cabal sandboxes, then that's entirely possible too:
138−just execute the command
139−
140− $ cabal sandbox init
141−
142−before installing the required dependencies.
143−
144−The `nix-shell` utility makes it easy to switch to a different compiler
145−version; just enter the Nix shell environment with the command
146−
147− $ nix-shell -p haskell.compiler.ghc784
148−
149−to bring GHC 7.8.4 into `$PATH`. Re-running `cabal configure` switches your
150−build to use that compiler instead. If you're working on a project that doesn't
151−depend on any additional system libraries outside of GHC, then it's sufficient
152−even to run the `cabal configure` command inside of the shell:
153−
154− $ nix-shell -p haskell.compiler.ghc784 --command "cabal configure"
155−
156−Afterwards, all other commands like `cabal build` work just fine in any shell
157−environment, because the configure phase recorded the absolute paths to all
158−required tools like GHC in its build configuration inside of the `dist/`
159−directory. Please note, however, that `nix-collect-garbage` can break such an
160−environment because the Nix store paths created by `nix-shell` aren't "alive"
161−anymore once `nix-shell` has terminated. If you find that your Haskell builds
162−no longer work after garbage collection, then you'll have to re-run `cabal
163−configure` inside of a new `nix-shell` environment.
164−
165−## How to install a compiler with libraries
166−
167−GHC expects to find all installed libraries inside of its own `lib` directory.
168−This approach works fine on traditional Unix systems, but it doesn't work for
169−Nix, because GHC's store path is immutable once it's built. We cannot install
170−additional libraries into that location. As a consequence, our copies of GHC
171−don't know any packages except their own core libraries, like `base`,
172−`containers`, `Cabal`, etc.
173−
174−We can register additional libraries to GHC, however, using a special build
175−function called `ghcWithPackages`. That function expects one argument: a
176−function that maps from an attribute set of Haskell packages to a list of
177−packages, which determines the libraries known to that particular version of
178−GHC. For example, the Nix expression `ghcWithPackages (pkgs: [pkgs.mtl])`
179−generates a copy of GHC that has the `mtl` library registered in addition to
180−its normal core packages:
181−
182− $ nix-shell -p "haskellPackages.ghcWithPackages (pkgs: [pkgs.mtl])"
183−
184− [nix-shell:~]$ ghc-pkg list mtl
185− /nix/store/zy79...-ghc-7.10.1/lib/ghc-7.10.1/package.conf.d:
186− mtl-2.2.1
187−
188−This function allows users to define their own development environment by means
189−of an override. After adding the following snippet to `~/.nixpkgs/config.nix`,
190−
191− {
192− packageOverrides = super: let self = super.pkgs; in
193− {
194− myHaskellEnv = self.haskell.packages.ghc7101.ghcWithPackages
195− (haskellPackages: with haskellPackages; [
196− # libraries
197− arrows async cgi criterion
198− # tools
199− cabal-install haskintex
200− ]);
201− };
202− }
203−
204−it's possible to install that compiler with `nix-env -f "<nixpkgs>" -iA
205−myHaskellEnv`. If you'd like to switch that development environment to a
206−different version of GHC, just replace the `ghc7101` bit in the previous
207−definition with the appropriate name. Of course, it's also possible to define
208−any number of these development environments! (You can't install two of them
209−into the same profile at the same time, though, because that would result in
210−file conflicts.)
211−
212−The generated `ghc` program is a wrapper script that re-directs the real
213−GHC executable to use a new `lib` directory --- one that we specifically
214−constructed to contain all those packages the user requested:
215−
216− $ cat $(type -p ghc)
217− #! /nix/store/xlxj...-bash-4.3-p33/bin/bash -e
218− export NIX_GHC=/nix/store/19sm...-ghc-7.10.1/bin/ghc
219− export NIX_GHCPKG=/nix/store/19sm...-ghc-7.10.1/bin/ghc-pkg
220− export NIX_GHC_DOCDIR=/nix/store/19sm...-ghc-7.10.1/share/doc/ghc/html
221− export NIX_GHC_LIBDIR=/nix/store/19sm...-ghc-7.10.1/lib/ghc-7.10.1
222− exec /nix/store/j50p...-ghc-7.10.1/bin/ghc "-B$NIX_GHC_LIBDIR" "$@"
223−
224−The variables `$NIX_GHC`, `$NIX_GHCPKG`, etc. point to the *new* store path
225−`ghcWithPackages` constructed specifically for this environment. The last line
226−of the wrapper script then executes the real `ghc`, but passes the path to the
227−new `lib` directory using GHC's `-B` flag.
228−
229−The purpose of those environment variables is to work around an impurity in the
230−popular [ghc-paths](http://hackage.haskell.org/package/ghc-paths) library. That
231−library promises to give its users access to GHC's installation paths. Only,
232−the library can't possible know that path when it's compiled, because the path
233−GHC considers its own is determined only much later, when the user configures
234−it through `ghcWithPackages`. So we [patched
235−ghc-paths](https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/ghc-paths-nix.patch)
236−to return the paths found in those environment variables at run-time rather
237−than trying to guess them at compile-time.
238−
239−To make sure that mechanism works properly all the time, we recommend that you
240−set those variables to meaningful values in your shell environment, too, i.e.
241−by adding the following code to your `~/.bashrc`:
242−
243− if type >/dev/null 2>&1 -p ghc; then
244− eval "$(egrep ^export "$(type -p ghc)")"
245− fi
246−
247−If you are certain that you'll use only one GHC environment which is located in
248−your user profile, then you can use the following code, too, which has the
249−advantage that it doesn't contain any paths from the Nix store, i.e. those
250−settings always remain valid even if a `nix-env -u` operation updates the GHC
251−environment in your profile:
252−
253− if [ -e ~/.nix-profile/bin/ghc ]; then
254− export NIX_GHC="$HOME/.nix-profile/bin/ghc"
255− export NIX_GHCPKG="$HOME/.nix-profile/bin/ghc-pkg"
256− export NIX_GHC_DOCDIR="$HOME/.nix-profile/share/doc/ghc/html"
257− export NIX_GHC_LIBDIR="$HOME/.nix-profile/lib/ghc-$($NIX_GHC --numeric-version)"
258− fi
259−
260−## How to create ad hoc environments for `nix-shell`
261−
262−The easiest way to create an ad hoc development environment is to run
263−`nix-shell` with the appropriate GHC environment given on the command-line:
264−
265− nix-shell -p "haskellPackages.ghcWithPackages (pkgs: with pkgs; [mtl pandoc])"
266−
267−For more sophisticated use-cases, however, it's more convenient to save the
268−desired configuration in a file called `shell.nix` that looks like this:
269−
270− { nixpkgs ? import <nixpkgs> {}, compiler ? "ghc7101" }:
271− let
272− inherit (nixpkgs) pkgs;
273− ghc = pkgs.haskell.packages.${compiler}.ghcWithPackages (ps: with ps; [
274− monad-par mtl
275− ]);
276− in
277− pkgs.stdenv.mkDerivation {
278− name = "my-haskell-env-0";
279− buildInputs = [ ghc ];
280− shellHook = "eval $(egrep ^export ${ghc}/bin/ghc)";
281− }
282−
283−Now run `nix-shell` --- or even `nix-shell --pure` --- to enter a shell
284−environment that has the appropriate compiler in `$PATH`. If you use `--pure`,
285−then add all other packages that your development environment needs into the
286−`buildInputs` attribute. If you'd like to switch to a different compiler
287−version, then pass an appropriate `compiler` argument to the expression, i.e.
288−`nix-shell --argstr compiler ghc784`.
289−
290−If you need such an environment because you'd like to compile a Hackage package
291−outside of Nix --- i.e. because you're hacking on the latest version from Git
292−---, then the package set provides suitable nix-shell environments for you
293−already! Every Haskell package has an `env` attribute that provides a shell
294−environment suitable for compiling that particular package. If you'd like to
295−hack the `lens` library, for example, then you just have to check out the
296−source code and enter the appropriate environment:
297−
298− $ cabal get lens-4.11 && cd lens-4.11
299− Downloading lens-4.11...
300− Unpacking to lens-4.11/
301−
302− $ nix-shell "<nixpkgs>" -A haskellPackages.lens.env
303− [nix-shell:/tmp/lens-4.11]$
304−
305−At point, you can run `cabal configure`, `cabal build`, and all the other
306−development commands. Note that you need `cabal-install` installed in your
307−`$PATH` already to use it here --- the `nix-shell` environment does not provide
308−it.
309−
310−# How to create Nix builds for your own private Haskell packages
311−
312−If your own Haskell packages have build instructions for Cabal, then you can
313−convert those automatically into build instructions for Nix using the
314−`cabal2nix` utility, which you can install into your profile by running
315−`nix-env -i cabal2nix`.
316−
317−## How to build a stand-alone project
318−
319−For example, let's assume that you're working on a private project called
320−`foo`. To generate a Nix build expression for it, change into the project's
321−top-level directory and run the command:
322−
323− $ cabal2nix . >foo.nix
324−
325−Then write the following snippet into a file called `default.nix`:
326−
327− { nixpkgs ? import <nixpkgs> {}, compiler ? "ghc7101" }:
328− nixpkgs.pkgs.haskell.packages.${compiler}.callPackage ./foo.nix { }
329−
330−Finally, store the following code in a file called `shell.nix`:
331−
332− { nixpkgs ? import <nixpkgs> {}, compiler ? "ghc7101" }:
333− (import ./default.nix { inherit nixpkgs compiler; }).env
334−
335−At this point, you can run `nix-build` to have Nix compile your project and
336−install it into a Nix store path. The local directory will contain a symlink
337−called `result` after `nix-build` returns that points into that location. Of
338−course, passing the flag `--argstr compiler ghc763` allows switching the build
339−to any version of GHC currently supported.
340−
341−Furthermore, you can call `nix-shell` to enter an interactive development
342−environment in which you can use `cabal configure` and `cabal build` to develop
343−your code. That environment will automatically contain a proper GHC derivation
344−with all the required libraries registered as well as all the system-level
345−libraries your package might need.
346−
347−If your package does not depend on any system-level libraries, then it's
348−sufficient to run
349−
350− $ nix-shell --command "cabal configure"
351−
352−once to set up your build. `cabal-install` determines the absolute paths to all
353−resources required for the build and writes them into a config file in the
354−`dist/` directory. Once that's done, you can run `cabal build` and any other
355−command for that project even outside of the `nix-shell` environment. This
356−feature is particularly nice for those of us who like to edit their code with
357−an IDE, like Emacs' `haskell-mode`, because it's not necessary to start Emacs
358−inside of nix-shell just to make it find out the necessary settings for
359−building the project; `cabal-install` has already done that for us.
360−
361−If you want to do some quick-and-dirty hacking and don't want to bother setting
362−up a `default.nix` and `shell.nix` file manually, then you can use the
363−`--shell` flag offered by `cabal2nix` to have it generate a stand-alone
364−`nix-shell` environment for you. With that feature, running
365−
366− $ cabal2nix --shell . >shell.nix
367− $ nix-shell --command "cabal configure"
368−
369−is usually enough to set up a build environment for any given Haskell package.
370−You can even use that generated file to run `nix-build`, too:
371−
372− $ nix-build shell.nix
373−
374−## How to build projects that depend on each other
375−
376−If you have multiple private Haskell packages that depend on each other, then
377−you'll have to register those packages in the Nixpkgs set to make them visible
378−for the dependency resolution performed by `callPackage`. First of all, change
379−into each of your projects top-level directories and generate a `default.nix`
380−file with `cabal2nix`:
381−
382− $ cd ~/src/foo && cabal2nix . >default.nix
383− $ cd ~/src/bar && cabal2nix . >default.nix
384−
385−Then edit your `~/.nixpkgs/config.nix` file to register those builds in the
386−default Haskell package set:
387−
388− {
389− packageOverrides = super: let self = super.pkgs; in
390− {
391− haskellPackages = super.haskellPackages.override {
392− overrides = self: super: {
393− foo = self.callPackage ../src/foo {};
394− bar = self.callPackage ../src/bar {};
395− };
396− };
397− };
398− }
399−
400−Once that's accomplished, `nix-env -f "<nixpkgs>" -qA haskellPackages` will
401−show your packages like any other package from Hackage, and you can build them
402−
403− $ nix-build "<nixpkgs>" -A haskellPackages.foo
404−
405−or enter an interactive shell environment suitable for building them:
406−
407− $ nix-shell "<nixpkgs>" -A haskellPackages.bar.env
408−
409−# Miscellaneous Topics
410−
411−## How to build with profiling enabled
412−
413−Every Haskell package set takes a function called `overrides` that you can use
414−to manipulate the package as much as you please. One useful application of this
415−feature is to replace the default `mkDerivation` function with one that enables
416−library profiling for all packages. To accomplish that, add configure the
417−following snippet in your `~/.nixpkgs/config.nix` file:
418−
419− {
420− packageOverrides = super: let self = super.pkgs; in
421− {
422− profiledHaskellPackages = self.haskellPackages.override {
423− overrides = self: super: {
424− mkDerivation = args: super.mkDerivation (args // {
425− enableLibraryProfiling = true;
426− });
427− };
428− };
429− };
430− }
431−
432−## How to override package versions in a compiler-specific package set
433−
434−Nixpkgs provides the latest version of
435−[`ghc-events`](http://hackage.haskell.org/package/ghc-events), which is 0.4.4.0
436−at the time of this writing. This is fine for users of GHC 7.10.x, but GHC
437−7.8.4 cannot compile that binary. Now, one way to solve that problem is to
438−register an older version of `ghc-events` in the 7.8.x-specific package set.
439−The first step is to generate Nix build instructions with `cabal2nix`:
440−
441− $ cabal2nix cabal://ghc-events-0.4.3.0 >~/.nixpkgs/ghc-events-0.4.3.0.nix
442−
443−Then add the override in `~/.nixpkgs/config.nix`:
444−
445− {
446− packageOverrides = super: let self = super.pkgs; in
447− {
448− haskell = super.haskell // {
449− packages = super.haskell.packages // {
450− ghc784 = super.haskell.packages.ghc784.override {
451− overrides = self: super: {
452− ghc-events = self.callPackage ./ghc-events-0.4.3.0.nix {};
453− };
454− };
455− };
456− };
457− };
458− }
459−
460−This code is a little crazy, no doubt, but it's necessary because the intuitive
461−version
462−
463− haskell.packages.ghc784 = super.haskell.packages.ghc784.override {
464− overrides = self: super: {
465− ghc-events = self.callPackage ./ghc-events-0.4.3.0.nix {};
466− };
467− };
468−
469−doesn't do what we want it to: that code replaces the `haskell` package set in
470−Nixpkgs with one that contains only one entry,`packages`, which contains only
471−one entry `ghc784`. This override loses the `haskell.compiler` set, and it
472−loses the `haskell.packages.ghcXYZ` sets for all compilers but GHC 7.8.4. To
473−avoid that problem, we have to perform the convoluted little dance from above,
474−iterating over each step in hierarchy.
475−
476−Once it's accomplished, however, we can install a variant of `ghc-events`
477−that's compiled with GHC 7.8.4:
478−
479− nix-env -f "<nixpkgs>" -iA haskell.packages.ghc784.ghc-events
480−
481−Unfortunately, it turns out that this build fails again while executing the
482−test suite! Apparently, the release archive on Hackage is missing some data
483−files that the test suite requires, so we cannot run it. We accomplish that by
484−re-generating the Nix expression with the `--no-check` flag:
485−
486− $ cabal2nix --no-check cabal://ghc-events-0.4.3.0 >~/.nixpkgs/ghc-events-0.4.3.0.nix
487−
488−Now the builds succeeds.
489−
490−Of course, in the concrete example of `ghc-events` this whole exercise is not
491−an ideal solution, because `ghc-events` can analyze the output emitted by any
492−version of GHC later than 6.12 regardless of the compiler version that was used
493−to build the `ghc-events' executable, so strictly speaking there's no reason to
494−prefer one built with GHC 7.8.x in the first place. However, for users who
495−cannot use GHC 7.10.x at all for some reason, the approach of downgrading to an
496−older version might be useful.
497−
498−## How to recover from GHC's infamous non-deterministic library ID bug
499−
500−GHC and distributed build farms don't get along well:
501−
502− https://ghc.haskell.org/trac/ghc/ticket/4012
503−
504−When you see an error like this one
505−
506− package foo-0.7.1.0 is broken due to missing package
507− text-1.2.0.4-98506efb1b9ada233bb5c2b2db516d91
508−
509−then you have to download and re-install `foo` and all its dependents from
510−scratch:
511−
512− # nix-store -q --referrers /nix/store/*-haskell-text-1.2.0.4 \
513− | xargs -L 1 nix-store --repair-path --option binary-caches http://hydra.nixos.org
514−
515−If you're using additional Hydra servers other than `hydra.nixos.org`, then it
516−might be necessary to purge the local caches that store data from those
517−machines to disable these binary channels for the duration of the previous
518−command, i.e. by running:
519−
520− rm /nix/var/nix/binary-cache-v3.sqlite
521− rm /nix/var/nix/manifests/*
522− rm /nix/var/nix/channel-cache/*
523−
524−## Builds on Darwin fail with `math.h` not found
525−
526−Users of GHC on Darwin have occasionally reported that builds fail, because the
527−compiler complains about a missing include file:
528−
529− fatal error: 'math.h' file not found
530−
531−The issue has been discussed at length in [ticket
532−6390](https://github.com/NixOS/nixpkgs/issues/6390), and so far no good
533−solution has been proposed. As a work-around, users who run into this problem
534−can configure the environment variables
535−
536− export NIX_CFLAGS_COMPILE="-idirafter /usr/include"
537− export NIX_CFLAGS_LINK="-L/usr/lib"
538−
539−in their `~/.bashrc` file to avoid the compiler error.
540−
541−# Other resources
542−
543−- The Youtube video [Nix Loves Haskell](https://www.youtube.com/watch?v=BsBhi_r-OeE)
544− provides an introduction into Haskell NG aimed at beginners. The slides are
545− available at http://cryp.to/nixos-meetup-3-slides.pdf and also -- in a form
546− ready for cut & paste -- at
547− https://github.com/NixOS/cabal2nix/blob/master/doc/nixos-meetup-3-slides.md.
548−
549−- Another Youtube video is [Escaping Cabal Hell with Nix](https://www.youtube.com/watch?v=mQd3s57n_2Y),
550− which discusses the subject of Haskell development with Nix but also provides
551− a basic introduction to Nix as well, i.e. it's suitable for viewers with
552− almost no prior Nix experience.
553−
554−- Oliver Charles wrote a very nice [Tutorial how to develop Haskell packages with Nix](http://wiki.ocharles.org.uk/Nix).
555−
556−- The *Journey into the Haskell NG infrastructure* series of postings
557− describe the new Haskell infrastructure in great detail:
558−
559− - [Part 1](http://lists.science.uu.nl/pipermail/nix-dev/2015-January/015591.html)
560− explains the differences between the old and the new code and gives
561− instructions how to migrate to the new setup.
562−
563− - [Part 2](http://lists.science.uu.nl/pipermail/nix-dev/2015-January/015608.html)
564− looks in-depth at how to tweak and configure your setup by means of
565− overrides.
566−
567− - [Part 3](http://lists.science.uu.nl/pipermail/nix-dev/2015-April/016912.html)
568− describes the infrastructure that keeps the Haskell package set in Nixpkgs
569− uptodate.
hackage2nix/HackageGit.hsnew file+71
@@ -0,0 +1,71 @@
1+{-# LANGUAGE OverloadedStrings #-}
2+{-# LANGUAGE TemplateHaskell #-}
3+
4+module HackageGit
5+ ( Hackage, readHackage, readPackage, readPackageMeta
6+ , SHA256Hash, hashes
7+ )
8+ where
9+
10+import Control.Lens hiding ( (<.>) )
11+import Control.Monad
12+import Data.Aeson
13+import qualified Data.ByteString.Char8 as BS
14+import Data.Map as Map
15+import Data.Set as Set
16+import Data.String
17+import Distribution.Nixpkgs.Hashes
18+import Distribution.Nixpkgs.Haskell.OrphanInstances ( )
19+import Distribution.Package
20+import Distribution.PackageDescription
21+import Distribution.PackageDescription.Parsec ( parseGenericPackageDescriptionMaybe )
22+import Distribution.Text
23+import Distribution.Version
24+import OpenSSL.Digest ( digest, digestByName )
25+import System.Directory
26+import System.FilePath
27+
28+type Hackage = Map PackageName (Set Version)
29+
30+readHackage :: FilePath -> IO Hackage
31+readHackage path = getSubDirs path >>= foldM discoverPackageVersions mempty
32+ where
33+ discoverPackageVersions :: Hackage -> String -> IO Hackage
34+ discoverPackageVersions db pkg = do
35+ vs <- getSubDirs (path </> pkg)
36+ return (Map.insert (mkPackageName pkg) (Set.fromList (Prelude.map fromString vs)) db)
37+
38+getSubDirs :: FilePath -> IO [FilePath]
39+getSubDirs path = do
40+ let isDirectory p = doesDirectoryExist (path </> p)
41+ getDirectoryContents path >>= filterM isDirectory . Prelude.filter (\x -> head x /= '.')
42+
43+type SHA256Hash = String
44+
45+readPackage :: FilePath -> PackageIdentifier -> IO (GenericPackageDescription, SHA256Hash)
46+readPackage dirPrefix (PackageIdentifier name version) = do
47+ let cabalFile = dirPrefix </> unPackageName name </> display version </> unPackageName name <.> "cabal"
48+ buf <- BS.readFile cabalFile
49+ cabal <- case parseGenericPackageDescriptionMaybe buf of
50+ Just a -> return a
51+ Nothing -> fail ("cannot parse cabal file " ++ cabalFile)
52+ return (cabal, printSHA256 (digest (digestByName "sha256") buf))
53+
54+declareLenses [d|
55+ data Meta = Meta { hashes :: Map String String
56+ }
57+ deriving (Show)
58+ |]
59+
60+instance FromJSON Meta where
61+ parseJSON (Object v) = Meta
62+ <$> v .: "package-hashes"
63+ parseJSON o = fail ("invalid Cabal metadata: " ++ show o)
64+
65+readPackageMeta :: FilePath -> PackageIdentifier -> IO Meta
66+readPackageMeta dirPrefix (PackageIdentifier name version) = do
67+ let metaFile = dirPrefix </> unPackageName name </> display version </> unPackageName name <.> "json"
68+ buf <- BS.readFile metaFile
69+ case eitherDecodeStrict buf of
70+ Left msg -> fail (metaFile ++ ": " ++ msg)
71+ Right x -> return $ over (hashes . ix "SHA256") (printSHA256 . packHex) x
hackage2nix/Main.hs+150−128
@@ -3,186 +3,188 @@
33
44module Main ( main ) where
55
6−import Distribution.Nixpkgs.Haskell.FromCabal ( fromGenericPackageDescription )
7−import Distribution.Nixpkgs.Haskell.FromCabal.Flags
8−import Distribution.Nixpkgs.Haskell.HackageGit ( readHackage, Hackage )
9−import Distribution.Nixpkgs.Haskell.Constraint
10−import Distribution.Nixpkgs.Haskell.FromCabal.Configuration.GHC7102
11−import Internal.HaskellPackage
6+import HackageGit
7+
8+import Control.Lens
129import Control.Monad
1310import Control.Monad.Par.Combinator
1411import Control.Monad.Par.IO
1512import Control.Monad.Trans ( liftIO )
16−import Data.Function
17−import Data.List
13+import Data.List ( intercalate )
1814import Data.Map.Strict ( Map )
1915import qualified Data.Map.Strict as Map
2016import Data.Maybe
21−import Data.Monoid
2217import Data.Set ( Set )
2318import qualified Data.Set as Set
19+import Data.String
2420import Distribution.Nixpkgs.Fetch
25−import Distribution.Nixpkgs.Haskell
21+import Distribution.Nixpkgs.Haskell as Derivation
22+import Distribution.Nixpkgs.Haskell.Constraint
23+import Distribution.Nixpkgs.Haskell.FromCabal
24+import Distribution.Nixpkgs.Haskell.FromCabal.Configuration as Config
25+import Distribution.Nixpkgs.Haskell.FromCabal.Flags
26+import Distribution.Nixpkgs.Haskell.OrphanInstances ( )
2627import Distribution.Nixpkgs.Meta
2728import Distribution.Nixpkgs.PackageMap
28−import Distribution.PackageDescription hiding ( options, buildDepends, extraLibs, buildTools )
29−import Distribution.Text
3029import Distribution.Package
30+import Distribution.PackageDescription hiding ( options, extraLibs, buildTools, homepage )
31+import Distribution.System
32+import Distribution.Text
3133import Distribution.Version
32−import Internal.Lens
33−import Internal.PrettyPrinting hiding ( attr, (<>) )
34−import Paths_cabal2nix
3534import Language.Nix
3635import Options.Applicative
36+import qualified Paths_cabal2nix as Main
3737import System.FilePath
38+import System.IO
39+import Text.PrettyPrint.HughesPJClass hiding ( (<>) )
3840
39−defaultConfiguration :: Configuration
40−defaultConfiguration = ghc7102
41+type PackageSet = Map PackageName Version
42+type PackageMultiSet = Map PackageName (Set Version)
4143
42−type Nixpkgs = PackageMap -- Map String (Set [String])
43−type PackageSet = Map String Version
44−type PackageMultiSet = Map String (Set Version)
45−
46−resolveConstraint :: Constraint -> Hackage -> Version
47−resolveConstraint c = fromMaybe (error msg) . resolveConstraint' c
48− where msg = "constraint " ++ display c ++ " cannot be resolved in Hackage"
49−
50−resolveConstraint' :: Constraint -> Hackage -> Maybe Version
51−resolveConstraint' (Dependency (PackageName name) vrange) hackage =
52− Set.findMax . Set.filter (`withinRange` vrange) . Map.keysSet <$> Map.lookup name hackage
53−
54−data Options = Options
44+data CLI = CLI
5545 { hackageRepository :: FilePath
5646 , preferredVersionsFile :: Maybe FilePath
5747 , nixpkgsRepository :: FilePath
48+ , configFile :: FilePath
49+ , targetPlatform :: Platform
5850 }
5951 deriving (Show)
6052
61−options :: Parser Options
62−options = Options
63− <$> strOption (long "hackage" <> help "path to Hackage git repository" <> value "hackage" <> showDefault <> metavar "PATH")
64− <*> optional (strOption (long "preferred-versions" <> help "path to Hackage preferred-versions file" <> value "hackage/preferred-versions" <> showDefault <> metavar "PATH"))
65− <*> strOption (long "nixpkgs" <> help "path to Nixpkgs repository" <> value "<nixpkgs>" <> showDefault <> metavar "PATH")
66−
67−pinfo :: ParserInfo Options
68−pinfo = info
69− ( helper
70− <*> infoOption ("hackage2nix " ++ display version) (long "version" <> help "Show version number")
71− <*> options
72− )
73− ( fullDesc
74− <> header "hackage2nix converts a Hackage database into a haskell-packages.nix file."
75− )
76−
7753main :: IO ()
7854main = do
79− Options {..} <- execParser pinfo
80−
81− hackage <- readHackage hackageRepository
82− nixpkgs <- readNixpkgPackageMap nixpkgsRepository Nothing
55+ let cliOptions :: Parser CLI
56+ cliOptions = CLI
57+ <$> strOption (long "hackage" <> help "path to Hackage git repository" <> value "hackage" <> showDefaultWith id <> metavar "PATH")
58+ <*> optional (strOption (long "preferred-versions" <> help "path to Hackage preferred-versions file" <> value "hackage/preferred-versions" <> showDefault <> metavar "PATH"))
59+ <*> strOption (long "nixpkgs" <> help "path to Nixpkgs repository" <> value "nixpkgs" <> showDefaultWith id <> metavar "PATH")
60+ <*> strOption (long "config" <> help "path to configuration file inside of Nixpkgs" <> value "pkgs/development/haskell-modules/configuration-hackage2nix.yaml" <> showDefaultWith id <> metavar "PATH")
61+ <*> option (fmap fromString str) (long "platform" <> help "target platform to generate package set for" <> value "x86_64-linux" <> showDefaultWith display <> metavar "PLATFORM")
62+
63+ pinfo :: ParserInfo CLI
64+ pinfo = info
65+ ( helper
66+ <*> infoOption ("hackage2nix " ++ prettyShow Main.version) (long "version" <> help "Show version number")
67+ <*> cliOptions
68+ )
69+ ( fullDesc
70+ <> header "hackage2nix converts a Hackage database into a hackage-packages.nix file."
71+ )
72+ CLI {..} <- execParser pinfo
73+
74+ config <- readConfiguration (nixpkgsRepository </> configFile)
75+ nixpkgs <- readNixpkgPackageMap ["-f", nixpkgsRepository, "--arg", "config", "{ allowAliases = false; }"]
8376 preferredVersions <- readPreferredVersions (fromMaybe (hackageRepository </> "preferred-versions") preferredVersionsFile)
8477 let fixup = Map.delete "acme-everything" -- TODO: https://github.com/NixOS/cabal2nix/issues/164
8578 . Map.delete "som" -- TODO: https://github.com/NixOS/cabal2nix/issues/164
8679 . Map.delete "type" -- TODO: https://github.com/NixOS/cabal2nix/issues/163
87− . Map.delete "dictionary-sharing" -- TODO: https://github.com/NixOS/cabal2nix/issues/175
88− . Map.filter (/= Map.empty)
89− . Map.mapWithKey (enforcePreferredVersions preferredVersions)
90− runParIO $ generatePackageSet defaultConfiguration (fixup hackage) nixpkgs
91−
92−enforcePreferredVersions :: [Constraint] -> String -> Map Version GenericPackageDescription
93− -> Map Version GenericPackageDescription
94−enforcePreferredVersions cs pkg = Map.filterWithKey (\v _ -> PackageIdentifier (PackageName pkg) v `satisfiesConstraints` cs)
95−
96−generatePackageSet :: Configuration -> Hackage -> Nixpkgs -> ParIO ()
97−generatePackageSet config hackage nixpkgs = do
80+ . Map.delete "control-invariants" -- TODO: depends on "assert"
81+ . Map.delete "with" -- TODO: https://github.com/NixOS/cabal2nix/issues/164
82+ . Map.delete "telega" -- TODO: depends on "with"
83+ . over (at "hermes") (fmap (set (contains "1.3.4.3") False)) -- TODO: https://github.com/haskell/hackage-server/issues/436
84+ hackage <- fixup <$> readHackage hackageRepository
9885 let
99− corePackageSet :: PackageSet
100− corePackageSet = Map.fromList [ (name, v) | PackageIdentifier (PackageName name) v <- corePackages config ++ hardCorePackages config ]
86+ hackagePackagesFile :: FilePath
87+ hackagePackagesFile = nixpkgsRepository </> "pkgs/development/haskell-modules/hackage-packages.nix"
10188
102− latestVersionSet :: PackageSet
103− latestVersionSet = Map.map (Set.findMax . Map.keysSet) hackage
89+ corePackageSet :: PackageSet
90+ corePackageSet = Map.fromList [ (name, v) | PackageIdentifier name v <- Set.toList (Config.corePackages config) ]
10491
105− defaultPackageOverridesSet :: PackageSet
106− defaultPackageOverridesSet = Map.fromList [ (name, resolveConstraint c hackage) | c@(Dependency (PackageName name) _) <- defaultPackageOverrides config ]
92+ latestVersionSet :: PackageSet
93+ latestVersionSet = Map.map Set.findMax (Map.filter (not . Set.null) (Map.mapWithKey (enforcePreferredVersions preferredVersions) hackage))
10794
108− generatedDefaultPackageSet :: PackageSet
109− generatedDefaultPackageSet = (defaultPackageOverridesSet `Map.union` latestVersionSet) `Map.difference` corePackageSet
95+ defaultPackageOverridesSet :: PackageSet
96+ defaultPackageOverridesSet = Map.fromList [ (name, resolveConstraint c hackage) | c@(Dependency name _ _) <- defaultPackageOverrides config ]
11097
111− latestCorePackageSet :: PackageSet
112− latestCorePackageSet = latestVersionSet `Map.intersection` corePackageSet
98+ generatedDefaultPackageSet :: PackageSet
99+ generatedDefaultPackageSet = (defaultPackageOverridesSet `Map.union` latestVersionSet) `Map.difference` corePackageSet
113100
114− latestOverridePackageSet :: PackageSet
115− latestOverridePackageSet = latestVersionSet `Map.intersection` defaultPackageOverridesSet
101+ latestCorePackageSet :: PackageSet
102+ latestCorePackageSet = latestVersionSet `Map.intersection` corePackageSet
116103
117− extraPackageSet :: PackageMultiSet
118− extraPackageSet = Map.unionsWith Set.union
119− [ Map.singleton name (Set.singleton (resolveConstraint c hackage)) | c@(Dependency (PackageName name) _) <- extraPackages config ]
104+ latestOverridePackageSet :: PackageSet
105+ latestOverridePackageSet = latestVersionSet `Map.intersection` defaultPackageOverridesSet
120106
121− db :: PackageMultiSet
122− db = Map.unionsWith Set.union [ Map.map Set.singleton generatedDefaultPackageSet
123− , Map.map Set.singleton latestCorePackageSet
124− , Map.map Set.singleton latestOverridePackageSet
125− , extraPackageSet
126− ]
107+ extraPackageSet :: PackageMultiSet
108+ extraPackageSet = Map.unionsWith Set.union
109+ [ Map.singleton name (Set.singleton (resolveConstraint c hackage)) | c@(Dependency name _ _) <- extraPackages config ]
127110
128− haskellResolver :: Dependency -> Bool
129− haskellResolver (Dependency (PackageName name) vrange)
130− | Just v <- Map.lookup name corePackageSet = v `withinRange` vrange
131− | Just v <- Map.lookup name generatedDefaultPackageSet = v `withinRange` vrange
132− | otherwise = False
111+ db :: PackageMultiSet
112+ db = Map.unionsWith Set.union [ Map.map Set.singleton generatedDefaultPackageSet
113+ , Map.map Set.singleton latestCorePackageSet
114+ , Map.map Set.singleton latestOverridePackageSet
115+ , extraPackageSet
116+ ]
133117
134− nixpkgsResolver :: Identifier -> Maybe Binding
135− nixpkgsResolver = resolve (Map.map (Set.map (over path ("pkgs":))) nixpkgs)
118+ haskellResolver :: Dependency -> Bool
119+ haskellResolver (Dependency name vrange _)
120+ | Just v <- Map.lookup name corePackageSet = v `withinRange` vrange
121+ | Just v <- Map.lookup name generatedDefaultPackageSet = v `withinRange` vrange
122+ | otherwise = False
136123
137− liftIO $ do putStrLn "/* hackage-packages.nix is an auto-generated file -- DO NOT EDIT! */"
138− putStrLn ""
139− putStrLn "{ pkgs, stdenv, callPackage }:"
140− putStrLn ""
141− putStrLn "self: {"
142− putStrLn ""
143− pkgs <- flip parMapM (Map.toAscList db) $ \(name, vs) -> do
144− defs <- forM (Set.toAscList vs) $ \pkgversion -> do
145− let -- TODO: Include list of broken dependencies in the generated output.
146− descr = hackage Map.! name Map.! pkgversion
124+ nixpkgsResolver :: Identifier -> Maybe Binding
125+ nixpkgsResolver = resolve (Map.map (Set.map (over path ("pkgs":))) nixpkgs)
147126
148− flagAssignment :: FlagAssignment
149− flagAssignment = configureCabalFlags (packageId descr)
127+ globalPackageMaintainers :: Map PackageName (Set Identifier)
128+ globalPackageMaintainers = Map.unionsWith Set.union [ Map.singleton p (Set.singleton m) | (m,ps) <- Map.toList (packageMaintainers config), p <- Set.toList ps ]
150129
151− drv' :: Derivation
152− drv' = fromGenericPackageDescription haskellResolver nixpkgsResolver (platform ghc7102) (compilerInfo ghc7102) flagAssignment [] descr
130+ pkgs <- runParIO $ flip parMapM (Map.toAscList db) $ \(name, vs) -> do
131+ defs <- forM (Set.toAscList vs) $ \v -> liftIO $ do
132+ let pkgId :: PackageIdentifier
133+ pkgId = PackageIdentifier name v
153134
154− attr :: String
155− attr | Just v <- Map.lookup name generatedDefaultPackageSet, v == pkgversion = name
156− | otherwise = name ++ '_' : [ if c == '.' then '_' else c | c <- display pkgversion ]
135+ (descr, cabalSHA256) <- readPackage hackageRepository pkgId
136+ meta <- readPackageMeta hackageRepository pkgId
157137
158− sha256 :: String
159− sha256 | Just x <- lookup "X-Package-SHA256" (customFieldsPD (packageDescription descr)) = x
160− | otherwise = error $ display (packageId descr) ++ " has no hash"
138+ let isInDefaultPackageSet, isHydraEnabled, isBroken :: Bool
139+ isInDefaultPackageSet = (== Just v) (Map.lookup name generatedDefaultPackageSet)
140+ isHydraEnabled = isInDefaultPackageSet && not (isBroken || name `Set.member` dontDistributePackages config)
141+ isBroken = any (withinRange v) [ vr | Dependency pn vr _ <- brokenPackages config, pn == name ]
161142
162− srcSpec <- liftIO $ sourceFromHackage (Certain sha256) (name ++ "-" ++ display pkgversion)
143+ droppedPlatforms :: Set Platform
144+ droppedPlatforms = Map.findWithDefault mempty name (unsupportedPlatforms config)
163145
164− let drv = drv' & src .~ srcSpec
165− & metaSection.hydraPlatforms .~ (if PackageName name `Set.member` dontDistributePackages config
166− then Set.singleton "stdenv.lib.platforms.none"
167− else drv'^.metaSection.hydraPlatforms)
168− & metaSection.maintainers .~ fromMaybe Set.empty (Map.lookup (PackageName name) (packageMaintainers config))
146+ tarballSHA256 :: SHA256Hash
147+ tarballSHA256 = fromMaybe (error (display pkgId ++ ": meta data has no hash for the tarball"))
148+ (view (hashes . at "SHA256") meta)
169149
150+ flagAssignment :: FlagAssignment -- We don't use the flags from Stackage Nightly here, because
151+ flagAssignment = configureCabalFlags pkgId -- they are chosen specifically for GHC 7.10.2.
170152
171−
172− isFromHackage :: Binding -> Bool
173− isFromHackage b = case view (reference . path) b of
174− ["self",_] -> True
175− _ -> False
153+ attr :: String
154+ attr = if isInDefaultPackageSet then unPackageName name else mangle pkgId
155+
156+ drv :: Derivation
157+ drv = fromGenericPackageDescription haskellResolver nixpkgsResolver targetPlatform (compilerInfo config) flagAssignment [] descr
158+ & src .~ urlDerivationSource ("mirror://hackage/" ++ display pkgId ++ ".tar.gz") tarballSHA256
159+ & editedCabalFile .~ cabalSHA256
160+ & metaSection.platforms %~ (`Set.difference` Map.findWithDefault Set.empty name (unsupportedPlatforms config))
161+ & metaSection.hydraPlatforms %~ (if Set.null droppedPlatforms then id else (`Set.difference` droppedPlatforms))
162+ & metaSection.hydraPlatforms %~ (if isHydraEnabled then id else const Set.empty)
163+ & metaSection.broken ||~ isBroken
164+ & metaSection.maintainers .~ Map.findWithDefault Set.empty name globalPackageMaintainers
165+ & metaSection.homepage .~ ""
176166
177167 overrides :: Doc
178− overrides = fcat $ punctuate space
179− [ pPrint b | b <- Set.toList (view (dependencies . each) drv), not (isFromHackage b) ]
180−
181− return $ nest 2 $ hang (string attr <+> equals <+> text "callPackage") 2 (parens (pPrint drv)) <+> (braces overrides <> semi)
182− return (intercalate "\n\n" (map render defs))
183−
184− liftIO $ mapM_ (\pkg -> putStrLn pkg >> putStrLn "") pkgs
185− liftIO $ putStrLn "}"
168+ overrides = fcat $ punctuate space [ pPrint b <> semi | b <- Set.toList (view (dependencies . each) drv `Set.union` view extraFunctionArgs drv), not (isFromHackage b) ]
169+ return $ render $ nest 2 $
170+ hang (doubleQuotes (text attr) <+> equals <+> text "callPackage") 2 (parens (pPrint drv)) <+> (braces overrides <> semi)
171+
172+ return (intercalate "\n\n" defs)
173+
174+ withFile hackagePackagesFile WriteMode $ \h -> do
175+ hPutStrLn h "/* hackage-packages.nix is an auto-generated file -- DO NOT EDIT! */"
176+ hPutStrLn h ""
177+ hPutStrLn h "{ pkgs, stdenv, callPackage }:"
178+ hPutStrLn h ""
179+ hPutStrLn h "self: {"
180+ hPutStrLn h ""
181+ mapM_ (\pkg -> hPutStrLn h pkg >> hPutStrLn h "") pkgs
182+ hPutStrLn h "}"
183+
184+isFromHackage :: Binding -> Bool
185+isFromHackage b = case view (reference . path) b of
186+ ["self",_] -> True
187+ _ -> False
186188
187189readPreferredVersions :: FilePath -> IO [Constraint]
188190readPreferredVersions p = mapMaybe parsePreferredVersionsLine . lines <$> readFile p
@@ -191,3 +193,23 @@ parsePreferredVersionsLine :: String -> Maybe Constraint
191193parsePreferredVersionsLine [] = Nothing
192194parsePreferredVersionsLine ('-':'-':_) = Nothing
193195parsePreferredVersionsLine l = simpleParse l `mplus` error ("invalid preferred-versions line: " ++ show l)
196+
197+enforcePreferredVersions :: [Constraint] -> PackageName -> Set Version -> Set Version
198+enforcePreferredVersions cs pkg = Set.filter (\v -> PackageIdentifier pkg v `satisfiesConstraints` cs)
199+
200+resolveConstraint :: Constraint -> Hackage -> Version
201+resolveConstraint c = fromMaybe (error msg) . resolveConstraint' c
202+ where msg = unlines [ "constraint " ++ display c ++ " cannot be resolved in Hackage"
203+ , "This could be due the package being missing in the hackage directory"
204+ , "or the file system not being case sensitive."
205+ ]
206+
207+resolveConstraint' :: Constraint -> Hackage -> Maybe Version
208+resolveConstraint' (Dependency name vrange _) hackage
209+ | Just vset' <- Map.lookup name hackage
210+ , vset <- Set.filter (`withinRange` vrange) vset'
211+ , not (Set.null vset) = Just (Set.findMax vset)
212+ | otherwise = Nothing
213+
214+mangle :: PackageIdentifier -> String
215+mangle (PackageIdentifier name v) = unPackageName name ++ '_' : [ if c == '.' then '_' else c | c <- display v ]
hackage2nix/README.mdnew file+36
@@ -0,0 +1,36 @@
1+# Hackage2nix
2+
3+This tool is used to update the `hackage-packages.nix` file in the nixpkgs repo.
4+Most of the time we will not need run this manually (since it is run automatically
5+on the upstream nixpkgs). The cases when we would need to run this manually are:
6+
7+* We have changed hackage2nix in some way and we want to check that it
8+behaves correctly.
9+
10+* We have a fork of nixpkgs where we have added or changed
11+the name or location in nixpkgs of a native package used by a hackage package
12+and we want to check that hackage-packages.nix will be updated correctly.
13+
14+**Important:** this must be run on a **case sensitive file system**.
15+On macOS you can use [this](https://gist.github.com/dixson3/8360571) to create one
16+(you can replace 60g with 4g as that should be plenty).
17+
18+There is a [video on YouTube](https://www.youtube.com/watch?v=qX0mgtSm360)
19+that gives a thorough walk-through of these steps.
20+
21+#### Setup
22+Replace `git@github.com:NixOS/nixpkgs.git` with a fork you have access to.
23+```
24+git clone git@github.com:NixOS/cabal2nix.git
25+cd cabal2nix
26+git clone git@github.com:NixOS/nixpkgs.git
27+git clone git@github.com:commercialhaskell/all-cabal-hashes.git --branch hackage hackage
28+cabal install
29+```
30+
31+#### Running Hackage2nix
32+Runs hackage2nix and pushes a commit with the updated `hackage-packages.nix`
33+file to your fork of `nixpkgs`.
34+```
35+./update-nixpkgs.sh
36+```
package.yamldeleted−91
@@ -1,91 +0,0 @@
1−name: cabal2nix
2−version: 2015.8.29
3−synopsis: Convert Cabal files into Nix build instructions.
4−description: Convert Cabal files into Nix build instructions.
5−maintainer: Peter Simons <simons@cryp.to>
6−license: BSD3
7−github: nixos/cabal2nix
8−category: Distribution
9−
10−ghc-options: -Wall
11−
12−dependencies:
13− - base < 5
14− - Cabal >= 1.22.2
15− - SHA
16− - aeson
17− - ansi-wl-pprint
18− - base < 5
19− - bytestring
20− - containers
21− - data-default
22− - deepseq
23− - deepseq-generics
24− - directory
25− - doctest
26− - filepath
27− - hackage-db
28− - hspec
29− - lens
30− - monad-par
31− - monad-par-extras
32− - mtl
33− - optparse-applicative
34− - pretty >= 1.1.2
35− - process
36− - regex-posix
37− - split
38− - transformers
39− - utf8-string
40−
41−library:
42− source-dirs: src
43− exposed-modules:
44− - Distribution.Nixpkgs.Fetch
45− - Distribution.Nixpkgs.Haskell
46− - Distribution.Nixpkgs.Haskell.BuildInfo
47− - Distribution.Nixpkgs.Haskell.Constraint
48− - Distribution.Nixpkgs.Haskell.Derivation
49− - Distribution.Nixpkgs.Haskell.FromCabal
50− - Distribution.Nixpkgs.Haskell.FromCabal.Configuration
51− - Distribution.Nixpkgs.Haskell.FromCabal.Configuration.GHC7102
52− - Distribution.Nixpkgs.Haskell.FromCabal.Configuration.Maintainers
53− - Distribution.Nixpkgs.Haskell.FromCabal.Flags
54− - Distribution.Nixpkgs.Haskell.FromCabal.License
55− - Distribution.Nixpkgs.Haskell.FromCabal.Name
56− - Distribution.Nixpkgs.Haskell.FromCabal.Normalize
57− - Distribution.Nixpkgs.Haskell.FromCabal.PostProcess
58− - Distribution.Nixpkgs.Haskell.Hackage
59− - Distribution.Nixpkgs.Haskell.HackageGit
60− - Distribution.Nixpkgs.Haskell.OrphanInstances
61− - Distribution.Nixpkgs.License
62− - Distribution.Nixpkgs.Meta
63− - Distribution.Nixpkgs.PackageMap
64− - Internal.HaskellPackage
65− - Internal.Lens
66− - Internal.PrettyPrinting
67− - Language.Nix
68− - Language.Nix.Binding
69− - Language.Nix.Identifier
70− - Language.Nix.Path
71−
72−executables:
73− cabal2nix:
74− main: Main.hs
75− source-dirs: cabal2nix
76− dependencies: cabal2nix
77−
78− hackage2nix:
79− main: Main.hs
80− source-dirs: hackage2nix
81− dependencies: cabal2nix
82− ghc-options:
83− - -threaded
84− - -rtsopts
85− - -with-rtsopts=-N
86−
87−tests:
88− spec:
89− main: Main.hs
90− source-dirs: test
91− dependencies: cabal2nix
release.nixdeleted−48
@@ -1,48 +0,0 @@
1−/* Build instructions for the continuous integration system Hydra. */
2−
3−{ cabal2nixSrc ? { outPath = ./.; revCount = 0; gitTag = "dirty"; }
4−, releaseBuild ? false
5−, supportedPlatforms ? ["x86_64-linux"] ++ (if releaseBuild then ["i686-linux" "x86_64-darwin"] else [])
6−, supportedCompilers ? ["ghc7102"]
7−}:
8−
9−let
10− genAttrs = (import <nixpkgs> { }).lib.genAttrs;
11−in
12−{
13− cabal2nix = genAttrs supportedCompilers (ghcVer: genAttrs supportedPlatforms (system:
14− let
15− pkgs = import <nixpkgs> { inherit system; };
16− haskellPackages = pkgs.lib.getAttrFromPath ["haskell" "packages" ghcVer] pkgs;
17− in
18− haskellPackages.mkDerivation {
19− pname = "cabal2nix";
20− version = cabal2nixSrc.gitTag;
21− src = cabal2nixSrc;
22− isLibrary = true;
23− isExecutable = true;
24− libraryHaskellDepends = with haskellPackages; [
25− aeson ansi-wl-pprint base bytestring Cabal containers data-default
26− deepseq deepseq-generics directory doctest filepath hackage-db
27− hspec lens monad-par monad-par-extras mtl optparse-applicative
28− pretty process regex-posix SHA split transformers utf8-string
29− ];
30− executableHaskellDepends = with haskellPackages; [
31− aeson ansi-wl-pprint base bytestring Cabal containers data-default
32− deepseq deepseq-generics directory doctest filepath hackage-db
33− hspec lens monad-par monad-par-extras mtl optparse-applicative
34− pretty process regex-posix SHA split transformers utf8-string
35− ];
36− testHaskellDepends = with haskellPackages; [
37− aeson ansi-wl-pprint base bytestring Cabal containers data-default
38− deepseq deepseq-generics directory doctest filepath hackage-db
39− hspec lens monad-par monad-par-extras mtl optparse-applicative
40− pretty process regex-posix SHA split transformers utf8-string
41− ];
42− homepage = "https://github.com/nixos/cabal2nix#readme";
43− description = "Convert Cabal files into Nix build instructions";
44− license = pkgs.stdenv.lib.licenses.bsd3;
45− maintainers = [ pkgs.stdenv.lib.maintainers.simons ];
46− }
47− ));
48−}
src/Cabal2nix.hsnew file+276
@@ -0,0 +1,276 @@
1+{-# LANGUAGE LambdaCase #-}
2+{-# LANGUAGE OverloadedStrings #-}
3+{-# LANGUAGE RecordWildCards #-}
4+
5+module Cabal2nix
6+ ( main, cabal2nix, cabal2nix', cabal2nixWithDB, parseArgs
7+ , Options(..)
8+ )
9+ where
10+
11+import Control.Exception ( bracket )
12+import Control.Lens
13+import Control.Monad
14+import Data.List ( intercalate, isPrefixOf )
15+import Data.List.Split
16+import Data.Maybe ( fromMaybe, isJust, listToMaybe )
17+import qualified Data.Set as Set
18+import Data.String
19+import Data.Time
20+import Distribution.Compiler
21+import Distribution.Nixpkgs.Fetch
22+import Distribution.Nixpkgs.Haskell
23+import Distribution.Nixpkgs.Haskell.FromCabal
24+import Distribution.Nixpkgs.Haskell.FromCabal.Flags
25+import qualified Distribution.Nixpkgs.Haskell.FromCabal.PostProcess as PP (pkg)
26+import qualified Distribution.Nixpkgs.Haskell.Hackage as DB
27+import Distribution.Nixpkgs.Haskell.OrphanInstances ( )
28+import Distribution.Nixpkgs.Haskell.PackageSourceSpec
29+import Distribution.Nixpkgs.Meta
30+import Distribution.Package ( packageId )
31+import Distribution.PackageDescription ( mkFlagName, mkFlagAssignment, FlagAssignment )
32+import Distribution.Parsec as P
33+import Distribution.Simple.Utils ( lowercase )
34+import Distribution.System
35+import Language.Nix
36+import Options.Applicative
37+import Paths_cabal2nix ( version )
38+import System.Environment ( getArgs )
39+import System.IO ( hFlush, hPutStrLn, stdout, stderr )
40+import qualified Text.PrettyPrint.ANSI.Leijen as P2
41+import Text.PrettyPrint.HughesPJClass ( Doc, Pretty(..), text, vcat, hcat, semi, render, prettyShow )
42+
43+data Options = Options
44+ { optSha256 :: Maybe String
45+ , optMaintainer :: [String]
46+--, optPlatform :: [String] -- TODO: fix command line handling of platforms
47+ , optHaddock :: Bool
48+ , optHpack :: HpackUse
49+ , optDoCheck :: Bool
50+ , optJailbreak :: Bool
51+ , optDoBenchmark :: Bool
52+ , optRevision :: Maybe String
53+ , optHyperlinkSource :: Bool
54+ , optEnableLibraryProfiling :: Bool
55+ , optEnableExecutableProfiling :: Bool
56+ , optEnableProfiling :: Maybe Bool
57+ , optExtraArgs :: [String]
58+ , optHackageDb :: Maybe FilePath
59+ , optNixShellOutput :: Bool
60+ , optFlags :: [String]
61+ , optCompiler :: CompilerId
62+ , optSystem :: Platform
63+ , optSubpath :: Maybe FilePath
64+ , optHackageSnapshot :: Maybe UTCTime
65+ , optNixpkgsIdentifier :: NixpkgsResolver
66+ , optUrl :: String
67+ , optFetchSubmodules :: Bool
68+ }
69+
70+options :: Parser Options
71+options = Options
72+ <$> optional (strOption $ long "sha256" <> metavar "HASH" <> help "sha256 hash of source tarball")
73+ <*> many (strOption $ long "maintainer" <> metavar "MAINTAINER" <> help "maintainer of this package (may be specified multiple times)")
74+-- <*> many (strOption $ long "platform" <> metavar "PLATFORM" <> help "supported build platforms (may be specified multiple times)")
75+ <*> flag True False (long "no-haddock" <> help "don't run Haddock when building this package")
76+ <*>
77+ (
78+ flag' ForceHpack (long "hpack" <> help "run hpack before configuring this package (only non-hackage packages)")
79+ <|>
80+ flag' NoHpack (long "no-hpack" <> help "disable hpack run and use only cabal disregarding package.yaml existence")
81+ <|>
82+ pure PackageYamlHpack
83+ )
84+ <*> flag True False (long "no-check" <> help "don't run regression test suites of this package")
85+ <*> switch (long "jailbreak" <> help "disregard version restrictions on build inputs")
86+ <*> switch (long "benchmark" <> help "enable benchmarks for this package")
87+ <*> optional (strOption $ long "revision" <> help "revision to use when fetching from VCS")
88+ <*> flag True False (long "no-hyperlink-source" <> help "don't generate pretty-printed source code for the documentation")
89+ <*> switch (long "enable-library-profiling" <> help "enable library profiling in the generated build")
90+ <*> switch (long "enable-executable-profiling" <> help "enable executable profiling in the generated build")
91+ <*> optional (switch (long "enable-profiling" <> help "enable both library and executable profiling in the generated build"))
92+ <*> many (strOption $ long "extra-arguments" <> help "extra parameters required for the function body")
93+ <*> optional (strOption $ long "hackage-db" <> metavar "PATH" <> help "path to the local hackage db in tar format")
94+ <*> switch (long "shell" <> help "generate output suitable for nix-shell")
95+ <*> many (strOption $ short 'f' <> long "flag" <> help "Cabal flag (may be specified multiple times)")
96+ <*> option parseCabal (long "compiler" <> help "compiler to use when evaluating the Cabal file" <> value buildCompilerId <> showDefaultWith prettyShow)
97+ <*> option (maybeReader parsePlatform) (long "system" <> help "host system (in either short Nix format or full LLVM style) to use when evaluating the Cabal file" <> value buildPlatform <> showDefaultWith prettyShow)
98+ <*> optional (strOption $ long "subpath" <> metavar "PATH" <> help "Path to Cabal file's directory relative to the URI (default is root directory)")
99+ <*> optional (option utcTimeReader (long "hackage-snapshot" <> help "hackage snapshot time, ISO format"))
100+ <*> pure (\i -> Just (binding # (i, path # [ident # "pkgs", i])))
101+ <*> strArgument (metavar "URI")
102+ <*> flag True False (long "dont-fetch-submodules" <> help "do not fetch git submodules from git sources")
103+
104+-- | A parser for the date. Hackage updates happen maybe once or twice a month.
105+-- Example: parseTime defaultTimeLocale "%FT%T%QZ" "2017-11-20T12:18:35Z" :: Maybe UTCTime
106+utcTimeReader :: ReadM UTCTime
107+utcTimeReader = eitherReader $ \arg ->
108+ case parseTimeM True defaultTimeLocale "%FT%T%QZ" arg of
109+ Nothing -> Left $ "Cannot parse date, ISO format used ('2017-11-20T12:18:35Z'): " ++ arg
110+ Just utcTime -> Right utcTime
111+
112+parseCabal :: Parsec a => ReadM a
113+parseCabal = eitherReader eitherParsec
114+
115+-- | Replicate the normalization performed by GHC_CONVERT_CPU in GHC's aclocal.m4
116+-- since the output of that is what Cabal parses.
117+ghcConvertArch :: String -> String
118+ghcConvertArch arch = case arch of
119+ "i486" -> "i386"
120+ "i586" -> "i386"
121+ "i686" -> "i386"
122+ "amd64" -> "x86_64"
123+ _ -> fromMaybe arch $ listToMaybe
124+ [prefix | prefix <- archPrefixes, prefix `isPrefixOf` arch]
125+ where archPrefixes =
126+ [ "aarch64", "alpha", "arm", "hppa1_1", "hppa", "m68k", "mipseb"
127+ , "mipsel", "mips", "powerpc64le", "powerpc64", "powerpc", "s390x"
128+ , "sparc64", "sparc"
129+ ]
130+
131+-- | Replicate the normalization performed by GHC_CONVERT_OS in GHC's aclocal.m4
132+-- since the output of that is what Cabal parses.
133+ghcConvertOS :: String -> String
134+ghcConvertOS os = case os of
135+ "watchos" -> "ios"
136+ "tvos" -> "ios"
137+ "linux-android" -> "linux-android"
138+ "linux-androideabi" -> "linux-androideabi"
139+ _ | "linux-" `isPrefixOf` os -> "linux"
140+ _ -> fromMaybe os $ listToMaybe
141+ [prefix | prefix <- osPrefixes, prefix `isPrefixOf` os]
142+ where osPrefixes =
143+ [ "gnu", "openbsd", "aix", "darwin", "solaris2", "freebsd", "nto-qnx"]
144+
145+parseArch :: String -> Arch
146+parseArch = classifyArch Permissive . ghcConvertArch
147+
148+parseOS :: String -> OS
149+parseOS = classifyOS Permissive . ghcConvertOS
150+
151+parsePlatform :: String -> Maybe Platform
152+parsePlatform = parsePlatformParts . splitOn "-"
153+
154+parsePlatformParts :: [String] -> Maybe Platform
155+parsePlatformParts = \case
156+ [arch, os] ->
157+ Just $ Platform (parseArch arch) (parseOS os)
158+ (arch : _ : osParts) ->
159+ Just $ Platform (parseArch arch) $ parseOS $ intercalate "-" osParts
160+ _ -> Nothing
161+
162+pinfo :: ParserInfo Options
163+pinfo = info
164+ ( helper
165+ <*> infoOption ("cabal2nix " ++ prettyShow version) (long "version" <> help "Show version number")
166+ <*> options
167+ )
168+ ( fullDesc
169+ <> header "cabal2nix converts Cabal files into build instructions for Nix."
170+ <> progDescDoc (Just (P2.vcat
171+ [ P2.text ""
172+ , P2.text "Recognized URI schemes:"
173+ , P2.text ""
174+ , P2.text " cabal://pkgname-pkgversion download the specified package from Hackage"
175+ , P2.text " cabal://pkgname download latest version of this package from Hackage"
176+ , P2.text " file:///local/path load the Cabal file from the local disk"
177+ , P2.text " /local/path abbreviated version of file URI"
178+ , P2.text " <git/svn/bzr/hg URL> download the source from the specified repository"
179+ , P2.text ""
180+ , P2.fillSep (map P2.text (words ( "If the URI refers to a cabal file, information for building the package "
181+ ++ "will be retrieved from that file, but hackage will be used as a source "
182+ ++ "for the derivation. Otherwise, the supplied URI will be used to as the "
183+ ++ "source for the derivation and the information is taken from the cabal file "
184+ ++ "at the root of the downloaded source."
185+ )))
186+ ]))
187+ )
188+
189+main :: IO ()
190+main = bracket (return ()) (\() -> hFlush stdout >> hFlush stderr) $ \() ->
191+ cabal2nix =<< getArgs
192+
193+hpackOverrides :: Derivation -> Derivation
194+hpackOverrides = over phaseOverrides (++ "prePatch = \"hpack\";")
195+ . set (libraryDepends . tool . contains (PP.pkg "hpack")) True
196+
197+cabal2nix' :: Options -> IO (Either Doc Derivation)
198+cabal2nix' opts@Options{..} = do
199+ pkg <- getPackage optHpack optFetchSubmodules optHackageDb optHackageSnapshot $
200+ Source optUrl (fromMaybe "" optRevision) (maybe UnknownHash Guess optSha256) (fromMaybe "" optSubpath)
201+ processPackage opts pkg
202+
203+cabal2nixWithDB :: DB.HackageDB -> Options -> IO (Either Doc Derivation)
204+cabal2nixWithDB db opts@Options{..} = do
205+ when (isJust optHackageDb) $ hPutStrLn stderr "WARN: HackageDB provided directly; ignoring --hackage-db"
206+ when (isJust optHackageSnapshot) $ hPutStrLn stderr "WARN: HackageDB provided directly; ignoring --hackage-snapshot"
207+ pkg <- getPackage' optHpack optFetchSubmodules (return db) $
208+ Source optUrl (fromMaybe "" optRevision) (maybe UnknownHash Guess optSha256) (fromMaybe "" optSubpath)
209+ processPackage opts pkg
210+
211+processPackage :: Options -> Package -> IO (Either Doc Derivation)
212+processPackage Options{..} pkg = do
213+ let
214+ withHpackOverrides :: Derivation -> Derivation
215+ withHpackOverrides = if pkgRanHpack pkg then hpackOverrides else id
216+
217+ flags :: FlagAssignment
218+ flags = configureCabalFlags (packageId (pkgCabal pkg)) `mappend` readFlagList optFlags
219+
220+ deriv :: Derivation
221+ deriv = withHpackOverrides $ fromGenericPackageDescription (const True)
222+ optNixpkgsIdentifier
223+ optSystem
224+ (unknownCompilerInfo optCompiler NoAbiTag)
225+ flags
226+ []
227+ (pkgCabal pkg)
228+ & src .~ pkgSource pkg
229+ & subpath .~ fromMaybe "." optSubpath
230+ & runHaddock %~ (optHaddock &&)
231+ & jailbreak .~ optJailbreak
232+ & hyperlinkSource .~ optHyperlinkSource
233+ & enableLibraryProfiling .~ (fromMaybe False optEnableProfiling || optEnableLibraryProfiling)
234+ & enableExecutableProfiling .~ (fromMaybe False optEnableProfiling || optEnableExecutableProfiling)
235+ & metaSection.maintainers .~ Set.fromList (map (review ident) optMaintainer)
236+-- & metaSection.platforms .~ Set.fromList optPlatform
237+ & doCheck &&~ optDoCheck
238+ & doBenchmark ||~ optDoBenchmark
239+ & extraFunctionArgs %~ Set.union (Set.fromList ("inherit stdenv":map (fromString . ("inherit " ++)) optExtraArgs))
240+
241+ shell :: Doc
242+ shell = vcat
243+ [ text "{ nixpkgs ? import <nixpkgs> {}, compiler ? \"default\", doBenchmark ? false }:"
244+ , text ""
245+ , text "let"
246+ , text ""
247+ , text " inherit (nixpkgs) pkgs;"
248+ , text ""
249+ , hcat [ text " f = ", pPrint deriv, semi ]
250+ , text ""
251+ , text " haskellPackages = if compiler == \"default\""
252+ , text " then pkgs.haskellPackages"
253+ , text " else pkgs.haskell.packages.${compiler};"
254+ , text ""
255+ , text " variant = if doBenchmark then pkgs.haskell.lib.doBenchmark else pkgs.lib.id;"
256+ , text ""
257+ , text " drv = variant (haskellPackages.callPackage f {});"
258+ , text ""
259+ , text "in"
260+ , text ""
261+ , text " if pkgs.lib.inNixShell then drv.env else drv"
262+ ]
263+ pure $ if optNixShellOutput then Left shell else Right deriv
264+
265+cabal2nix :: [String] -> IO ()
266+cabal2nix = parseArgs >=> cabal2nix' >=> putStrLn . either render prettyShow
267+
268+parseArgs :: [String] -> IO Options
269+parseArgs = handleParseResult . execParserPure defaultPrefs pinfo
270+
271+-- Utils
272+
273+readFlagList :: [String] -> FlagAssignment
274+readFlagList = mkFlagAssignment . map tagWithValue
275+ where tagWithValue ('-':fname) = (mkFlagName (lowercase fname), False)
276+ tagWithValue fname = (mkFlagName (lowercase fname), True)
src/Distribution/Nixpkgs/Fetch.hs+72−39
@@ -2,20 +2,26 @@
22{-# LANGUAGE RecordWildCards #-}
33{-# LANGUAGE ScopedTypeVariables #-}
44{-# LANGUAGE DeriveGeneric #-}
5+
56module Distribution.Nixpkgs.Fetch
67 ( Source(..)
78 , Hash(..)
8− , DerivationSource(..), fromDerivationSource
9+ , DerivationSource(..), fromDerivationSource, urlDerivationSource
910 , fetch
1011 , fetchWith
1112 ) where
1213
1314import Control.Applicative
14−import Control.DeepSeq.Generics
15+import Control.DeepSeq
1516import Control.Monad
1617import Control.Monad.IO.Class
1718import Control.Monad.Trans.Maybe
19+import Data.Aeson
20+import qualified Data.ByteString.Lazy.Char8 as BS
21+import qualified Data.List as L
22+import Data.Maybe
1823import GHC.Generics ( Generic )
24+import Language.Nix.PrettyPrinting as PP
1925import System.Directory
2026import System.Environment
2127import System.Exit
@@ -28,14 +34,15 @@ data Source = Source
2834 , sourceRevision :: String -- ^ Revision to use. For protocols where this doesn't make sense (such as HTTP), this
2935 -- should be the empty string.
3036 , sourceHash :: Hash -- ^ The expected hash of the source, if available.
37+ , sourceCabalDir :: String -- ^ Directory where Cabal file is found.
3138 } deriving (Show, Eq, Ord, Generic)
3239
33−instance NFData Source where rnf = genericRnf
40+instance NFData Source
3441
3542data Hash = Certain String | Guess String | UnknownHash
3643 deriving (Show, Eq, Ord, Generic)
3744
38−instance NFData Hash where rnf = genericRnf
45+instance NFData Hash
3946
4047isUnknown :: Hash -> Bool
4148isUnknown UnknownHash = True
@@ -52,26 +59,57 @@ data DerivationSource = DerivationSource
5259 , derivUrl :: String -- ^ URL to fetch from.
5360 , derivRevision :: String -- ^ Revision to use. Leave empty if the fetcher doesn't support revisions.
5461 , derivHash :: String -- ^ The hash of the source.
62+ , derivSubmodule :: Maybe Bool -- ^ The fetchSubmodule setting (if any)
5563 }
5664 deriving (Show, Eq, Ord, Generic)
5765
58−instance NFData DerivationSource where rnf = genericRnf
66+instance NFData DerivationSource
67+
68+instance FromJSON DerivationSource where
69+ parseJSON (Object o) = DerivationSource (error "undefined DerivationSource.kind")
70+ <$> o .: "url"
71+ <*> o .: "rev"
72+ <*> o .: "sha256"
73+ <*> o .: "fetchSubmodules"
74+ parseJSON _ = error "invalid DerivationSource"
75+
76+instance PP.Pretty DerivationSource where
77+ pPrint DerivationSource {..} =
78+ let isHackagePackage = "mirror://hackage/" `L.isPrefixOf` derivUrl
79+ fetched = derivKind /= ""
80+ in if isHackagePackage then attr "sha256" $ string derivHash
81+ else if not fetched then attr "src" $ text derivUrl
82+ else vcat
83+ [ text "src" <+> equals <+> text ("fetch" ++ derivKind) <+> lbrace
84+ , nest 2 $ vcat
85+ [ attr "url" $ string derivUrl
86+ , attr "sha256" $ string derivHash
87+ , if derivRevision /= "" then attr "rev" (string derivRevision) else PP.empty
88+ , boolattr "fetchSubmodules" (isJust derivSubmodule) (fromJust derivSubmodule)
89+ ]
90+ , rbrace PP.<> semi
91+ ]
92+
93+
94+urlDerivationSource :: String -> String -> DerivationSource
95+urlDerivationSource url hash = DerivationSource "url" url "" hash Nothing
5996
6097fromDerivationSource :: DerivationSource -> Source
61−fromDerivationSource DerivationSource{..} = Source derivUrl derivRevision $ Certain derivHash
98+fromDerivationSource DerivationSource{..} = Source derivUrl derivRevision (Certain derivHash) "."
6299
63100-- | Fetch a source, trying any of the various nix-prefetch-* scripts.
64−fetch :: forall a. (String -> MaybeT IO a) -- ^ This function is passed the output path name as an argument.
101+fetch :: forall a.
102+ Bool -- ^ If True, fetch submodules when the source is a git repository
103+ -> (String -> MaybeT IO a) -- ^ This function is passed the output path name as an argument.
65104 -- It should return 'Nothing' if the file doesn't match the expected format.
66105 -- This is required, because we cannot always check if a download succeeded otherwise.
67106 -> Source -- ^ The source to fetch from.
68107 -> IO (Maybe (DerivationSource, a)) -- ^ The derivation source and the result of the processing function. Returns Nothing if the download failed.
69−fetch f = runMaybeT . fetchers where
108+fetch optSubModules f = runMaybeT . fetchers where
70109 fetchers :: Source -> MaybeT IO (DerivationSource, a)
71110 fetchers source = msum . (fetchLocal source :) $ map (\fetcher -> fetchWith fetcher source >>= process)
72− [ (False, "zip", [])
73− , (False, "url", [])
74− , (True, "git", ["--fetch-submodules"])
111+ [ (False, "url", [])
112+ , (True, "git", ["--fetch-submodules" | optSubModules ])
75113 , (True, "hg", [])
76114 , (True, "svn", [])
77115 , (True, "bzr", [])
@@ -90,17 +128,19 @@ fetch f = runMaybeT . fetchers where
90128 guard $ existsDir || existsFile
91129 let path' | '/' `elem` path = path
92130 | otherwise = "./" ++ path
93− process (DerivationSource "" path' "" "", path') <|> localArchive path'
131+ process (localDerivationSource path', path') <|> localArchive path'
94132
95133 localArchive :: FilePath -> MaybeT IO (DerivationSource, a)
96134 localArchive path = do
97135 absolutePath <- liftIO $ canonicalizePath path
98− unpacked <- snd <$> fetchWith (False, "zip", []) (Source ("file://" ++ absolutePath) "" UnknownHash)
99− process (DerivationSource "" absolutePath "" "", unpacked)
136+ unpacked <- snd <$> fetchWith (False, "url", ["--unpack"]) (Source ("file://" ++ absolutePath) "" UnknownHash ".")
137+ process (localDerivationSource absolutePath, unpacked)
100138
101139 process :: (DerivationSource, FilePath) -> MaybeT IO (DerivationSource, a)
102140 process (derivSource, file) = (,) derivSource <$> f file
103141
142+ localDerivationSource p = DerivationSource "" p "" "" Nothing
143+
104144-- | Like 'fetch', but allows to specify which script to use.
105145fetchWith :: (Bool, String, [String]) -> Source -> MaybeT IO (DerivationSource, FilePath)
106146fetchWith (supportsRev, kind, addArgs) source = do
@@ -118,9 +158,25 @@ fetchWith (supportsRev, kind, addArgs) source = do
118158
119159 exitCode <- waitForProcess processH
120160 case exitCode of
121− ExitSuccess -> fmap Just . processOutputSwitch . lines =<< hGetContents stdoutH
122161 ExitFailure _ -> return Nothing
123−
162+ ExitSuccess -> do
163+ buf <- BS.hGetContents stdoutH
164+ let (l,ls) = case reverse (BS.lines buf) of
165+ [] -> error "This can't happen, but GHC doesn't know that."
166+ (x:xs) -> (x,xs)
167+ buf' = BS.unlines (reverse ls)
168+ case length ls of
169+ 0 -> return Nothing
170+ 1 -> return (Just (DerivationSource { derivKind = kind
171+ , derivUrl = sourceUrl source
172+ , derivRevision = ""
173+ , derivHash = BS.unpack (head ls)
174+ , derivSubmodule = Nothing
175+ }
176+ , sourceUrl source))
177+ _ -> case eitherDecode buf' of
178+ Left err -> error ("invalid JSON: " ++ err ++ " in " ++ show buf')
179+ Right ds -> return (Just (ds { derivKind = kind }, BS.unpack l))
124180 where
125181
126182 script :: String
@@ -129,29 +185,6 @@ fetchWith (supportsRev, kind, addArgs) source = do
129185 args :: [String]
130186 args = addArgs ++ sourceUrl source : [ sourceRevision source | supportsRev ] ++ hashToList (sourceHash source)
131187
132− processOutputWithRev :: [String] -> IO (DerivationSource, FilePath)
133− processOutputWithRev [rev,hash,path] = return (DerivationSource kind (sourceUrl source) (extractRevision rev) hash, path)
134− processOutputWithRev [rev,_,hash,path] = processOutputWithRev [rev,hash,path]
135− processOutputWithRev out = unexpectedOutput out
136−
137− extractRevision :: String -> String
138− extractRevision = unwords . drop 3 . words -- drop the "<vcs> revision is" prefix
139−
140− processOutput :: [String] -> IO (DerivationSource, FilePath)
141− processOutput [hash,path] = return (DerivationSource kind (sourceUrl source) (sourceRevision source) hash, path)
142− processOutput out = unexpectedOutput out
143−
144− unexpectedOutput :: [String] -> IO a
145− unexpectedOutput out = do
146− hPutStrLn stderr $ "*** unexpected output from " ++ "nix-prefetch-" ++ kind ++ " script: "
147− hPutStr stderr $ unlines out
148− exitFailure
149−
150− processOutputSwitch :: [String] -> IO (DerivationSource, FilePath)
151− processOutputSwitch
152− | supportsRev && isUnknown (sourceHash source) = processOutputWithRev
153− | otherwise = processOutput
154−
155188stripPrefix :: Eq a => [a] -> [a] -> [a]
156189stripPrefix prefix as
157190 | prefix' == prefix = stripped
src/Distribution/Nixpkgs/Haskell/BuildInfo.hs+10−5
@@ -9,13 +9,14 @@ module Distribution.Nixpkgs.Haskell.BuildInfo
99 )
1010 where
1111
12−import Control.DeepSeq.Generics
12+import Control.DeepSeq
13+import Control.Lens
14+import Data.Semigroup as Sem
1315import Data.Set ( Set )
1416import Data.Set.Lens
1517import GHC.Generics ( Generic )
16−import Internal.Lens
17−import Internal.PrettyPrinting
1818import Language.Nix
19+import Language.Nix.PrettyPrinting hiding ( (<>) )
1920
2021data BuildInfo = BuildInfo
2122 { _haskell :: Set Binding
@@ -30,11 +31,15 @@ makeLenses ''BuildInfo
3031instance Each BuildInfo BuildInfo (Set Binding) (Set Binding) where
3132 each f (BuildInfo a b c d) = BuildInfo <$> f a <*> f b <*> f c <*> f d
3233
34+instance Sem.Semigroup BuildInfo where
35+ BuildInfo w1 x1 y1 z1 <> BuildInfo w2 x2 y2 z2 =
36+ BuildInfo (w1 <> w2) (x1 <> x2) (y1 <> y2) (z1 <> z2)
37+
3338instance Monoid BuildInfo where
3439 mempty = BuildInfo mempty mempty mempty mempty
35− BuildInfo w1 x1 y1 z1 `mappend` BuildInfo w2 x2 y2 z2 = BuildInfo (w1 `mappend` w2) (x1 `mappend` x2) (y1 `mappend` y2) (z1 `mappend` z2)
40+ mappend = (Sem.<>)
3641
37−instance NFData BuildInfo where rnf = genericRnf
42+instance NFData BuildInfo
3843
3944pPrintBuildInfo :: String -> BuildInfo -> Doc
4045pPrintBuildInfo prefix bi = vcat
src/Distribution/Nixpkgs/Haskell/Constraint.hs+1−1
@@ -9,7 +9,7 @@ import Distribution.Nixpkgs.Haskell.OrphanInstances ( )
99type Constraint = Dependency
1010
1111satisfiesConstraint :: PackageIdentifier -> Constraint -> Bool
12−satisfiesConstraint (PackageIdentifier pn v) (Dependency cn vr) = (pn /= cn) || (v `withinRange` vr)
12+satisfiesConstraint (PackageIdentifier pn v) (Dependency cn vr _) = (pn /= cn) || (v `withinRange` vr)
1313
1414satisfiesConstraints :: PackageIdentifier -> [Constraint] -> Bool
1515satisfiesConstraints p = all (satisfiesConstraint p)
src/Distribution/Nixpkgs/Haskell/Derivation.hs+66−56
@@ -1,32 +1,37 @@
1+{-# LANGUAGE CPP #-}
12{-# LANGUAGE DeriveGeneric #-}
23{-# LANGUAGE RecordWildCards #-}
34{-# LANGUAGE TemplateHaskell #-}
45{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
56
67module Distribution.Nixpkgs.Haskell.Derivation
7− ( Derivation, pkgid, revision, src, isLibrary, isExecutable
8+ ( Derivation, nullDerivation, pkgid, revision, src, subpath, isLibrary, isExecutable
89 , extraFunctionArgs, libraryDepends, executableDepends, testDepends, configureFlags
9− , cabalFlags, runHaddock, jailbreak, doCheck, testTarget, hyperlinkSource, enableSplitObjs
10+ , cabalFlags, runHaddock, jailbreak, doCheck, doBenchmark, testTarget, hyperlinkSource, enableSplitObjs
1011 , enableLibraryProfiling, enableExecutableProfiling, phaseOverrides, editedCabalFile, metaSection
11− , dependencies
12+ , dependencies, setupDepends, benchmarkDepends, enableSeparateDataOutput
1213 )
1314 where
1415
15−import Control.DeepSeq.Generics
16−import Data.List
16+import Control.DeepSeq
17+import Control.Lens
18+import Data.List ( isPrefixOf )
1719import Data.Set ( Set )
1820import qualified Data.Set as Set
1921import Data.Set.Lens
2022import Distribution.Nixpkgs.Fetch
23+import Distribution.Nixpkgs.Haskell.BuildInfo
2124import Distribution.Nixpkgs.Haskell.OrphanInstances ( )
2225import Distribution.Nixpkgs.Meta
23−import Distribution.Nixpkgs.Haskell.BuildInfo
2426import Distribution.Package
25−import Distribution.PackageDescription ( FlagAssignment, FlagName(..) )
27+import Distribution.PackageDescription ( FlagAssignment, unFlagName, unFlagAssignment )
2628import GHC.Generics ( Generic )
27−import Internal.Lens
28−import Internal.PrettyPrinting
2929import Language.Nix
30+import Language.Nix.PrettyPrinting
31+
32+#if MIN_VERSION_base(4,11,0)
33+import Prelude hiding ((<>))
34+#endif
3035
3136-- | A represtation of Nix expressions for building Haskell packages.
3237-- The data type correspond closely to the definition of
@@ -36,17 +41,21 @@ data Derivation = MkDerivation
3641 { _pkgid :: PackageIdentifier
3742 , _revision :: Int
3843 , _src :: DerivationSource
44+ , _subpath :: FilePath
3945 , _isLibrary :: Bool
4046 , _isExecutable :: Bool
41− , _extraFunctionArgs :: Set Identifier
47+ , _extraFunctionArgs :: Set Binding
48+ , _setupDepends :: BuildInfo
4249 , _libraryDepends :: BuildInfo
4350 , _executableDepends :: BuildInfo
4451 , _testDepends :: BuildInfo
52+ , _benchmarkDepends :: BuildInfo
4553 , _configureFlags :: Set String
4654 , _cabalFlags :: FlagAssignment
4755 , _runHaddock :: Bool
4856 , _jailbreak :: Bool
4957 , _doCheck :: Bool
58+ , _doBenchmark :: Bool
5059 , _testTarget :: String
5160 , _hyperlinkSource :: Bool
5261 , _enableLibraryProfiling :: Bool
@@ -54,66 +63,77 @@ data Derivation = MkDerivation
5463 , _enableSplitObjs :: Bool
5564 , _phaseOverrides :: String
5665 , _editedCabalFile :: String
66+ , _enableSeparateDataOutput :: Bool
5767 , _metaSection :: Meta
5868 }
5969 deriving (Show, Eq, Generic)
6070
61−instance Default Derivation where
62− def = MkDerivation
63− { _pkgid = error "undefined Derivation.pkgid"
64− , _revision = error "undefined Derivation.revision"
65− , _src = error "undefined Derivation.src"
66− , _isLibrary = error "undefined Derivation.isLibrary"
67− , _isExecutable = error "undefined Derivation.isExecutable"
68− , _extraFunctionArgs = error "undefined Derivation.extraFunctionArgs"
69− , _libraryDepends = error "undefined Derivation.libraryDepends"
70− , _executableDepends = error "undefined Derivation.executableDepends"
71− , _testDepends = error "undefined Derivation.testDepends"
72− , _configureFlags = error "undefined Derivation.configureFlags"
73− , _cabalFlags = error "undefined Derivation.cabalFlags"
74− , _runHaddock = error "undefined Derivation.runHaddock"
75− , _jailbreak = error "undefined Derivation.jailbreak"
76− , _doCheck = error "undefined Derivation.doCheck"
77− , _testTarget = error "undefined Derivation.testTarget"
78− , _hyperlinkSource = error "undefined Derivation.hyperlinkSource"
79− , _enableLibraryProfiling = error "undefined Derivation.enableLibraryProfiling"
80− , _enableExecutableProfiling = error "undefined Derivation.enableExecutableProfiling"
81− , _enableSplitObjs = error "undefined Derivation.enableSplitObjs"
82− , _phaseOverrides = error "undefined Derivation.phaseOverrides"
83− , _editedCabalFile = error "undefined Derivation.editedCabalFile"
84− , _metaSection = error "undefined Derivation.metaSection"
85− }
71+nullDerivation :: Derivation
72+nullDerivation = MkDerivation
73+ { _pkgid = error "undefined Derivation.pkgid"
74+ , _revision = error "undefined Derivation.revision"
75+ , _src = error "undefined Derivation.src"
76+ , _subpath = error "undefined Derivation.subpath"
77+ , _isLibrary = error "undefined Derivation.isLibrary"
78+ , _isExecutable = error "undefined Derivation.isExecutable"
79+ , _extraFunctionArgs = error "undefined Derivation.extraFunctionArgs"
80+ , _setupDepends = error "undefined Derivation.setupDepends"
81+ , _libraryDepends = error "undefined Derivation.libraryDepends"
82+ , _executableDepends = error "undefined Derivation.executableDepends"
83+ , _testDepends = error "undefined Derivation.testDepends"
84+ , _benchmarkDepends = error "undefined Derivation.benchmarkDepends"
85+ , _configureFlags = error "undefined Derivation.configureFlags"
86+ , _cabalFlags = error "undefined Derivation.cabalFlags"
87+ , _runHaddock = error "undefined Derivation.runHaddock"
88+ , _jailbreak = error "undefined Derivation.jailbreak"
89+ , _doCheck = error "undefined Derivation.doCheck"
90+ , _doBenchmark = error "undefined Derivation.doBenchmark"
91+ , _testTarget = error "undefined Derivation.testTarget"
92+ , _hyperlinkSource = error "undefined Derivation.hyperlinkSource"
93+ , _enableLibraryProfiling = error "undefined Derivation.enableLibraryProfiling"
94+ , _enableExecutableProfiling = error "undefined Derivation.enableExecutableProfiling"
95+ , _enableSplitObjs = error "undefined Derivation.enableSplitObjs"
96+ , _phaseOverrides = error "undefined Derivation.phaseOverrides"
97+ , _editedCabalFile = error "undefined Derivation.editedCabalFile"
98+ , _enableSeparateDataOutput = error "undefined Derivation.enableSeparateDataOutput"
99+ , _metaSection = error "undefined Derivation.metaSection"
100+ }
86101
87102makeLenses ''Derivation
88103
89−makeLensesFor [("_libraryDepends", "dependencies"), ("_executableDepends", "dependencies"), ("_testDepends", "dependencies")] ''Derivation
104+makeLensesFor [("_setupDepends", "dependencies"), ("_libraryDepends", "dependencies"), ("_executableDepends", "dependencies"), ("_testDepends", "dependencies"), ("_benchmarkDepends", "dependencies")] ''Derivation
90105
91106instance Package Derivation where
92107 packageId = view pkgid
93108
94−instance NFData Derivation where rnf = genericRnf
109+instance NFData Derivation
95110
96111instance Pretty Derivation where
97− pPrint drv@(MkDerivation {..}) = funargs (map text ("mkDerivation" : toAscList inputs)) $$ vcat
112+ pPrint drv@MkDerivation {..} = funargs (map text ("mkDerivation" : toAscList inputs)) $$ vcat
98113 [ text "mkDerivation" <+> lbrace
99114 , nest 2 $ vcat
100− [ attr "pname" $ doubleQuotes $ disp (packageName _pkgid)
101− , attr "version" $ doubleQuotes $ disp (packageVersion _pkgid)
102− , sourceAttr _src
115+ [ attr "pname" $ doubleQuotes $ pPrint (packageName _pkgid)
116+ , attr "version" $ doubleQuotes $ pPrint (packageVersion _pkgid)
117+ , pPrint _src
118+ , onlyIf (_subpath /= ".") $ attr "postUnpack" postUnpack
103119 , onlyIf (_revision > 0) $ attr "revision" $ doubleQuotes $ int _revision
104− , onlyIf (not (null _editedCabalFile)) $ attr "editedCabalFile" $ string _editedCabalFile
120+ , onlyIf (not (null _editedCabalFile) && _revision > 0) $ attr "editedCabalFile" $ string _editedCabalFile
105121 , listattr "configureFlags" empty (map (show . show) renderedFlags)
106122 , boolattr "isLibrary" (not _isLibrary || _isExecutable) _isLibrary
107123 , boolattr "isExecutable" (not _isLibrary || _isExecutable) _isExecutable
124+ , boolattr "enableSeparateDataOutput" _enableSeparateDataOutput _enableSeparateDataOutput
125+ , onlyIf (_setupDepends /= mempty) $ pPrintBuildInfo "setup" _setupDepends
108126 , onlyIf (_libraryDepends /= mempty) $ pPrintBuildInfo "library" _libraryDepends
109127 , onlyIf (_executableDepends /= mempty) $ pPrintBuildInfo "executable" _executableDepends
110128 , onlyIf (_testDepends /= mempty) $ pPrintBuildInfo "test" _testDepends
129+ , onlyIf (_benchmarkDepends /= mempty) $ pPrintBuildInfo "benchmark" _benchmarkDepends
111130 , boolattr "enableLibraryProfiling" _enableLibraryProfiling _enableLibraryProfiling
112131 , boolattr "enableExecutableProfiling" _enableExecutableProfiling _enableExecutableProfiling
113132 , boolattr "enableSplitObjs" (not _enableSplitObjs) _enableSplitObjs
114133 , boolattr "doHaddock" (not _runHaddock) _runHaddock
115134 , boolattr "jailbreak" _jailbreak _jailbreak
116135 , boolattr "doCheck" (not _doCheck) _doCheck
136+ , boolattr "doBenchmark" _doBenchmark _doBenchmark
117137 , onlyIf (not (null _testTarget)) $ attr "testTarget" $ string _testTarget
118138 , boolattr "hyperlinkSource" (not _hyperlinkSource) _hyperlinkSource
119139 , onlyIf (not (null _phaseOverrides)) $ vcat ((map text . lines) _phaseOverrides)
@@ -123,23 +143,13 @@ instance Pretty Derivation where
123143 ]
124144 where
125145 inputs :: Set String
126− inputs = Set.unions [ Set.map (view ident) _extraFunctionArgs
146+ inputs = Set.unions [ Set.map (view (localName . ident)) _extraFunctionArgs
127147 , setOf (dependencies . each . folded . localName . ident) drv
128148 , Set.fromList ["fetch" ++ derivKind _src | derivKind _src /= "" && not isHackagePackage]
129149 ]
130150
131− renderedFlags = [ text "-f" <> (if enable then empty else char '-') <> text f | (FlagName f, enable) <- _cabalFlags ]
151+ renderedFlags = [ text "-f" <> (if enable then empty else char '-') <> text (unFlagName f) | (f, enable) <- unFlagAssignment _cabalFlags ]
132152 ++ map text (toAscList _configureFlags)
133153 isHackagePackage = "mirror://hackage/" `isPrefixOf` derivUrl _src
134− sourceAttr (DerivationSource{..})
135− | isHackagePackage = attr "sha256" $ string derivHash
136− | derivKind /= "" = vcat
137− [ text "src" <+> equals <+> text ("fetch" ++ derivKind) <+> lbrace
138− , nest 2 $ vcat
139− [ attr "url" $ string derivUrl
140− , attr "sha256" $ string derivHash
141− , if derivRevision /= "" then attr "rev" (string derivRevision) else empty
142− ]
143− , rbrace <> semi
144− ]
145− | otherwise = attr "src" $ text derivUrl
154+
155+ postUnpack = string $ "sourceRoot+=/" ++ _subpath ++ "; echo source root reset to $sourceRoot"
src/Distribution/Nixpkgs/Haskell/FromCabal.hs+95−52
@@ -3,14 +3,13 @@
33
44module Distribution.Nixpkgs.Haskell.FromCabal
55 ( HaskellResolver, NixpkgsResolver
6− , fromGenericPackageDescription , fromPackageDescription
7− )
8− where
6+ , fromGenericPackageDescription , finalizeGenericPackageDescription , fromPackageDescription
7+ ) where
98
10−import Control.Arrow ( second )
9+import Control.Lens
1110import Data.Maybe
12−import qualified Data.Set as Set
1311import Data.Set ( Set )
12+import qualified Data.Set as Set
1413import Distribution.Compiler
1514import Distribution.Nixpkgs.Haskell
1615import qualified Distribution.Nixpkgs.Haskell as Nix
@@ -18,112 +17,156 @@ import Distribution.Nixpkgs.Haskell.Constraint
1817import Distribution.Nixpkgs.Haskell.FromCabal.License
1918import Distribution.Nixpkgs.Haskell.FromCabal.Name
2019import Distribution.Nixpkgs.Haskell.FromCabal.Normalize
21−import Distribution.Nixpkgs.Haskell.FromCabal.PostProcess
20+import Distribution.Nixpkgs.Haskell.FromCabal.PostProcess (postProcess)
21+import qualified Distribution.Nixpkgs.License as Nix
2222import qualified Distribution.Nixpkgs.Meta as Nix
2323import Distribution.Package
2424import Distribution.PackageDescription
2525import qualified Distribution.PackageDescription as Cabal
26−import Distribution.PackageDescription.Configuration
26+import Distribution.PackageDescription.Configuration as Cabal
2727import Distribution.System
2828import Distribution.Text ( display )
29+import Distribution.Types.ComponentRequestedSpec as Cabal
30+import Distribution.Types.ExeDependency as Cabal
31+import Distribution.Types.LegacyExeDependency as Cabal
32+import Distribution.Types.PkgconfigDependency as Cabal
33+import Distribution.Types.UnqualComponentName as Cabal
2934import Distribution.Version
30−import Internal.Lens
3135import Language.Nix
3236
3337type HaskellResolver = Dependency -> Bool
3438type NixpkgsResolver = Identifier -> Maybe Binding
3539
36−fromGenericPackageDescription :: HaskellResolver -> NixpkgsResolver -> Platform -> CompilerInfo -> FlagAssignment -> [Constraint] -> GenericPackageDescription -> Derivation
37−fromGenericPackageDescription haskellResolver nixpkgsResolver arch compiler flags constraints descr'' =
38− case finalize haskellResolver of
39− Left mismatch -> case finalize jailbrokenResolver of
40− Left missing -> case finalize (const True) of
41− Left missing' -> error $ "finalizePackageDescription complains about missing dependencies \
42− \even though we told it that everything exists: " ++ show missing'
43− Right (descr,_) -> fromPackageDescription haskellResolver nixpkgsResolver mismatch missing flags descr
44− Right (descr,_) -> fromPackageDescription haskellResolver nixpkgsResolver mismatch [] flags descr
45− Right (descr,_) -> fromPackageDescription haskellResolver nixpkgsResolver [] [] flags descr
46−
47− where
48− -- We have to call the Cabal finalizer several times with different resolver functions, and this
49− -- convenience function makes our code shorter.
40+fromGenericPackageDescription :: HaskellResolver -> NixpkgsResolver -> Platform -> CompilerInfo -> FlagAssignment -> [Constraint] -> GenericPackageDescription -> Derivation
41+fromGenericPackageDescription haskellResolver nixpkgsResolver arch compiler flags constraints genDesc =
42+ fromPackageDescription haskellResolver nixpkgsResolver missingDeps flags descr
43+ where
44+ (descr, missingDeps) = finalizeGenericPackageDescription haskellResolver arch compiler flags constraints genDesc
45+
46+finalizeGenericPackageDescription :: HaskellResolver -> Platform -> CompilerInfo -> FlagAssignment -> [Constraint] -> GenericPackageDescription -> (PackageDescription, [Dependency])
47+finalizeGenericPackageDescription haskellResolver arch compiler flags constraints genDesc =
48+ let
49+ -- We have to call the Cabal finalizer several times with different resolver
50+ -- functions, and this convenience function makes our code shorter.
5051 finalize :: HaskellResolver -> Either [Dependency] (PackageDescription,FlagAssignment)
51− finalize resolver = finalizePackageDescription flags resolver arch compiler constraints descr'
52+ finalize resolver = finalizePD flags requestedComponents resolver arch compiler constraints genDesc
53+
54+ requestedComponents :: ComponentRequestedSpec
55+ requestedComponents = ComponentRequestedSpec
56+ { testsRequested = True
57+ , benchmarksRequested = True
58+ }
5259
53− jailbrokenResolver :: HaskellResolver
54− jailbrokenResolver (Dependency pkg _) = haskellResolver (Dependency pkg anyVersion)
60+ jailbroken :: HaskellResolver -> HaskellResolver
61+ jailbroken resolver (Dependency pkg _ _) = resolver (Dependency pkg anyVersion mempty)
5562
56− -- A variant of the cabal file that has all test suites enabled to ensure
57− -- that their dependencies are recognized by finalizePackageDescription.
58− descr' :: GenericPackageDescription
59− descr' = descr'' { condTestSuites = flaggedTests }
63+ withInternalLibs :: HaskellResolver -> HaskellResolver
64+ withInternalLibs resolver d = depPkgName d `elem` internalNames || resolver d
6065
61− flaggedTests :: [(String, CondTree ConfVar [Dependency] TestSuite)]
62− flaggedTests = map (second (mapTreeData enableTest)) (condTestSuites descr'')
66+ internalNames :: [PackageName]
67+ internalNames = [ unqualComponentNameToPackageName n | (n,_) <- condSubLibraries genDesc ]
68+ ++ [ unqualComponentNameToPackageName n | LSubLibName n <- libName <$> subLibraries (packageDescription genDesc) ]
6369
64− enableTest :: TestSuite -> TestSuite
65− enableTest t = t { testEnabled = True }
70+ in case finalize (jailbroken (withInternalLibs haskellResolver)) of
71+ Left m -> case finalize (const True) of
72+ Left _ -> error ("Cabal cannot finalize " ++ display (packageId genDesc))
73+ Right (d,_) -> (d,m)
74+ Right (d,_) -> (d,[])
6675
67−fromPackageDescription :: HaskellResolver -> NixpkgsResolver -> [Dependency] -> [Dependency] -> FlagAssignment -> PackageDescription -> Derivation
68−fromPackageDescription haskellResolver nixpkgsResolver mismatchedDeps missingDeps flags (PackageDescription {..}) = normalize $ postProcess $ def
76+fromPackageDescription :: HaskellResolver -> NixpkgsResolver -> [Dependency] -> FlagAssignment -> PackageDescription -> Derivation
77+fromPackageDescription haskellResolver nixpkgsResolver missingDeps flags PackageDescription {..} = normalize $ postProcess $ nullDerivation
6978 & isLibrary .~ isJust library
7079 & pkgid .~ package
7180 & revision .~ xrev
7281 & isLibrary .~ isJust library
7382 & isExecutable .~ not (null executables)
7483 & extraFunctionArgs .~ mempty
75− & libraryDepends .~ maybe mempty (convertBuildInfo . libBuildInfo) library
84+ & libraryDepends .~ foldMap (convertBuildInfo . libBuildInfo) (maybeToList library ++ subLibraries)
7685 & executableDepends .~ mconcat (map (convertBuildInfo . buildInfo) executables)
7786 & testDepends .~ mconcat (map (convertBuildInfo . testBuildInfo) testSuites)
87+ & benchmarkDepends .~ mconcat (map (convertBuildInfo . benchmarkBuildInfo) benchmarks)
88+ & Nix.setupDepends .~ maybe mempty convertSetupBuildInfo setupBuildInfo
7889 & configureFlags .~ mempty
7990 & cabalFlags .~ flags
80− & runHaddock .~ True
81− & jailbreak .~ not (null mismatchedDeps && null missingDeps)
91+ & runHaddock .~ doHaddockPhase
92+ & jailbreak .~ False
8293 & doCheck .~ True
94+ & doBenchmark .~ False
8395 & testTarget .~ mempty
8496 & hyperlinkSource .~ True
8597 & enableSplitObjs .~ True
8698 & enableLibraryProfiling .~ False
8799 & enableExecutableProfiling .~ False
100+ & enableSeparateDataOutput .~ not (null dataFiles)
101+ & subpath .~ "."
88102 & phaseOverrides .~ mempty
89103 & editedCabalFile .~ (if xrev > 0
90104 then fromMaybe (error (display package ++ ": X-Cabal-File-Hash field is missing")) (lookup "X-Cabal-File-Hash" customFieldsPD)
91105 else "")
92− & metaSection .~ ( def
106+ & metaSection .~ ( Nix.nullMeta
93107 & Nix.homepage .~ homepage
94108 & Nix.description .~ synopsis
95− & Nix.license .~ fromCabalLicense license
96− & Nix.platforms .~ mempty
97− & Nix.hydraPlatforms .~ mempty
109+ & Nix.license .~ nixLicense
110+ & Nix.platforms .~ Nix.allKnownPlatforms
111+ & Nix.hydraPlatforms .~ (if isFreeLicense nixLicense then Nix.allKnownPlatforms else Set.empty)
98112 & Nix.maintainers .~ mempty
99113 & Nix.broken .~ not (null missingDeps)
100114 )
101115 where
102116 xrev = maybe 0 read (lookup "x-revision" customFieldsPD)
103117
104− resolveInHackage :: Identifier -> Binding
105− resolveInHackage i | (i^.ident) `elem` [ n | (Dependency (PackageName n) _) <- missingDeps ] = bindNull i
106− | otherwise = create binding (i, create path ["self",i]) -- TODO: "self" shouldn't be hardcoded.
118+ nixLicense :: Nix.License
119+ nixLicense = either fromSPDXLicense fromCabalLicense licenseRaw
107120
121+ resolveInHackage :: Identifier -> Binding
122+ resolveInHackage i | (i^.ident) `elem` [ unPackageName n | (Dependency n _ _) <- missingDeps ] = bindNull i
123+ | otherwise = binding # (i, path # ["self",i]) -- TODO: "self" shouldn't be hardcoded.
124+
125+ -- TODO: This is all very confusing. Haskell packages refer to the Nixpkgs
126+ -- derivation 'foo' as 'pkgs.foo', because they live in the 'haskellPackages'
127+ -- name space -- not on the top level. Therefore, we built our Nixpkgs lookup
128+ -- function so that top level names are returned as 'pkgs.foo'. As a result, we
129+ -- end up pre-pending that path to all kinds of names all over the place. I
130+ -- suppose the correct approach would be to assume that the lookup function
131+ -- returns names that live in the top-level and to adapt the code in
132+ -- PostProcess.hs et all to that fact.
108133 goodScopes :: Set [Identifier]
109− goodScopes = Set.fromList (map ("pkgs":) [[], ["xlibs"], ["gnome"], ["gnome3"], ["kde4"]])
134+ goodScopes = Set.fromList (map ("pkgs":) [[], ["xorg"], ["xlibs"], ["gnome2"], ["gnome"], ["gnome3"], ["kde4"]])
110135
111136 resolveInNixpkgs :: Identifier -> Binding
112137 resolveInNixpkgs i
113− | i `elem` ["clang","lldb","llvm"] = create binding (i,create path ["self","llvmPackages",i]) -- TODO: evil!
138+ | i `elem` ["clang","lldb","llvm"] = binding # (i, path # ["self","llvmPackages",i]) -- TODO: evil!
139+ | i == "gtk2" = binding # (i, path # ["pkgs","gtk2"]) -- TODO: these cases should not be necessary
140+ | i == "gtk3" = binding # (i, path # ["pkgs","gtk3"])
141+ | i == "gtksourceview3" = binding # (i, path # ["pkgs","gtksourceview3"])
142+ | i == "vte_291" = binding # (i, path # ["pkgs","vte"])
114143 | Just p <- nixpkgsResolver i, init (view (reference . path) p) `Set.member` goodScopes = p
115144 | otherwise = bindNull i
116145
117146 resolveInHackageThenNixpkgs :: Identifier -> Binding
118− resolveInHackageThenNixpkgs i | haskellResolver (Dependency (PackageName (i^.ident)) anyVersion) = resolveInHackage i
147+ resolveInHackageThenNixpkgs i | haskellResolver (Dependency (mkPackageName (i^.ident)) anyVersion mempty) = resolveInHackage i
119148 | otherwise = resolveInNixpkgs i
120149
150+ internalLibNames :: [PackageName]
151+ internalLibNames = [ unqualComponentNameToPackageName n | LSubLibName n <- libName <$> subLibraries ]
152+
153+ doHaddockPhase :: Bool
154+ doHaddockPhase | not (null internalLibNames) = False
155+ | Just l <- library = not (null (exposedModules l))
156+ | otherwise = True
157+
121158 convertBuildInfo :: Cabal.BuildInfo -> Nix.BuildInfo
159+ convertBuildInfo Cabal.BuildInfo {..} | not buildable = mempty
122160 convertBuildInfo Cabal.BuildInfo {..} = mempty
123− & haskell .~ Set.fromList [ resolveInHackage (toNixName x) | (Dependency x _) <- targetBuildDepends ]
161+ & haskell .~ Set.fromList [ resolveInHackage (toNixName x) | (Dependency x _ _) <- targetBuildDepends, x `notElem` internalLibNames ]
124162 & system .~ Set.fromList [ resolveInNixpkgs y | x <- extraLibs, y <- libNixName x ]
125− & pkgconfig .~ Set.fromList [ resolveInNixpkgs y | Dependency (PackageName x) _ <- pkgconfigDepends, y <- libNixName x ]
126− & tool .~ Set.fromList [ resolveInHackageThenNixpkgs y | Dependency (PackageName x) _ <- buildTools, y <- buildToolNixName x ]
163+ & pkgconfig .~ Set.fromList [ resolveInNixpkgs y | PkgconfigDependency x _ <- pkgconfigDepends, y <- libNixName (unPkgconfigName x) ]
164+ & tool .~ Set.fromList (map resolveInHackageThenNixpkgs . concatMap buildToolNixName
165+ $ [ unPackageName x | ExeDependency x _ _ <- buildToolDepends ] ++ [ x | LegacyExeDependency x _ <- buildTools ])
166+
167+ convertSetupBuildInfo :: Cabal.SetupBuildInfo -> Nix.BuildInfo
168+ convertSetupBuildInfo bi = mempty
169+ & haskell .~ Set.fromList [ resolveInHackage (toNixName x) | (Dependency x _ _) <- Cabal.setupDepends bi ]
127170
128171bindNull :: Identifier -> Binding
129−bindNull i = create binding (i, create path ["null"])
172+bindNull i = binding # (i, path # ["null"])
src/Distribution/Nixpkgs/Haskell/FromCabal/Configuration.hs+83−32
@@ -1,37 +1,41 @@
1+{-# LANGUAGE RecordWildCards #-}
2+{-# LANGUAGE FlexibleInstances #-}
3+{-# LANGUAGE OverloadedStrings #-}
4+{-# LANGUAGE DeriveGeneric #-}
5+{-# OPTIONS_GHC -fno-warn-orphans #-}
6+
17module Distribution.Nixpkgs.Haskell.FromCabal.Configuration
2− ( Configuration(..)
3− , module Distribution.Package
4− , module Distribution.System
5− , module Distribution.Compiler
6− , module Distribution.Nixpkgs.Haskell.Constraint
7− , module Distribution.Version
8− , module Language.Nix.Identifier
9− ) where
10−
11−import Data.Set
12−import Distribution.Package
13−import Distribution.System
8+ ( Configuration(..), readConfiguration, assertConsistency
9+ )
10+ where
11+
12+import Prelude hiding ( fail )
13+
14+import Control.DeepSeq
15+import Control.Exception ( throwIO )
16+import Control.Lens
17+import Control.Monad hiding ( fail )
18+import Control.Monad.Fail
19+import Data.Aeson
20+import Data.Map as Map
21+import Data.Set as Set
22+import Data.Text as T
23+import Data.Yaml
1424import Distribution.Compiler
1525import Distribution.Nixpkgs.Haskell.Constraint
16−import Distribution.Version
17−import Data.Map
26+import Distribution.Package
27+import Distribution.System
28+import GHC.Generics ( Generic )
1829import Language.Nix.Identifier
1930
2031data Configuration = Configuration
2132 {
22− -- |Target architecture. Used by 'finalizePackageDescription' to
23− -- choose appropriate flags and dependencies.
24− platform :: Platform
25−
2633 -- |Target compiler. Used by 'finalizePackageDescription' to choose
2734 -- appropriate flags and dependencies.
28− , compilerInfo :: CompilerInfo
29−
30− -- |Core packages found on Hackageg
31− , corePackages :: [PackageIdentifier]
35+ compilerInfo :: CompilerInfo
3236
33− -- |Core packages not found on Hackage.
34− , hardCorePackages :: [PackageIdentifier]
37+ -- |Compiler core packages that are also found on Hackage.
38+ , corePackages :: Set PackageIdentifier
3539
3640 -- |These packages replace the latest respective version during
3741 -- dependency resolution.
@@ -41,15 +45,62 @@ data Configuration = Configuration
4145 -- role during dependency resolution.
4246 , extraPackages :: [Constraint]
4347
44− -- |We know that these packages won't build, so we give them an empty
45− -- meta.hydraPlatforms attribute to avoid cluttering our Hydra output with
46− -- lots of failure messages.
47− , dontDistributePackages :: Set PackageName
48−
4948 -- |This information is used by the @hackage2nix@ utility to determine the
5049 -- 'maintainers' for a given Haskell package.
51− , packageMaintainers :: Map PackageName (Set Identifier)
50+ , packageMaintainers :: Map Identifier (Set PackageName)
51+
52+ -- |These packages (by design) don't support certain platforms.
53+ , unsupportedPlatforms :: Map PackageName (Set Platform)
54+
55+ -- |These packages cannot be distributed by Hydra, i.e. because they have an
56+ -- unfree license or depend on other tools that cannot be distributed for
57+ -- some reason.
58+ , dontDistributePackages :: Set PackageName
59+
60+ -- |We know that these packages won't compile, so we mark them as broken and
61+ -- also disable their meta.hydraPlatforms attribute to avoid cluttering our
62+ -- Hydra job with lots of failure messages.
63+ , brokenPackages :: [Constraint]
5264 }
53− deriving (Show)
65+ deriving (Show, Generic)
66+
67+instance NFData Configuration
68+
69+instance FromJSON Configuration where
70+ parseJSON (Object o) = Configuration
71+ <$> o .:? "compiler" .!= unknownCompilerInfo buildCompilerId NoAbiTag
72+ <*> o .:? "core-packages" .!= mempty
73+ <*> o .:? "default-package-overrides" .!= mempty
74+ <*> o .:? "extra-packages" .!= mempty
75+ <*> o .:? "package-maintainers" .!= mempty
76+ <*> o .:? "unsupported-platforms" .!= mempty
77+ <*> o .:? "dont-distribute-packages" .!= mempty
78+ <*> o .:? "broken-packages" .!= mempty
79+ parseJSON _ = error "invalid Configuration"
80+
81+instance FromJSON Identifier where
82+ parseJSON (String s) = pure (review ident (T.unpack s))
83+ parseJSON s = fail ("parseJSON: " ++ show s ++ " is not a valid Nix identifier")
84+
85+instance FromJSONKey Identifier where
86+ fromJSONKey = FromJSONKeyText parseKey
87+
88+instance FromJSONKey PackageName where
89+ fromJSONKey = FromJSONKeyText parseKey
90+
91+parseKey :: FromJSON k => Text -> k
92+parseKey s = either error id (parseEither parseJSON (String s))
93+
94+readConfiguration :: FilePath -> IO Configuration
95+readConfiguration path = decodeFileEither path >>= either throwIO assertConsistency
96+
97+assertConsistency :: MonadFail m => Configuration -> m Configuration
98+assertConsistency cfg@Configuration {..} = do
99+ let report msg = fail ("*** configuration error: " ++ msg)
100+ maintainedPackages = Set.unions (Map.elems packageMaintainers)
101+ disabledPackages = dontDistributePackages `Set.union` Set.fromList (depPkgName <$> brokenPackages)
102+ disabledMaintainedPackages = maintainedPackages `Set.intersection` disabledPackages
103+ unless (Set.null disabledMaintainedPackages) $
104+ report ("disabled packages that have a maintainer: " ++ show disabledMaintainedPackages)
54105
55−{-# ANN module "HLint: ignore Use import/export shortcut" #-}
106+ return cfg
src/Distribution/Nixpkgs/Haskell/FromCabal/Configuration/GHC7102.hsdeleted−3590
@@ -1,3590 +0,0 @@
1−{-# LANGUAGE OverloadedStrings #-}
2−
3−module Distribution.Nixpkgs.Haskell.FromCabal.Configuration.GHC7102
4− ( Configuration(..), ghc7102
5− ) where
6−
7−import qualified Data.Set as Set
8−import Distribution.Nixpkgs.Haskell.FromCabal.Configuration
9−import Distribution.Nixpkgs.Haskell.FromCabal.Configuration.Maintainers
10−
11−ghc7102 :: Configuration
12−ghc7102 = Configuration
13− { platform = Platform X86_64 Linux
14−
15− , compilerInfo = unknownCompilerInfo (CompilerId GHC (Version [7,10,2] [])) NoAbiTag
16−
17− , packageMaintainers = globalPackageMaintainers
18−
19− , defaultPackageOverrides =
20− [ "HUnit < 1.3.0.0" -- newer versions break test-framework-hunit-0.3.0.1
21− ]
22−
23− , corePackages =
24− [ "Cabal-1.22.4.0"
25− , "array-0.5.1.0"
26− , "base-4.8.1.0"
27− , "binary-0.7.5.0"
28− , "bytestring-0.10.6.0"
29− , "containers-0.5.6.2"
30− , "deepseq-1.4.1.1"
31− , "directory-1.2.2.0"
32− , "filepath-1.4.0.0"
33− , "ghc-prim-0.4.0.0"
34− , "haskeline-0.7.2.1"
35− , "hoopl-3.10.0.2"
36− , "hpc-0.6.0.2"
37− , "integer-gmp-1.0.0.0"
38− , "pretty-1.1.2.0"
39− , "process-1.2.3.0"
40− , "template-haskell-2.10.0.0"
41− , "terminfo-0.4.0.1"
42− , "time-1.5.0.1"
43− , "transformers-0.4.2.0"
44− , "unix-2.7.1.0"
45− , "xhtml-3000.2.1"
46− ]
47−
48− , hardCorePackages =
49− [ "bin-package-db-0.0.0.0"
50− , "ghc-7.10.2"
51− , "rts-1.0"
52− ]
53−
54− , extraPackages =
55− [ "aeson < 0.8" -- newer versions don't work with GHC 6.12.3
56− , "Cabal == 1.18.*" -- required for cabal-install et al on old GHC versions
57− , "Cabal == 1.20.*" -- required for cabal-install et al on old GHC versions
58− , "cabal-install == 1.18.*" -- required for ghc-mod on 7.8.x
59− , "conduit < 1.2.4.2" -- newer versions trigger non-deterministic ID bugs in GHC versions prior to 7.10.x
60− , "containers < 0.5" -- required to build alex with GHC 6.12.3
61− , "control-monad-free < 0.6" -- newer versions don't compile with anything but GHC 7.8.x
62− , "deepseq == 1.3.0.1" -- required to build Cabal with GHC 6.12.3
63− , "descriptive < 0.1" -- required for structured-haskell-mode-1.0.8
64− , "gloss < 1.9.3" -- new versions don't compile with GHC 7.8.x
65− , "haddock-api < 2.16" -- required on GHC 7.8.x
66− , "haskell-src-exts < 1.16" -- required for structured-haskell-mode-1.0.8
67− , "mtl < 2.2" -- newer versions require transformers > 0.4.x, which we cannot provide in GHC 7.8.x
68− , "mtl-prelude < 2" -- required for to build postgrest on mtl 2.1.x platforms
69− , "parallel == 3.2.0.3" -- newer versions don't work with GHC 6.12.3
70− , "primitive == 0.5.1.*" -- required to build alex with GHC 6.12.3
71− , "QuickCheck < 2" -- required by test-framework-quickcheck and its users
72− , "seqid < 0.2" -- newer versions depend on transformers 0.4.x which we cannot provide in GHC 7.8.x
73− , "seqid-streams < 0.2" -- newer versions depend on transformers 0.4.x which we cannot provide in GHC 7.8.x
74− , "split < 0.2" -- newer versions don't work with GHC 6.12.3
75− , "tar < 0.4.2.0" -- later versions don't work with GHC < 7.6.x
76− , "vector < 0.10.10" -- newer versions don't work with GHC 6.12.3
77− , "zlib < 0.6" -- newer versions break cabal-install
78− ]
79−
80− , dontDistributePackages = Set.fromList
81− [ "3dmodels"
82− , "4Blocks"
83− , "abcBridge"
84− , "abstract-par-accelerate"
85− , "abt" -- depends on broken package singletons-1.1.2.1
86− , "AC-BuildPlatform"
87− , "accelerate-arithmetic"
88− , "accelerate-fftw"
89− , "accelerate-fourier"
90− , "accelerate-io"
91− , "accelerate-utility"
92− , "accentuateus"
93− , "access-time"
94− , "AC-EasyRaster-GTK"
95− , "AC-HalfInteger"
96− , "acid-state-dist"
97− , "ACME"
98− , "acme-hq9plus"
99− , "acme-inator"
100− , "acme-numbersystem"
101− , "acme-schoenfinkel"
102− , "acme-zero"
103− , "AC-MiniTest"
104− , "AC-Terminal"
105− , "ActionKid"
106− , "activehs"
107− , "actor"
108− , "AC-VanillaArray"
109− , "Adaptive"
110− , "Adaptive-Blaisorblade"
111− , "adaptive-containers"
112− , "adaptive-tuple"
113− , "adblock2privoxy"
114− , "adhoc-network"
115− , "adict"
116− , "adobe-swatch-exchange"
117− , "ADPfusion"
118− , "adp-multi"
119− , "adp-multi-monadiccp"
120− , "Advgame"
121− , "AERN-Basics"
122− , "AERN-Net"
123− , "AERN-Real"
124− , "AERN-Real-Double"
125− , "AERN-Real-Interval"
126− , "AERN-RnToRm"
127− , "AERN-RnToRm-Plot"
128− , "aeson-bson"
129− , "AesonBson"
130− , "aeson-native"
131− , "aeson-smart"
132− , "afv"
133− , "Agata"
134− , "agda-server"
135− , "AGI"
136− , "AhoCorasick"
137− , "airbrake"
138− , "aivika-transformers"
139− , "ajhc"
140− , "alea"
141− , "algebraic"
142− , "AlignmentAlgorithms"
143− , "alms"
144− , "alpha"
145− , "alpino-tools"
146− , "alsa"
147− , "alsa-midi"
148− , "alsa-pcm-tests"
149− , "alsa-seq-tests"
150− , "altfloat"
151− , "alure"
152− , "amazon-emailer"
153− , "amazon-products"
154− , "AMI"
155− , "ampersand"
156− , "anansi-pandoc"
157− , "anatomy"
158− , "android-lint-summary"
159− , "AndroidViewHierarchyImporter"
160− , "angel"
161− , "Animas"
162− , "antfarm"
163− , "anticiv"
164− , "antigate"
165− , "antimirov"
166− , "antlrc"
167− , "anydbm"
168− , "aosd"
169− , "apelsin"
170− , "apiary-helics"
171− , "apiary-purescript"
172− , "apis"
173− , "api-tools"
174− , "apotiki"
175− , "appc"
176− , "app-lens"
177− , "ApplePush"
178− , "AppleScript"
179− , "approx-rand-test"
180− , "arbb-vm"
181− , "arb-fft"
182− , "archiver"
183− , "archlinux"
184− , "archlinux-web"
185− , "arff"
186− , "argparser"
187− , "arguedit"
188− , "ariadne"
189− , "arion"
190− , "armada"
191− , "array-forth"
192− , "ArrayRef"
193− , "arrowapply-utils"
194− , "arrow-improve"
195− , "arrowp"
196− , "ArrowVHDL"
197− , "arx"
198− , "ascii85-conduit"
199− , "asic"
200− , "asil"
201− , "asn1-data"
202− , "AspectAG"
203− , "assimp"
204− , "astrds"
205− , "astview"
206− , "async-extras"
207− , "aterm-utils"
208− , "atlassian-connect-core"
209− , "atlassian-connect-descriptor"
210− , "atom-basic"
211− , "atomic-primops-vector"
212− , "atom-msp430"
213− , "atomo"
214− , "attoparsec-csv"
215− , "attoparsec-iteratee"
216− , "attoparsec-text"
217− , "attoparsec-text-enumerator"
218− , "Attrac"
219− , "atuin"
220− , "augeas"
221− , "augur"
222− , "Aurochs"
223− , "authoring"
224− , "AutoForms"
225− , "autoproc"
226− , "avahi"
227− , "avers"
228− , "AvlTree"
229− , "awesomium"
230− , "awesomium-glut"
231− , "awesomium-raw"
232− , "AWin32Console" -- depends on broken package Win32-2.3.1.0
233− , "aws-cloudfront-signer"
234− , "aws-configuration-tools"
235− , "aws-dynamodb-streams"
236− , "aws-ec2"
237− , "aws-elastic-transcoder"
238− , "aws-general"
239− , "aws-kinesis"
240− , "aws-kinesis-client"
241− , "aws-kinesis-reshard"
242− , "aws-lambda"
243− , "aws-performance-tests"
244− , "aws-sdk"
245− , "aws-sdk-text-converter"
246− , "aws-sdk-xml-unordered"
247− , "aws-sign4"
248− , "aws-sns"
249− , "azure-service-api"
250− , "azurify"
251− , "backdropper"
252− , "bag"
253− , "Baggins"
254− , "bamboo"
255− , "bamboo-launcher"
256− , "bamboo-plugin-highlight"
257− , "bamboo-plugin-photo"
258− , "bamboo-theme-blueprint"
259− , "bamboo-theme-mini-html5"
260− , "bamse"
261− , "barley"
262− , "Barracuda"
263− , "barrie"
264− , "barrier-monad"
265− , "baskell"
266− , "battleships"
267− , "bayes-stack"
268− , "BCMtools"
269− , "beamable"
270− , "beautifHOL"
271− , "bed-and-breakfast"
272− , "Befunge93"
273− , "bein"
274− , "berkeleydb"
275− , "BerkeleyDBXML"
276− , "berp"
277− , "bff"
278− , "bgzf"
279− , "bidirectionalization-combined"
280− , "bidispec"
281− , "billboard-parser"
282− , "billeksah-forms"
283− , "billeksah-main"
284− , "billeksah-pane"
285− , "billeksah-services"
286− , "binary-derive"
287− , "binary-file"
288− , "binary-indexed-tree"
289− , "binary-protocol-zmq"
290− , "binary-streams"
291− , "binary-strict"
292− , "binding-gtk"
293− , "bindings-apr"
294− , "bindings-apr-util"
295− , "bindings-bfd"
296− , "bindings-cctools"
297− , "bindings-codec2"
298− , "bindings-common"
299− , "bindings-dc1394"
300− , "bindings-eskit"
301− , "bindings-EsounD"
302− , "bindings-fann"
303− , "bindings-friso"
304− , "bindings-gts"
305− , "bindings-hdf5"
306− , "bindings-K8055"
307− , "bindings-libftdi"
308− , "bindings-librrd"
309− , "bindings-libstemmer"
310− , "bindings-libv4l2"
311− , "bindings-linux-videodev2"
312− , "bindings-mpdecimal"
313− , "bindings-sc3"
314− , "bindings-sipc"
315− , "bind-marshal"
316− , "bio"
317− , "Biobase"
318− , "BiobaseBlast"
319− , "BiobaseDotP"
320− , "BiobaseFasta"
321− , "BiobaseFR3D"
322− , "BiobaseInfernal"
323− , "BiobaseMAF"
324− , "BiobaseTrainingData"
325− , "BiobaseTurner"
326− , "BiobaseTypes"
327− , "BiobaseVienna"
328− , "BiobaseXNA"
329− , "biophd"
330− , "biosff"
331− , "biostockholm"
332− , "bird"
333− , "BirdPP"
334− , "bit-array"
335− , "bitcoin-rpc"
336− , "Bitly"
337− , "bitly-cli"
338− , "bits-conduit"
339− , "bitset"
340− , "bitspeak"
341− , "bitstream"
342− , "BitSyntax"
343− , "bittorrent"
344− , "bitvec"
345− , "bkr"
346− , "bla"
347− , "black-jewel"
348− , "blakesum"
349− , "blakesum-demo"
350− , "blank-canvas"
351− , "blas"
352− , "blas-hs"
353− , "blaze"
354− , "blaze-html-contrib"
355− , "blaze-html-hexpat"
356− , "blazeMarker"
357− , "blaze-textual-native"
358− , "Blobs"
359− , "blogination"
360− , "Blueprint"
361− , "bluetile"
362− , "board-games"
363− , "bogre-banana"
364− , "boolean-normal-forms"
365− , "bools"
366− , "boolsimplifier"
367− , "boomslang"
368− , "borel"
369− , "bot"
370− , "brainfuck-monad"
371− , "Bravo"
372− , "breakout"
373− , "brians-brain"
374− , "brillig"
375− , "broker-haskell"
376− , "bsd-sysctl"
377− , "bson-generics"
378− , "bson-mapping"
379− , "btree-concurrent"
380− , "buildbox-tools"
381− , "buildwrapper"
382− , "bullet"
383− , "buster"
384− , "Buster"
385− , "buster-gtk"
386− , "buster-network"
387− , "bytable"
388− , "bytestring-class"
389− , "bytestring-csv"
390− , "bytestringparser"
391− , "bytestring-plain"
392− , "bytestringreadp"
393− , "bytestring-rematch"
394− , "bytestring-short"
395− , "cabal2arch"
396− , "cabal2doap"
397− , "cabal2spec"
398− , "cabal-constraints"
399− , "cabal-debian"
400− , "cabal-dev"
401− , "cabal-ghci"
402− , "cabalgraph"
403− , "cabal-graphdeps"
404− , "cabal-install-bundle"
405− , "cabal-install-ghc72"
406− , "cabal-install-ghc74"
407− , "cabalmdvrpm"
408− , "cabal-query"
409− , "cabalrpmdeps"
410− , "cabal-scripts"
411− , "cabal-setup"
412− , "cabal-test"
413− , "cabal-upload"
414− , "cabocha"
415− , "cake3"
416− , "cakyrespa"
417− , "cal3d"
418− , "cal3d-examples"
419− , "cal3d-opengl"
420− , "calc"
421− , "caldims"
422− , "caledon"
423− , "call-haskell-from-anything"
424− , "campfire"
425− , "cantor"
426− , "cao"
427− , "cap"
428− , "Capabilities"
429− , "capri"
430− , "carboncopy"
431− , "carettah"
432− , "casadi-bindings"
433− , "casadi-bindings-control"
434− , "casadi-bindings-core"
435− , "casadi-bindings-internal"
436− , "casadi-bindings-ipopt-interface"
437− , "casadi-bindings-snopt-interface"
438− , "Cascade"
439− , "cascading"
440− , "cash"
441− , "cassandra-thrift"
442− , "cassava-streams"
443− , "cassy"
444− , "casui"
445− , "Catana"
446− , "catch-fd"
447− , "categorical-algebra"
448− , "category-extras"
449− , "CBOR"
450− , "CC-delcont"
451− , "CC-delcont-alt"
452− , "CC-delcont-cxe"
453− , "CC-delcont-exc"
454− , "CC-delcont-ref"
455− , "CC-delcont-ref-tf"
456− , "cci"
457− , "cctools-workqueue"
458− , "cedict"
459− , "ceilometer-common"
460− , "cereal-enumerator"
461− , "cereal-ieee754"
462− , "cereal-plus"
463− , "certificate"
464− , "cf"
465− , "cfipu"
466− , "cflp"
467− , "cfopu"
468− , "cgen"
469− , "cgi-utils"
470− , "chalkboard"
471− , "chalkboard-viewer"
472− , "charade"
473− , "chatter"
474− , "checked"
475− , "check-pvp"
476− , "chevalier-common"
477− , "Chitra"
478− , "chp"
479− , "chp-mtl"
480− , "chp-plus"
481− , "chp-spec"
482− , "chp-transformers"
483− , "ChristmasTree"
484− , "chuchu"
485− , "chunks"
486− , "church-list"
487− , "cil"
488− , "cinvoke"
489− , "c-io"
490− , "cio"
491− , "citation-resolve"
492− , "citeproc-hs"
493− , "citeproc-hs-pandoc-filter"
494− , "cjk"
495− , "clac"
496− , "clafer"
497− , "claferIG"
498− , "claferwiki"
499− , "CLASE"
500− , "clash"
501− , "clash-ghc" -- depends on broken package singletons-1.1.2.1
502− , "clash-prelude" -- depends on broken package singletons-1.1.2.1
503− , "clash-prelude-quickcheck" -- depends on broken package singletons-1.1.2.1
504− , "clash-systemverilog" -- depends on broken package singletons-1.1.2.1
505− , "clash-vhdl" -- depends on broken package singletons-1.1.2.1
506− , "ClassLaws"
507− , "ClassyPrelude"
508− , "clckwrks"
509− , "clckwrks-cli"
510− , "clckwrks-dot-com"
511− , "clckwrks-plugin-bugs"
512− , "clckwrks-plugin-ircbot"
513− , "clckwrks-plugin-media"
514− , "clckwrks-plugin-page"
515− , "clckwrks-theme-bootstrap"
516− , "clckwrks-theme-clckwrks"
517− , "clckwrks-theme-geo-bootstrap"
518− , "Clean"
519− , "clevercss"
520− , "clifford"
521− , "clipper"
522− , "clippings"
523− , "clocked"
524− , "clogparse"
525− , "clone-all"
526− , "cloudfront-signer"
527− , "cloud-haskell"
528− , "cloudyfs"
529− , "clua"
530− , "cluss"
531− , "clustering"
532− , "clustertools"
533− , "clutterhs"
534− , "cmaes"
535− , "cmath"
536− , "cmathml3"
537− , "CMCompare"
538− , "cmdargs-browser"
539− , "cmdtheline"
540− , "cmonad"
541− , "cnc-spec-compiler"
542− , "cndict"
543− , "Coadjute"
544− , "Codec-Image-DevIL"
545− , "codec-libevent"
546− , "codecov-haskell"
547− , "codemonitor"
548− , "codepad"
549− , "cognimeta-utils"
550− , "coinbase-exchange"
551− , "colada"
552− , "collada-output"
553− , "collada-types"
554− , "collections"
555− , "collections-api"
556− , "collections-base-instances"
557− , "coltrane"
558− , "com"
559− , "combinat"
560− , "combinat-diagrams"
561− , "combinatorial-problems"
562− , "combinator-interactive"
563− , "Combinatorrent"
564− , "Commando"
565− , "commodities"
566− , "commsec"
567− , "commsec-keyexchange"
568− , "comonad-extras"
569− , "comonad-random"
570− , "compact-map"
571− , "compact-string"
572− , "compensated"
573− , "compilation"
574− , "complexity"
575− , "compose-trans"
576− , "compression"
577− , "compstrat"
578− , "comptrans"
579− , "computational-algebra" -- depends on broken package singletons-1.1.2.1
580− , "concraft"
581− , "concraft-hr"
582− , "concraft-pl"
583− , "concrete-typerep"
584− , "concurrent-state"
585− , "ConcurrentUtils"
586− , "condor"
587− , "Condor"
588− , "condorcet"
589− , "conductive-clock"
590− , "conductive-hsc3"
591− , "conduit-audio-lame"
592− , "conduit-audio-samplerate"
593− , "conduit-iconv"
594− , "conduit-network-stream"
595− , "conduit-resumablesink"
596− , "Configger" -- depends on broken package MaybeT-0.1.2
597− , "config-select"
598− , "conjure"
599− , "consistent"
600− , "const-math-ghc-plugin"
601− , "constructive-algebra"
602− , "consul-haskell"
603− , "Consumer"
604− , "context-stack"
605− , "continue"
606− , "continuum"
607− , "continuum-client"
608− , "Contract"
609− , "control-event"
610− , "control-monad-attempt"
611− , "control-monad-exception-mtl"
612− , "control-monad-failure"
613− , "control-monad-failure-mtl"
614− , "Control-Monad-MultiPass"
615− , "Control-Monad-ST2"
616− , "contstuff-monads-tf"
617− , "contstuff-transformers"
618− , "convertible-ascii"
619− , "convertible-text"
620− , "copilot"
621− , "copilot-c99"
622− , "copilot-cbmc"
623− , "copilot-core"
624− , "copilot-language"
625− , "copilot-libraries"
626− , "copilot-sbv"
627− , "COrdering"
628− , "core"
629− , "corebot-bliki"
630− , "CoreErlang"
631− , "CoreFoundation"
632− , "core-haskell"
633− , "Coroutine"
634− , "coroutine-iteratee"
635− , "CouchDB"
636− , "couchdb-conduit"
637− , "couchdb-enumerator"
638− , "couch-hs"
639− , "court"
640− , "coverage"
641− , "CPBrainfuck"
642− , "cpio-conduit"
643− , "CPL"
644− , "cplusplus-th"
645− , "cpuperf"
646− , "cpython"
647− , "cqrs"
648− , "cqrs-example"
649− , "cqrs-postgresql"
650− , "cqrs-sqlite3"
651− , "cqrs-test"
652− , "cqrs-types"
653− , "cr"
654− , "crack"
655− , "Craft3e"
656− , "craftwerk"
657− , "craftwerk-cairo"
658− , "craftwerk-gtk"
659− , "crc16"
660− , "crf-chain1"
661− , "crf-chain1-constrained"
662− , "crf-chain2-generic"
663− , "crf-chain2-tiers"
664− , "criterion-plus"
665− , "crocodile"
666− , "crunghc"
667− , "crypto-cipher-benchmarks"
668− , "cryptsy-api"
669− , "crystalfontz" -- depends on broken package MaybeT-0.1.2
670− , "cse-ghc-plugin"
671− , "csound-catalog"
672− , "csound-expression"
673− , "csound-expression-opcodes"
674− , "csound-expression-typed"
675− , "csound-sampler"
676− , "csp"
677− , "cspmchecker"
678− , "CSPM-cspm"
679− , "CSPM-FiringRules"
680− , "CSPM-Frontend"
681− , "CSPM-Interpreter"
682− , "CSPM-ToProlog"
683− , "css"
684− , "ctemplate"
685− , "ctkl"
686− , "ctpl"
687− , "cudd"
688− , "curry-base"
689− , "CurryDB"
690− , "curry-frontend"
691− , "cursedcsv" -- depends on broken package hscurses-1.4.2.0
692− , "curves"
693− , "CV"
694− , "cypher"
695− , "dag" -- depends on broken package singletons-1.1.2.1
696− , "DAG-Tournament"
697− , "Dangerous" -- depends on broken package MaybeT-0.1.2
698− , "dao"
699− , "Dao"
700− , "dapi"
701− , "darcs2dot"
702− , "darcs-benchmark"
703− , "darcs-beta"
704− , "darcs-buildpackage"
705− , "darcs-cabalized"
706− , "darcsden"
707− , "darcs-fastconvert"
708− , "darcs-graph"
709− , "DarcsHelpers"
710− , "darcs-monitor"
711− , "darcs-scripts"
712− , "darcswatch"
713− , "darkplaces-demo"
714− , "data-cycle"
715− , "data-dispersal"
716− , "data-easy"
717− , "data-extra"
718− , "data-ivar"
719− , "data-lens-ixset"
720− , "datalog"
721− , "data-named"
722− , "data-nat"
723− , "data-object-json"
724− , "data-object-yaml"
725− , "data-quotientref"
726− , "data-rope"
727− , "Data-Rope"
728− , "data-store"
729− , "DataTreeView"
730− , "data-type"
731− , "dbjava"
732− , "DBus"
733− , "dbus-client"
734− , "dbus-core"
735− , "d-bus" -- depends on broken package singletons-1.1.2.1
736− , "dclabel"
737− , "ddc-build"
738− , "ddc-core"
739− , "ddc-core-eval"
740− , "ddc-core-flow"
741− , "ddc-core-llvm"
742− , "ddc-core-salt"
743− , "ddc-core-simpl"
744− , "ddc-core-tetra"
745− , "ddc-driver"
746− , "ddci-core"
747− , "ddc-source-tetra"
748− , "ddc-tools"
749− , "Deadpan-DDP"
750− , "dead-simple-json"
751− , "decepticons"
752− , "DecisionTree"
753− , "decoder-conduit"
754− , "dedukti"
755− , "deeplearning-hs"
756− , "deepseq-bounded"
757− , "deepseq-th"
758− , "deepzoom"
759− , "defargs"
760− , "DefendTheKing" -- depends on broken package MaybeT-0.1.2
761− , "definitive-base"
762− , "definitive-filesystem"
763− , "definitive-graphics"
764− , "definitive-parser"
765− , "definitive-reactive"
766− , "definitive-sound"
767− , "dejafu"
768− , "deka"
769− , "deka-tests"
770− , "delicious"
771− , "delta-h"
772− , "demarcate"
773− , "denominate"
774− , "depends"
775− , "dephd"
776− , "dequeue"
777− , "derangement"
778− , "derivation-trees"
779− , "derive-gadt"
780− , "derive-IG"
781− , "derive-topdown"
782− , "derive-trie"
783− , "derp-lib"
784− , "dewdrop"
785− , "Dflow"
786− , "dfsbuild"
787− , "dgim"
788− , "dgs"
789− , "diagrams-canvas"
790− , "diagrams-pdf"
791− , "diagrams-pgf"
792− , "diagrams-qrcode"
793− , "diagrams-tikz"
794− , "dice-entropy-conduit"
795− , "dicom"
796− , "dictparser"
797− , "diffcabal"
798− , "DifferenceLogic"
799− , "DifferentialEvolution"
800− , "digestive-functors-hsp"
801− , "DimensionalHash"
802− , "dingo-core"
803− , "dingo-example"
804− , "dingo-widgets"
805− , "diophantine"
806− , "diplomacy-server"
807− , "direct-binary-files"
808− , "directed-cubical"
809− , "direct-fastcgi"
810− , "direct-http"
811− , "direct-plugins"
812− , "DirectSound" -- depends on broken package Win32-2.3.1.0
813− , "dirfiles"
814− , "discount"
815− , "disjoint-set"
816− , "DisTract"
817− , "distributed-process-async"
818− , "distributed-process-azure"
819− , "distributed-process-client-server"
820− , "distributed-process-execution"
821− , "distributed-process-extras"
822− , "distributed-process-platform"
823− , "distributed-process-registry"
824− , "distributed-process-supervisor"
825− , "distributed-process-task"
826− , "distributed-process-tests"
827− , "distributed-process-zookeeper"
828− , "distribution"
829− , "distribution-plot"
830− , "dist-upload"
831− , "djinn-th"
832− , "DnaProteinAlignment"
833− , "dnscache"
834− , "dnssd"
835− , "doccheck"
836− , "docidx"
837− , "docker"
838− , "dockercook"
839− , "doc-review"
840− , "DocTest"
841− , "doctest-discover"
842− , "doctest-discover-configurator"
843− , "DOM"
844− , "download"
845− , "download-media-content"
846− , "DP"
847− , "dph-examples"
848− , "dph-lifted-base"
849− , "dph-lifted-copy"
850− , "dph-lifted-vseg"
851− , "dph-par"
852− , "dph-prim-par"
853− , "dph-prim-seq"
854− , "dph-seq"
855− , "DPM"
856− , "drClickOn"
857− , "DrHylo"
858− , "DrIFT"
859− , "DrIFT-cabalized"
860− , "drifter-postgresql"
861− , "dropbox-sdk"
862− , "dropsolve"
863− , "ds-kanren"
864− , "dsmc"
865− , "dsmc-tools"
866− , "dsp"
867− , "DSTM"
868− , "dstring"
869− , "DTC"
870− , "dtd"
871− , "dtd-text"
872− , "dtd-types"
873− , "duplo"
874− , "Dust"
875− , "Dust-crypto"
876− , "Dust-tools"
877− , "Dust-tools-pcap"
878− , "dvda"
879− , "dvdread"
880− , "dx9base" -- depends on broken package Win32-2.3.1.0
881− , "dx9d3d" -- depends on broken package Win32-2.3.1.0
882− , "dx9d3dx" -- depends on broken package Win32-2.3.1.0
883− , "dynamic-object"
884− , "dynamic-plot"
885− , "dynamic-pp"
886− , "DynamicTimeWarp"
887− , "dynobud"
888− , "DysFRP-Cairo"
889− , "DysFRP-Craftwerk"
890− , "easy-api"
891− , "easyjson"
892− , "easyplot"
893− , "easyrender"
894− , "ecdsa"
895− , "ecu"
896− , "edenmodules"
897− , "edenskel"
898− , "edentv"
899− , "edge"
900− , "EdisonCore"
901− , "edit-lenses"
902− , "editline"
903− , "EditTimeReport"
904− , "EEConfig"
905− , "effective-aspects"
906− , "effective-aspects-mzv"
907− , "effect-monad"
908− , "egison-quote"
909− , "ehaskell"
910− , "ehs"
911− , "eibd-client-simple"
912− , "eithers"
913− , "EitherT"
914− , "email"
915− , "email-header"
916− , "email-postmark"
917− , "embeddock"
918− , "embeddock-example"
919− , "embroidery"
920− , "emgm"
921− , "Emping"
922− , "empty"
923− , "Encode"
924− , "enumfun"
925− , "EnumMap"
926− , "enummapmap"
927− , "env-parser"
928− , "epoll"
929− , "epubname"
930− , "Eq"
931− , "equational-reasoning" -- depends on broken package singletons-1.1.2.1
932− , "erlang"
933− , "eros-client"
934− , "error-message"
935− , "ersatz"
936− , "ersatz-toysat"
937− , "esotericbot"
938− , "EsounD"
939− , "estimators"
940− , "estreps"
941− , "Etage"
942− , "Etage-Graph"
943− , "EtaMOO"
944− , "eternal"
945− , "Eternal10Seconds"
946− , "Etherbunny"
947− , "ethereum-client-haskell"
948− , "ethereum-merkle-patricia-db"
949− , "euphoria"
950− , "eurofxref"
951− , "Euterpea"
952− , "event-driven"
953− , "event-monad"
954− , "EventSocket"
955− , "every-bit-counts"
956− , "ewe"
957− , "exif"
958− , "exists"
959− , "expand"
960− , "expat-enumerator"
961− , "explain"
962− , "explicit-sharing"
963− , "explore"
964− , "exposed-containers"
965− , "exp-pairs"
966− , "extcore"
967− , "extemp" -- depends on broken package MaybeT-0.1.2
968− , "extended-categories"
969− , "external-sort"
970− , "ez-couch"
971− , "faceted"
972− , "factual-api"
973− , "FailureT"
974− , "fallingblocks"
975− , "falling-turnip"
976− , "fastirc"
977− , "fast-tags"
978− , "fault-tree"
979− , "fay-hsx"
980− , "fcd"
981− , "fckeditor"
982− , "FComp"
983− , "fdo-trash"
984− , "feed2lj"
985− , "feed2twitter"
986− , "feed-cli"
987− , "feldspar-compiler"
988− , "feldspar-language"
989− , "fences"
990− , "fenfire"
991− , "FermatsLastMargin"
992− , "FerryCore"
993− , "ffeed"
994− , "ffmpeg-tutorials"
995− , "fibon"
996− , "fields"
997− , "FieldTrip"
998− , "fieldwise"
999− , "FileManip"
1000− , "FileManipCompat"
1001− , "FileSystem"
1002− , "filesystem-conduit"
1003− , "filesystem-enumerator"
1004− , "Finance-Quote-Yahoo"
1005− , "Finance-Treasury"
1006− , "find-conduit"
1007− , "FiniteMap"
1008− , "firstify"
1009− , "FirstOrderTheory"
1010− , "fit"
1011− , "fitsio"
1012− , "fixed-point"
1013− , "fixed-point-vector"
1014− , "fixed-point-vector-space"
1015− , "fixed-precision"
1016− , "fixed-storable-array"
1017− , "fix-parser-simple"
1018− , "fixplate"
1019− , "fix-symbols-gitit"
1020− , "flexiwrap"
1021− , "flexiwrap-smallcheck"
1022− , "flickr"
1023− , "Flippi"
1024− , "flite"
1025− , "flo"
1026− , "floating-bits"
1027− , "flow2dot"
1028− , "flowdock-api"
1029− , "flower"
1030− , "flowlocks-framework"
1031− , "flowsim"
1032− , "FModExRaw"
1033− , "FM-SBLEX"
1034− , "foldl-incremental"
1035− , "foldl-transduce"
1036− , "folds"
1037− , "folds-common"
1038− , "follower"
1039− , "Folly"
1040− , "foma"
1041− , "font-opengl-basic4x6"
1042− , "foo"
1043− , "forbidden-fruit"
1044− , "fordo"
1045− , "for-free"
1046− , "formal"
1047− , "FormalGrammars"
1048− , "format"
1049− , "format-status"
1050− , "forml"
1051− , "formlets"
1052− , "formlets-hsp"
1053− , "ForSyDe"
1054− , "forth-hll"
1055− , "Foster"
1056− , "fpco-api"
1057− , "fpnla-examples"
1058− , "FPretty"
1059− , "frag"
1060− , "franchise"
1061− , "Frank"
1062− , "free-game"
1063− , "freekick2"
1064− , "free-operational"
1065− , "freesect"
1066− , "freesound"
1067− , "free-theorems"
1068− , "free-theorems-counterexamples"
1069− , "free-theorems-seq"
1070− , "free-theorems-seq-webui"
1071− , "free-theorems-webui"
1072− , "FreeTypeGL"
1073− , "frp-arduino"
1074− , "fs-events"
1075− , "fsmActions"
1076− , "ftdi"
1077− , "ftp-conduit"
1078− , "ftshell"
1079− , "full-sessions"
1080− , "fullstop"
1081− , "full-text-search"
1082− , "functional-arrow"
1083− , "function-combine"
1084− , "functor-apply"
1085− , "functorm"
1086− , "funion"
1087− , "funsat"
1088− , "future"
1089− , "fuzzytime"
1090− , "gact"
1091− , "gameclock"
1092− , "game-of-life" -- depends on broken package hscurses-1.4.2.0
1093− , "Ganymede"
1094− , "gc-monitoring-wai"
1095− , "gdiff-ig"
1096− , "gdiff-th"
1097− , "GeBoP"
1098− , "geek"
1099− , "geek-server"
1100− , "gemstone"
1101− , "gencheck"
1102− , "gender"
1103− , "genders"
1104− , "general-prelude"
1105− , "GeneralTicTacToe"
1106− , "generators"
1107− , "generic-church"
1108− , "genericserialize"
1109− , "generic-storable"
1110− , "generic-xml"
1111− , "genetics"
1112− , "GenI"
1113− , "geniconvert"
1114− , "geni-gui"
1115− , "geniserver"
1116− , "geni-util"
1117− , "GenSmsPdu"
1118− , "GenussFold"
1119− , "geodetics"
1120− , "GeoIp"
1121− , "GeomPredicates-SSE"
1122− , "getemx"
1123− , "getflag"
1124− , "ggtsTC"
1125− , "ghc-dup"
1126− , "ghc-events-analyze"
1127− , "ghc-events-parallel"
1128− , "ghci-haskeline"
1129− , "ghc-imported-from"
1130− , "ghci-ng"
1131− , "ghclive"
1132− , "ghc-parmake"
1133− , "ghc-pkg-autofix"
1134− , "ghc-pkg-lib"
1135− , "ghc-server"
1136− , "ghc-syb"
1137− , "GHood"
1138− , "ght"
1139− , "ginsu"
1140− , "gist"
1141− , "git-all"
1142− , "git-checklist"
1143− , "git-date"
1144− , "gitdo"
1145− , "git-gpush"
1146− , "github-webhook-handler"
1147− , "github-webhook-handler-snap"
1148− , "gitlib-cross"
1149− , "gitlib-s3"
1150− , "gitlib-utils"
1151− , "git-repair"
1152− , "gitson"
1153− , "glade"
1154− , "gladexml-accessor"
1155− , "GLFW-OGL"
1156− , "glider-nlp"
1157− , "global"
1158− , "glome-hs"
1159− , "GlomeTrace"
1160− , "GlomeView"
1161− , "gloss-devil"
1162− , "gmap"
1163− , "gmndl"
1164− , "gnome-desktop"
1165− , "gnome-keyring"
1166− , "gnomevfs"
1167− , "g-npm"
1168− , "goa"
1169− , "goatee"
1170− , "goatee-gtk"
1171− , "gofer-prelude"
1172− , "google-html5-slide"
1173− , "google-mail-filters"
1174− , "googleplus"
1175− , "GoogleSB"
1176− , "google-search"
1177− , "gopherbot"
1178− , "gpah"
1179− , "GPipe"
1180− , "GPipe-Collada"
1181− , "GPipe-Examples"
1182− , "GPipe-TextureLoad"
1183− , "gps"
1184− , "gps2htmlReport"
1185− , "GPX"
1186− , "gpx-conduit"
1187− , "GrammarProducts"
1188− , "grapefruit-examples"
1189− , "grapefruit-frp"
1190− , "grapefruit-records"
1191− , "grapefruit-ui"
1192− , "grapefruit-ui-gtk"
1193− , "Graph500"
1194− , "graphbuilder"
1195− , "GraphHammer"
1196− , "GraphHammer-examples"
1197− , "graphicsFormats"
1198− , "graphics-formats-collada"
1199− , "graphicstools"
1200− , "graph-rewriting"
1201− , "graph-rewriting-cl"
1202− , "graph-rewriting-gl"
1203− , "graph-rewriting-lambdascope"
1204− , "graph-rewriting-layout"
1205− , "graph-rewriting-ski"
1206− , "graph-rewriting-strategies"
1207− , "graph-rewriting-trs"
1208− , "graph-rewriting-ww"
1209− , "graphtype"
1210− , "graph-utils"
1211− , "greencard"
1212− , "greencard-lib"
1213− , "greg-client"
1214− , "Grempa"
1215− , "grm"
1216− , "Grow"
1217− , "GrowlNotify"
1218− , "gruff"
1219− , "gruff-examples"
1220− , "gsl-random"
1221− , "gsl-random-fu"
1222− , "gsmenu"
1223− , "gstreamer"
1224− , "GTALib"
1225− , "gtfs"
1226− , "gtk2hs-cast-glade"
1227− , "gtk2hs-cast-gnomevfs"
1228− , "gtk2hs-cast-gtk"
1229− , "gtk2hs-cast-gtkglext"
1230− , "Gtk2hsGenerics"
1231− , "gtk2hs-rpn"
1232− , "gtk3-mac-integration"
1233− , "gtkglext"
1234− , "GtkGLTV"
1235− , "gtkimageview"
1236− , "gtk-mac-integration"
1237− , "gtkrsync"
1238− , "gtk-serialized-event"
1239− , "gtk-toy"
1240− , "guess-combinator"
1241− , "GuiHaskell"
1242− , "GuiTV"
1243− , "haar"
1244− , "Hach"
1245− , "hack2-handler-happstack-server"
1246− , "hack2-handler-mongrel2-http"
1247− , "hack2-handler-warp"
1248− , "hack2-interface-wai"
1249− , "hackage2hwn"
1250− , "hackage2twitter"
1251− , "hackage-proxy"
1252− , "hackage-server"
1253− , "hackage-sparks"
1254− , "hack-contrib"
1255− , "hack-contrib-press"
1256− , "hackernews"
1257− , "hack-frontend-happstack"
1258− , "hack-handler-epoll"
1259− , "hack-handler-evhttp"
1260− , "hack-handler-fastcgi"
1261− , "hack-handler-happstack"
1262− , "hack-handler-hyena"
1263− , "hack-handler-kibro"
1264− , "hack-handler-simpleserver"
1265− , "HackMail"
1266− , "hack-middleware-cleanpath"
1267− , "hack-middleware-clientsession"
1268− , "hack-middleware-jsonp"
1269− , "hackport"
1270− , "hactor"
1271− , "haddock-leksah"
1272− , "haddocset"
1273− , "haggis"
1274− , "Haggressive"
1275− , "hairy"
1276− , "hakaru"
1277− , "hakismet"
1278− , "hakyll-blaze-templates"
1279− , "hakyll-contrib"
1280− , "hakyll-contrib-links"
1281− , "hakyll-convert"
1282− , "hakyll-elm" -- depends on broken package Elm-0.13
1283− , "hakyll-R"
1284− , "halberd"
1285− , "HaLeX"
1286− , "halfs"
1287− , "halipeto"
1288− , "hampp"
1289− , "hamtmap"
1290− , "hamusic"
1291− , "handle-like"
1292− , "happindicator"
1293− , "happindicator3"
1294− , "happraise"
1295− , "HAppS-Data"
1296− , "HAppSHelpers"
1297− , "happs-hsp"
1298− , "happs-hsp-template"
1299− , "HAppS-IxSet"
1300− , "HAppS-Server"
1301− , "HAppS-State"
1302− , "happstack-auth"
1303− , "happstack-authenticate"
1304− , "happstack-contrib"
1305− , "happstack-data"
1306− , "happstack-dlg"
1307− , "happstack-facebook"
1308− , "happstack-fay"
1309− , "happstack-heist"
1310− , "happstack-helpers"
1311− , "happstack-ixset"
1312− , "happstack-monad-peel"
1313− , "happstack-plugins"
1314− , "happstack-state"
1315− , "happstack-util"
1316− , "happstack-yui"
1317− , "happs-tutorial"
1318− , "HAppS-Util"
1319− , "happybara"
1320− , "happybara-webkit"
1321− , "happybara-webkit-server"
1322− , "harchive"
1323− , "HaRe"
1324− , "hark"
1325− , "HARM"
1326− , "HarmTrace"
1327− , "HarmTrace-Base"
1328− , "has"
1329− , "hascal"
1330− , "hascat"
1331− , "hascat-lib"
1332− , "hascat-setup"
1333− , "hascat-system"
1334− , "Haschoo"
1335− , "HasGP"
1336− , "hash"
1337− , "hashable-generics"
1338− , "hashed-storage"
1339− , "Hashell"
1340− , "hasim"
1341− , "hask"
1342− , "haskarrow"
1343− , "haskeem"
1344− , "haskeline-class"
1345− , "haskell2010"
1346− , "haskell98"
1347− , "haskell-aliyun"
1348− , "haskell-awk"
1349− , "haskell-bcrypt"
1350− , "haskell-brainfuck"
1351− , "haskell-cnc"
1352− , "haskell-course-preludes"
1353− , "haskelldb-connect-hdbc"
1354− , "haskelldb-connect-hdbc-catchio-mtl"
1355− , "haskelldb-connect-hdbc-catchio-tf"
1356− , "haskelldb-connect-hdbc-catchio-transformers"
1357− , "haskelldb-connect-hdbc-lifted"
1358− , "haskelldb-dynamic"
1359− , "haskelldb-hdbc-mysql"
1360− , "haskelldb-hsql"
1361− , "haskelldb-hsql-mysql"
1362− , "haskelldb-hsql-odbc"
1363− , "haskelldb-hsql-postgresql"
1364− , "haskelldb-hsql-sqlite3"
1365− , "haskelldb-wx"
1366− , "haskell-docs"
1367− , "haskell-formatter"
1368− , "haskell-ftp"
1369− , "haskell-in-space"
1370− , "haskell-neo4j-client"
1371− , "HaskellNN"
1372− , "Haskelloids"
1373− , "haskell-openflow"
1374− , "haskell-pdf-presenter"
1375− , "haskell-platform-test"
1376− , "haskell-plot"
1377− , "haskell-reflect"
1378− , "haskell-rules"
1379− , "haskellscrabble"
1380− , "haskell-src-meta-mwotton"
1381− , "haskell-token-utils"
1382− , "HaskellTorrent"
1383− , "haskell-type-exts"
1384− , "haskell-tyrant"
1385− , "haskell-xmpp"
1386− , "haskelm" -- depends on broken package Elm-0.13
1387− , "haskgame"
1388− , "haskheap"
1389− , "haskhol-core"
1390− , "hask-home"
1391− , "haskoin"
1392− , "haskoin-crypto"
1393− , "haskoin-protocol"
1394− , "haskoin-script"
1395− , "haskoin-util"
1396− , "haskoin-wallet"
1397− , "haskoon" -- depends on broken package MaybeT-0.1.2
1398− , "haskoon-httpspec" -- depends on broken package MaybeT-0.1.2
1399− , "haskoon-salvia" -- depends on broken package MaybeT-0.1.2
1400− , "haskore"
1401− , "haskore-realtime"
1402− , "haskore-supercollider"
1403− , "haskore-synthesizer"
1404− , "haskore-vintage"
1405− , "haslo"
1406− , "hasloGUI"
1407− , "hasparql-client"
1408− , "hastache-aeson"
1409− , "haste-compiler"
1410− , "haste-perch"
1411− , "has-th"
1412− , "hatex-guide"
1413− , "HaTeX-meta"
1414− , "haverer"
1415− , "HaVSA" -- depends on broken package QuickCheck-1.2.0.1
1416− , "hawitter"
1417− , "Hawk"
1418− , "haxparse"
1419− , "hayland"
1420− , "Hayoo"
1421− , "hayoo-cli"
1422− , "hback"
1423− , "hbayes"
1424− , "hbb"
1425− , "hBDD-CMUBDD"
1426− , "hBDD-CUDD"
1427− , "hbeat"
1428− , "hblas"
1429− , "hblock"
1430− , "h-booru" -- depends on broken package singletons-1.1.2.1
1431− , "hburg"
1432− , "HCard"
1433− , "hcheat"
1434− , "hchesslib"
1435− , "HCL"
1436− , "hcron"
1437− , "hCsound"
1438− , "hcube"
1439− , "hdaemonize-buildfix"
1440− , "HDBC-mysql"
1441− , "hdbi"
1442− , "hdbi-conduit"
1443− , "hdbi-postgresql"
1444− , "hdbi-sqlite"
1445− , "hdbi-tests"
1446− , "hDFA"
1447− , "hdigest"
1448− , "hdirect"
1449− , "hdis86"
1450− , "hdiscount"
1451− , "hdm"
1452− , "hdph"
1453− , "hdph-closure"
1454− , "HDRUtils"
1455− , "hecc"
1456− , "Hedi"
1457− , "hedn"
1458− , "heist-aeson"
1459− , "helics"
1460− , "helics-wai"
1461− , "helium"
1462− , "hell"
1463− , "hellage"
1464− , "hellnet"
1465− , "helm"
1466− , "hemkay"
1467− , "hen"
1468− , "henet"
1469− , "hepevt"
1470− , "HERA"
1471− , "herbalizer"
1472− , "her-lexer"
1473− , "her-lexer-parsec"
1474− , "Hermes"
1475− , "hermit"
1476− , "hermit-syb"
1477− , "herringbone"
1478− , "herringbone-embed"
1479− , "herringbone-wai"
1480− , "hesql"
1481− , "hetris" -- depends on broken package hscurses-1.4.2.0
1482− , "heukarya"
1483− , "hevolisa"
1484− , "hevolisa-dph"
1485− , "hexpat-iteratee"
1486− , "hexpat-pickle-generic"
1487− , "hexquote"
1488− , "hF2"
1489− , "hfann"
1490− , "hfd"
1491− , "hfiar"
1492− , "hfractal"
1493− , "HFrequencyQueue"
1494− , "hfsevents"
1495− , "hfusion"
1496− , "hgalib"
1497− , "HGamer3D-API" -- depends on broken package HGamer3D-Data-0.5.0
1498− , "HGamer3D-Audio" -- depends on broken package HGamer3D-Data-0.5.0
1499− , "HGamer3D-CAudio-Binding" -- depends on broken package HGamer3D-Data-0.5.0
1500− , "HGamer3D-CEGUI-Binding" -- depends on broken package HGamer3D-Data-0.5.0
1501− , "HGamer3D" -- depends on broken package HGamer3D-Data-0.5.0
1502− , "HGamer3D-Enet-Binding" -- depends on broken package HGamer3D-Data-0.5.0
1503− , "HGamer3D-Graphics3D" -- depends on broken package HGamer3D-Data-0.5.0
1504− , "HGamer3D-GUI" -- depends on broken package HGamer3D-Data-0.5.0
1505− , "HGamer3D-InputSystem" -- depends on broken package HGamer3D-Data-0.5.0
1506− , "HGamer3D-Network" -- depends on broken package HGamer3D-Data-0.5.0
1507− , "HGamer3D-Ogre-Binding" -- depends on broken package HGamer3D-Data-0.5.0
1508− , "HGamer3D-OIS-Binding" -- depends on broken package HGamer3D-Data-0.5.0
1509− , "HGamer3D-SDL2-Binding" -- depends on broken package HGamer3D-Data-0.5.0
1510− , "HGamer3D-SFML-Binding" -- depends on broken package HGamer3D-Data-0.5.0
1511− , "HGamer3D-WinEvent" -- depends on broken package HGamer3D-Data-0.5.0
1512− , "HGamer3D-Wire" -- depends on broken package HGamer3D-Data-0.5.0
1513− , "hg-buildpackage"
1514− , "hgen"
1515− , "hgeometric"
1516− , "hgithub"
1517− , "HGL"
1518− , "hgom"
1519− , "h-gpgme"
1520− , "HGraphStorage"
1521− , "hharp"
1522− , "HHDL"
1523− , "hiccup"
1524− , "hichi"
1525− , "hieraclus"
1526− , "hierarchical-clustering-diagrams"
1527− , "hiernotify"
1528− , "Hieroglyph"
1529− , "HiggsSet"
1530− , "higherorder"
1531− , "highWaterMark"
1532− , "himg"
1533− , "himpy"
1534− , "hinduce-classifier"
1535− , "hinduce-classifier-decisiontree"
1536− , "hinduce-examples"
1537− , "hinvaders"
1538− , "hinze-streams"
1539− , "hipbot"
1540− , "hircules"
1541− , "hirt"
1542− , "hissmetrics"
1543− , "historian"
1544− , "hist-pl"
1545− , "hist-pl-fusion"
1546− , "hist-pl-lmf"
1547− , "hjs"
1548− , "HJVM"
1549− , "hlatex"
1550− , "hlbfgsb"
1551− , "hlcm"
1552− , "HLearn-algebra" -- depends on broken package ConstraintKinds-1.3.0
1553− , "HLearn-datastructures" -- depends on broken package ConstraintKinds-1.3.0
1554− , "hledger-chart"
1555− , "hledger-vty"
1556− , "hlibev"
1557− , "hlibfam"
1558− , "HListPP"
1559− , "hlogger"
1560− , "HLogger"
1561− , "hly"
1562− , "hmark"
1563− , "hmarkup"
1564− , "hmatrix-banded"
1565− , "hmatrix-gsl-stats"
1566− , "hmatrix-quadprogpp"
1567− , "hmatrix-static"
1568− , "hmatrix-syntax"
1569− , "hmatrix-tests"
1570− , "hmeap"
1571− , "hmeap-utils"
1572− , "hmenu"
1573− , "hmk"
1574− , "HMM"
1575− , "hmm-hmatrix"
1576− , "hMollom"
1577− , "hmp3"
1578− , "Hmpf"
1579− , "hmpfr"
1580− , "hmumps"
1581− , "HNM"
1582− , "hnn"
1583− , "hoauth"
1584− , "hob"
1585− , "hobbes"
1586− , "hobbits"
1587− , "HODE"
1588− , "hofix-mtl"
1589− , "hog"
1590− , "hogg"
1591− , "hogre"
1592− , "hogre-examples"
1593− , "hois"
1594− , "hole"
1595− , "holey-format"
1596− , "Holumbus-Distribution"
1597− , "Holumbus-MapReduce"
1598− , "Holumbus-Searchengine"
1599− , "Holumbus-Storage"
1600− , "homeomorphic"
1601− , "hommage"
1602− , "hommage-ds" -- depends on broken package Win32-2.3.1.0
1603− , "HongoDB"
1604− , "honi"
1605− , "hoodie"
1606− , "hoodle"
1607− , "hoodle-builder"
1608− , "hoodle-core"
1609− , "hoodle-extra"
1610− , "hoodle-parser"
1611− , "hoodle-publish"
1612− , "hoodle-render"
1613− , "hoodle-types"
1614− , "hood-off"
1615− , "hoovie"
1616− , "hopencc"
1617− , "hopencl"
1618− , "hOpenPGP"
1619− , "hopfield"
1620− , "hoq"
1621− , "hosts-server"
1622− , "hotswap"
1623− , "hp2any-core"
1624− , "hp2any-graph"
1625− , "hp2any-manager"
1626− , "hpage"
1627− , "hpapi"
1628− , "hpaste"
1629− , "hpasteit"
1630− , "HPath"
1631− , "hpc-coveralls"
1632− , "hpc-tracer"
1633− , "hPDB-examples"
1634− , "hplayground"
1635− , "hplaylist"
1636− , "HPlot"
1637− , "hpodder"
1638− , "HPong"
1639− , "hprotoc-fork"
1640− , "hps-cairo"
1641− , "hpygments"
1642− , "hpylos"
1643− , "hR"
1644− , "hranker"
1645− , "HRay"
1646− , "Hricket"
1647− , "HROOT"
1648− , "HROOT-core"
1649− , "HROOT-graf"
1650− , "HROOT-hist"
1651− , "HROOT-io"
1652− , "HROOT-math"
1653− , "hs2bf"
1654− , "hs2dot"
1655− , "Hs2lib"
1656− , "hsbackup"
1657− , "hsc2hs"
1658− , "hsc3-cairo"
1659− , "hsc3-data"
1660− , "hsc3-forth"
1661− , "hsc3-graphs"
1662− , "hsc3-lang"
1663− , "hsc3-lisp"
1664− , "hsc3-plot"
1665− , "hsc3-rec"
1666− , "hsc3-server"
1667− , "hsc3-unsafe"
1668− , "hscamwire"
1669− , "hs-carbon-examples"
1670− , "hscassandra"
1671− , "hs-cdb"
1672− , "hsclock"
1673− , "hscurses-fish-ex" -- depends on broken package hscurses-1.4.2.0
1674− , "hsdip"
1675− , "hsdns-cache"
1676− , "hs-dotnet"
1677− , "Hsed"
1678− , "hsfacter"
1679− , "HSFFIG"
1680− , "hs-ffmpeg"
1681− , "hs-fltk"
1682− , "hs-gchart"
1683− , "hs-GeoIP"
1684− , "HSGEP"
1685− , "hsgnutls"
1686− , "hsgnutls-yj"
1687− , "hsgsom"
1688− , "HsHaruPDF"
1689− , "HSHHelpers"
1690− , "HsHyperEstraier"
1691− , "hsignal"
1692− , "hSimpleDB"
1693− , "hs-java"
1694− , "hs-json-rpc"
1695− , "HsJudy"
1696− , "hskeleton"
1697− , "hslackbuilder"
1698− , "hslibsvm"
1699− , "hslogger4j"
1700− , "hs-logo"
1701− , "hslogstash"
1702− , "hsmagick"
1703− , "HSmarty"
1704− , "hs-mesos"
1705− , "Hsmtlib"
1706− , "hsmtpclient"
1707− , "hsndfile-storablevector"
1708− , "hsnock"
1709− , "hs-nombre-generator"
1710− , "hsns"
1711− , "hsntp"
1712− , "hsoptions"
1713− , "HSoundFile"
1714− , "hsparql"
1715− , "hsp-cgi"
1716− , "hspear"
1717− , "hspec-experimental"
1718− , "hspec-shouldbe"
1719− , "hspec-snap"
1720− , "HsPerl5"
1721− , "hs-pgms"
1722− , "hs-pkpass"
1723− , "hspread"
1724− , "hspresent"
1725− , "hsprocess"
1726− , "hsql-mysql"
1727− , "hsqml-datamodel"
1728− , "hsqml-demo-morris"
1729− , "hsqml-demo-samples"
1730− , "hsqml-morris"
1731− , "hsSqlite3"
1732− , "HsSVN"
1733− , "hstatistics"
1734− , "hstats"
1735− , "hstest"
1736− , "hstidy"
1737− , "hstorchat"
1738− , "hstradeking"
1739− , "HStringTemplateHelpers"
1740− , "hs-twitter"
1741− , "hs-twitterarchiver"
1742− , "hstyle"
1743− , "hstzaar"
1744− , "hsubconvert"
1745− , "hs-vcard"
1746− , "HSvm"
1747− , "hswip"
1748− , "hsx"
1749− , "hsXenCtrl"
1750− , "hsx-xhtml"
1751− , "hsyscall"
1752− , "hszephyr"
1753− , "HTab"
1754− , "hTalos"
1755− , "hTensor"
1756− , "HTicTacToe"
1757− , "html-entities"
1758− , "htoml"
1759− , "htsn-import"
1760− , "http-client-request-modifiers"
1761− , "http-conduit-browser"
1762− , "http-conduit-downloader"
1763− , "http-enumerator"
1764− , "http-monad"
1765− , "http-proxy"
1766− , "https-everywhere-rules"
1767− , "http-shed"
1768− , "HTTP-Simple"
1769− , "httpspec"
1770− , "http-test"
1771− , "htune"
1772− , "hubris"
1773− , "hugs2yc"
1774− , "hulk"
1775− , "hums"
1776− , "HUnit-Diff"
1777− , "hunit-gui"
1778− , "HUnit-Plus"
1779− , "hunit-rematch"
1780− , "hunt-searchengine"
1781− , "hurdle"
1782− , "husk-scheme"
1783− , "husk-scheme-libs"
1784− , "husky"
1785− , "hutton"
1786− , "huzzy"
1787− , "hVOIDP"
1788− , "hws"
1789− , "HXMPP"
1790− , "hxmppc"
1791− , "hxournal"
1792− , "HXQ"
1793− , "hxt-binary"
1794− , "hxt-filter"
1795− , "hxthelper"
1796− , "hxweb"
1797− , "hybrid"
1798− , "hybrid-vectors"
1799− , "hydra-hs"
1800− , "hydrogen-cli-args"
1801− , "hydrogen-data"
1802− , "hydrogen-parsing"
1803− , "hydrogen-prelude"
1804− , "hydrogen-prelude-parsec"
1805− , "hydrogen-util"
1806− , "hyena"
1807− , "hylolib"
1808− , "hylotab"
1809− , "hyloutils"
1810− , "hyperdrive"
1811− , "hyperloglog"
1812− , "hyperpublic"
1813− , "hypher"
1814− , "i18n"
1815− , "iban"
1816− , "ideas"
1817− , "ideas-math"
1818− , "idiii"
1819− , "idna2008"
1820− , "IDynamic"
1821− , "ieee-utils"
1822− , "iException"
1823− , "IFS"
1824− , "ige-mac-integration"
1825− , "igraph"
1826− , "ihttp"
1827− , "illuminate"
1828− , "imagepaste"
1829− , "imbib"
1830− , "imgurder"
1831− , "imm"
1832− , "imparse"
1833− , "ImperativeHaskell"
1834− , "implicit"
1835− , "improve"
1836− , "INblobs"
1837− , "inch"
1838− , "include-file"
1839− , "incremental-computing"
1840− , "incremental-sat-solver"
1841− , "increments"
1842− , "index-core"
1843− , "indices"
1844− , "indieweb-algorithms"
1845− , "infer-upstream"
1846− , "infinity"
1847− , "infix"
1848− , "InfixApplicative"
1849− , "inflist"
1850− , "informative"
1851− , "inilist"
1852− , "instant-zipper"
1853− , "integer-pure"
1854− , "intel-aes"
1855− , "interleavableGen"
1856− , "interleavableIO"
1857− , "internetmarke"
1858− , "interpolatedstring-qq"
1859− , "interpolatedstring-qq-mwotton"
1860− , "intricacy" -- depends on broken package hscurses-1.4.2.0
1861− , "intset"
1862− , "IOR"
1863− , "io-reactive"
1864− , "IORefCAS"
1865− , "iotransaction"
1866− , "ipatch"
1867− , "ipc"
1868− , "ipopt-hs"
1869− , "iptables-helpers"
1870− , "iptadmin"
1871− , "Irc"
1872− , "ircbouncer"
1873− , "ireal"
1874− , "IrrHaskell"
1875− , "isevaluated"
1876− , "ismtp"
1877− , "iteratee"
1878− , "iteratee-compress"
1879− , "iteratee-parsec"
1880− , "iteratee-stm"
1881− , "iterIO"
1882− , "iterio-server"
1883− , "iter-stats"
1884− , "ivor"
1885− , "ivory"
1886− , "ivory-backend-c"
1887− , "ivory-bitdata"
1888− , "ivory-examples"
1889− , "ivory-hw"
1890− , "ivory-opts"
1891− , "ivory-quickcheck"
1892− , "ivory-stdlib"
1893− , "ivy-web"
1894− , "ixdopp"
1895− , "ixset-typed"
1896− , "iyql"
1897− , "j2hs"
1898− , "jack-bindings"
1899− , "jackminimix"
1900− , "JackMiniMix"
1901− , "jacobi-roots"
1902− , "jalla"
1903− , "jarfind"
1904− , "java-bridge"
1905− , "java-bridge-extras"
1906− , "java-reflect"
1907− , "javasf"
1908− , "Javasf"
1909− , "javav"
1910− , "Javav"
1911− , "jespresso"
1912− , "jobqueue"
1913− , "join"
1914− , "joinlist"
1915− , "jonathanscard"
1916− , "jort"
1917− , "jsc"
1918− , "JsContracts"
1919− , "js-good-parts"
1920− , "jsmw"
1921− , "json2"
1922− , "json2-hdbc"
1923− , "json-b"
1924− , "JSONb"
1925− , "JSON-Combinator"
1926− , "JSON-Combinator-Examples"
1927− , "json-enumerator"
1928− , "JsonGrammar"
1929− , "json-qq"
1930− , "jsonresume"
1931− , "json-rpc"
1932− , "json-tools"
1933− , "jspath"
1934− , "judy"
1935− , "JuicyPixels-repa"
1936− , "JunkDB-driver-gdbm"
1937− , "JYU-Utils"
1938− , "kangaroo"
1939− , "kansas-comet"
1940− , "kansas-lava-cores" -- depends on broken package singletons-1.1.2.1
1941− , "kansas-lava" -- depends on broken package singletons-1.1.2.1
1942− , "kansas-lava-papilio" -- depends on broken package singletons-1.1.2.1
1943− , "kansas-lava-shake" -- depends on broken package singletons-1.1.2.1
1944− , "katt"
1945− , "keera-hails-mvc-model-lightmodel"
1946− , "keera-hails-reactive-fs"
1947− , "keera-posture"
1948− , "keiretsu"
1949− , "Ketchup"
1950− , "kevin"
1951− , "keyring"
1952− , "keystore"
1953− , "kibro"
1954− , "kicad-data"
1955− , "kickass-torrents-dump-parser"
1956− , "KiCS"
1957− , "KiCS-debugger"
1958− , "KiCS-prophecy"
1959− , "kif-parser"
1960− , "kit"
1961− , "kmeans-par"
1962− , "koellner-phonetic"
1963− , "Konf"
1964− , "korfu"
1965− , "kqueue"
1966− , "kure-your-boilerplate"
1967− , "KyotoCabinet"
1968− , "labeled-graph"
1969− , "laborantin-hs"
1970− , "labyrinth"
1971− , "labyrinth-server"
1972− , "laika"
1973− , "lambda2js"
1974− , "lambdaBase"
1975− , "lambdabot"
1976− , "lambdabot-core"
1977− , "lambdabot-haskell-plugins"
1978− , "lambdabot-irc-plugins"
1979− , "lambdabot-misc-plugins"
1980− , "lambdabot-novelty-plugins"
1981− , "lambdabot-reference-plugins"
1982− , "lambdabot-social-plugins"
1983− , "lambdabot-utils"
1984− , "lambda-bridge"
1985− , "LambdaCalculator"
1986− , "lambdacat"
1987− , "lambdacube"
1988− , "lambdacube-bullet"
1989− , "lambdacube-engine"
1990− , "lambdacube-examples"
1991− , "lambdacube-samples"
1992− , "lambda-devs"
1993− , "lambdaFeed"
1994− , "LambdaINet"
1995− , "lambdaLit"
1996− , "LambdaPrettyQuote"
1997− , "LambdaShell"
1998− , "lambda-toolbox"
1999− , "lambdatwit"
2000− , "lambdiff"
2001− , "lame-tester"
2002− , "language-bash"
2003− , "language-boogie"
2004− , "language-c-comments"
2005− , "language-c-inline"
2006− , "language-eiffel"
2007− , "language-go"
2008− , "language-java-classfile"
2009− , "language-mixal"
2010− , "language-objc"
2011− , "language-puppet"
2012− , "language-python-colour"
2013− , "language-sh"
2014− , "language-spelling"
2015− , "language-sqlite"
2016− , "language-thrift"
2017− , "Lastik"
2018− , "lat"
2019− , "latest-npm-version"
2020− , "layers"
2021− , "layout"
2022− , "layout-bootstrap"
2023− , "lazyarray"
2024− , "lazysplines"
2025− , "l-bfgs-b"
2026− , "lcs"
2027− , "ldap-client"
2028− , "ldif"
2029− , "leaf"
2030− , "leaky"
2031− , "learn-physics"
2032− , "learn-physics-examples"
2033− , "leveldb-haskell-fork"
2034− , "levmar-chart"
2035− , "lgtk"
2036− , "lha"
2037− , "lhae"
2038− , "lhe"
2039− , "LibClang"
2040− , "libcspm"
2041− , "libexpect"
2042− , "libGenI"
2043− , "libhbb"
2044− , "libjenkins"
2045− , "libltdl"
2046− , "liboleg"
2047− , "libpafe"
2048− , "libpq"
2049− , "libssh2-conduit"
2050− , "libsystemd-daemon"
2051− , "libvirt-hs"
2052− , "libxml"
2053− , "libxslt"
2054− , "lifter"
2055− , "lighttpd-conf"
2056− , "lighttpd-conf-qq"
2057− , "lilypond"
2058− , "Limit"
2059− , "limp-cbc"
2060− , "lin-alg"
2061− , "linear-algebra-cblas"
2062− , "linear-maps"
2063− , "linearscan"
2064− , "linearscan-hoopl"
2065− , "LinearSplit"
2066− , "LinkChecker"
2067− , "linkchk"
2068− , "linkcore"
2069− , "linux-blkid"
2070− , "linux-kmod"
2071− , "linux-perf"
2072− , "linux-ptrace"
2073− , "lio-eci11"
2074− , "lio-simple"
2075− , "liquid-fixpoint"
2076− , "liquidhaskell"
2077− , "listlike-instances"
2078− , "list-t-html-parser"
2079− , "literals"
2080− , "live-sequencer"
2081− , "ll-picosat"
2082− , "llsd"
2083− , "llvm-ffi"
2084− , "llvm-general-quote"
2085− , "llvm-ht"
2086− , "local-search"
2087− , "loch"
2088− , "log2json"
2089− , "log-effect"
2090− , "logic-classes"
2091− , "LogicGrowsOnTrees"
2092− , "LogicGrowsOnTrees-MPI"
2093− , "LogicGrowsOnTrees-network"
2094− , "LogicGrowsOnTrees-processes"
2095− , "lojban"
2096− , "lojbanParser"
2097− , "lojbanXiragan"
2098− , "lojysamban"
2099− , "loli"
2100− , "loop-effin"
2101− , "loopy"
2102− , "lord"
2103− , "loris"
2104− , "lostcities"
2105− , "lscabal"
2106− , "L-seed"
2107− , "LslPlus"
2108− , "ls-usb"
2109− , "lsystem"
2110− , "luachunk"
2111− , "luautils"
2112− , "lucienne"
2113− , "Lucu"
2114− , "lui" -- depends on broken package MaybeT-0.1.2
2115− , "luka"
2116− , "luthor"
2117− , "lvish"
2118− , "lvmlib"
2119− , "lye"
2120− , "maam"
2121− , "mage"
2122− , "MagicHaskeller"
2123− , "magma"
2124− , "mahoro"
2125− , "majordomo"
2126− , "majority"
2127− , "manatee"
2128− , "manatee-anything"
2129− , "manatee-browser"
2130− , "manatee-core"
2131− , "manatee-curl"
2132− , "manatee-editor"
2133− , "manatee-filemanager"
2134− , "manatee-imageviewer"
2135− , "manatee-mplayer"
2136− , "manatee-pdfviewer"
2137− , "manatee-processmanager"
2138− , "manatee-reader"
2139− , "manatee-template"
2140− , "manatee-terminal"
2141− , "manatee-welcome"
2142− , "mandulia"
2143− , "mangopay"
2144− , "marionetta"
2145− , "markdown2svg"
2146− , "markdown-kate"
2147− , "markdown-pap"
2148− , "markov-processes"
2149− , "markup-preview"
2150− , "marmalade-upload"
2151− , "marquise"
2152− , "marxup"
2153− , "masakazu-bot"
2154− , "matchers"
2155− , "mathblog"
2156− , "mathgenealogy"
2157− , "mathlink"
2158− , "matlab"
2159− , "matsuri"
2160− , "maude"
2161− , "maxent"
2162− , "maxsharing"
2163− , "maybench"
2164− , "MaybeT-monads-tf"
2165− , "MaybeT-transformers"
2166− , "MazesOfMonad"
2167− , "mbox-tools"
2168− , "MC-Fold-DP"
2169− , "mcmc-samplers"
2170− , "mdcat"
2171− , "Measure"
2172− , "mecab"
2173− , "mediawiki"
2174− , "mediawiki2latex"
2175− , "mega-sdist"
2176− , "melody"
2177− , "memo-sqlite"
2178− , "meta-par-accelerate"
2179− , "metaplug"
2180− , "metric"
2181− , "Metrics"
2182− , "metronome"
2183− , "MFlow"
2184− , "Mhailist"
2185− , "MHask"
2186− , "mida"
2187− , "midisurface"
2188− , "mighttpd"
2189− , "mime-directory"
2190− , "mime-string"
2191− , "minesweeper"
2192− , "MiniAgda"
2193− , "miniball"
2194− , "miniforth"
2195− , "minimung"
2196− , "minioperational"
2197− , "miniplex"
2198− , "minirotate"
2199− , "ministg"
2200− , "mirror-tweet"
2201− , "MissingPy"
2202− , "missing-py2"
2203− , "mix-arrows"
2204− , "mkbndl"
2205− , "mlist"
2206− , "ml-w"
2207− , "mmtl"
2208− , "mmtl-base"
2209− , "moan"
2210− , "modelicaparser"
2211− , "modsplit"
2212− , "modular-prelude"
2213− , "modular-prelude-classy"
2214− , "module-management"
2215− , "mohws"
2216− , "monad-abort-fd"
2217− , "monadacme"
2218− , "monad-atom"
2219− , "monad-atom-simple"
2220− , "monad-bool"
2221− , "MonadCatchIO-mtl-foreign"
2222− , "MonadCatchIO-transformers-foreign"
2223− , "monad-exception"
2224− , "monadiccp"
2225− , "monadiccp-gecode"
2226− , "monad-interleave"
2227− , "MonadLab"
2228− , "monad-levels"
2229− , "monad-lrs"
2230− , "monad-memo"
2231− , "monad-mersenne-random"
2232− , "monad-ran"
2233− , "MonadRandomLazy"
2234− , "monad-stlike-io"
2235− , "monad-stlike-stm"
2236− , "monad-tx"
2237− , "monad-unify"
2238− , "monarch"
2239− , "Monaris"
2240− , "Monatron"
2241− , "Monatron-IO"
2242− , "mongodb-queue"
2243− , "mongrel2-handler"
2244− , "Monocle"
2245− , "mono-foldable"
2246− , "monoid-owns"
2247− , "monoidplus"
2248− , "monoids"
2249− , "monte-carlo"
2250− , "moo"
2251− , "morfette"
2252− , "morfeusz"
2253− , "mosaico-lib"
2254− , "mount"
2255− , "mp3decoder"
2256− , "mpdmate"
2257− , "mpppc"
2258− , "mpretty"
2259− , "mprover"
2260− , "mps"
2261− , "mpvguihs"
2262− , "mqtt-hs" -- depends on broken package singletons-1.1.2.1
2263− , "msgpack-idl"
2264− , "mtgoxapi"
2265− , "mtl-tf"
2266− , "mtlx"
2267− , "mtp"
2268− , "mudbath"
2269− , "multifocal"
2270− , "multipass"
2271− , "multiplate-simplified"
2272− , "multirec-alt-deriver"
2273− , "multirec-binary"
2274− , "multisetrewrite"
2275− , "murder"
2276− , "murmurhash3"
2277− , "musicbrainz-email"
2278− , "music-graphics"
2279− , "music-parts"
2280− , "music-preludes"
2281− , "music-score"
2282− , "music-sibelius"
2283− , "music-suite"
2284− , "music-util"
2285− , "musicxml"
2286− , "mustache2hs"
2287− , "mutable-iter"
2288− , "mvclient"
2289− , "mvc-updates"
2290− , "myo"
2291− , "mysnapsession"
2292− , "mysnapsession-example"
2293− , "mysql-simple-quasi"
2294− , "mysql-simple-typed"
2295− , "myTestlll"
2296− , "mzv"
2297− , "nagios-plugin-ekg"
2298− , "named-lock"
2299− , "nanoAgda"
2300− , "nano-cryptr"
2301− , "nanocurses"
2302− , "nano-hmac"
2303− , "nano-md5"
2304− , "nanomsg-haskell"
2305− , "narc"
2306− , "nats-queue"
2307− , "natural-number"
2308− , "neat"
2309− , "needle"
2310− , "nerf"
2311− , "nero"
2312− , "nero-wai"
2313− , "nero-warp"
2314− , "netcore"
2315− , "netlines"
2316− , "NetSNMP"
2317− , "netspec"
2318− , "nettle"
2319− , "nettle-frp"
2320− , "nettle-netkit"
2321− , "nettle-openflow"
2322− , "network-address"
2323− , "network-anonymous-i2p"
2324− , "network-builder"
2325− , "network-bytestring"
2326− , "network-connection"
2327− , "network-house"
2328− , "network-minihttp"
2329− , "network-rpca"
2330− , "network-server"
2331− , "network-simple-tls"
2332− , "network-topic-models"
2333− , "network-transport-amqp"
2334− , "network-websocket"
2335− , "newports"
2336− , "newsynth"
2337− , "newt"
2338− , "newtype-th"
2339− , "NGrams"
2340− , "nibblestring"
2341− , "nikepub"
2342− , "Ninjas"
2343− , "nitro"
2344− , "nixos-types"
2345− , "nkjp"
2346− , "nm"
2347− , "nme"
2348− , "nntp"
2349− , "noise"
2350− , "Nomyx"
2351− , "Nomyx-Core"
2352− , "Nomyx-Language"
2353− , "Nomyx-Rules"
2354− , "Nomyx-Web"
2355− , "nondeterminism"
2356− , "NonEmptyList"
2357− , "noodle"
2358− , "NoSlow"
2359− , "not-gloss-examples"
2360− , "notmuch-haskell"
2361− , "notmuch-web"
2362− , "np-linear"
2363− , "nptools"
2364− , "nthable"
2365− , "null-canvas"
2366− , "NumberSieves"
2367− , "numerals"
2368− , "numerals-base"
2369− , "numeric-qq"
2370− , "nums"
2371− , "Nussinov78"
2372− , "nvim-hs"
2373− , "NXT"
2374− , "NXTDSL"
2375− , "nymphaea"
2376− , "oberon0"
2377− , "obj"
2378− , "Object"
2379− , "ObjectIO"
2380− , "octopus"
2381− , "oculus"
2382− , "ofx"
2383− , "OGL"
2384− , "ohloh-hs"
2385− , "oi"
2386− , "ois-input-manager"
2387− , "omaketex"
2388− , "omega"
2389− , "Omega"
2390− , "omnicodec"
2391− , "on-a-horse"
2392− , "one-liner"
2393− , "oneormore"
2394− , "onu-course"
2395− , "OpenAFP"
2396− , "OpenAFP-Utils"
2397− , "OpenCL"
2398− , "OpenCLRaw"
2399− , "opencv-raw"
2400− , "openexchangerates"
2401− , "openflow"
2402− , "OpenGLCheck"
2403− , "opengles"
2404− , "openid"
2405− , "open-pandoc"
2406− , "openpgp-Crypto"
2407− , "openpgp-crypto-api"
2408− , "OpenSCAD" -- depends on broken package testpack-2.1.3.0
2409− , "openssh-github-keys"
2410− , "opentheory-char"
2411− , "open-union"
2412− , "OpenVG"
2413− , "OpenVGRaw"
2414− , "open-witness"
2415− , "Operads"
2416− , "optimusprime"
2417− , "OrchestrateDB"
2418− , "orchid"
2419− , "orchid-demo"
2420− , "OrderedBits"
2421− , "order-maintenance"
2422− , "orgmode-parse"
2423− , "origami"
2424− , "OSM"
2425− , "osm-download"
2426− , "ot"
2427− , "package-vt"
2428− , "packedstring"
2429− , "PageIO"
2430− , "panda"
2431− , "PandocAgda"
2432− , "pandoc-unlit"
2433− , "papillon"
2434− , "pappy"
2435− , "paragon"
2436− , "Paraiso"
2437− , "parallel-tasks"
2438− , "parameterized-data"
2439− , "parco"
2440− , "parco-attoparsec"
2441− , "parconc-examples"
2442− , "parco-parsec"
2443− , "Parry"
2444− , "parsec2"
2445− , "parse-help"
2446− , "parsely"
2447− , "parser-helper"
2448− , "parsestar"
2449− , "partial-lens"
2450− , "partly"
2451− , "passage"
2452− , "pastis"
2453− , "pasty"
2454− , "Pathfinder"
2455− , "pathfindingcore"
2456− , "patterns"
2457− , "paypal-api"
2458− , "pb"
2459− , "PCLT"
2460− , "PCLT-DB"
2461− , "pdynload"
2462− , "peakachu"
2463− , "pec"
2464− , "peg"
2465− , "penny"
2466− , "penny-bin"
2467− , "penny-lib"
2468− , "peparser"
2469− , "perdure"
2470− , "PerfectHash"
2471− , "perm"
2472− , "permute"
2473− , "PermuteEffects"
2474− , "persistent-hssqlppp"
2475− , "persistent-map"
2476− , "persistent-protobuf"
2477− , "pesca"
2478− , "peyotls"
2479− , "pez"
2480− , "pg-harness"
2481− , "pg-harness-server"
2482− , "pgsql-simple"
2483− , "pgstream"
2484− , "phasechange"
2485− , "phash"
2486− , "phone-push"
2487− , "phooey"
2488− , "photoname"
2489− , "phraskell"
2490− , "Phsu"
2491− , "phybin"
2492− , "pianola"
2493− , "pi-calculus"
2494− , "picologic"
2495− , "piet"
2496− , "piki"
2497− , "Pipe"
2498− , "pipes-cereal-plus"
2499− , "pipes-conduit"
2500− , "pipes-courier"
2501− , "pipes-network-tls"
2502− , "pipes-p2p-examples"
2503− , "pisigma"
2504− , "pit"
2505− , "pkggraph"
2506− , "planar-graph"
2507− , "plat"
2508− , "plivo"
2509− , "PlslTools"
2510− , "plugins"
2511− , "plugins-auto"
2512− , "plugins-multistage"
2513− , "plumbers"
2514− , "ply-loader"
2515− , "png-file"
2516− , "pngload"
2517− , "pngload-fixed"
2518− , "pocket-dns"
2519− , "pointless-haskell"
2520− , "pointless-lenses"
2521− , "pointless-rewrite"
2522− , "polh-lexicon"
2523− , "polyseq"
2524− , "polytypeable"
2525− , "polytypeable-utils"
2526− , "pontarius-mediaserver"
2527− , "pontarius-xmpp"
2528− , "pontarius-xpmn"
2529− , "pool"
2530− , "pool-conduit"
2531− , "popenhs"
2532− , "poppler"
2533− , "porte"
2534− , "porter"
2535− , "ports"
2536− , "posix-acl"
2537− , "posix-waitpid"
2538− , "PostgreSQL"
2539− , "postgresql-orm"
2540− , "postgresql-schema"
2541− , "postgresql-simple-typed"
2542− , "postgresql-typed"
2543− , "postgrest"
2544− , "postie"
2545− , "postmaster"
2546− , "powermate"
2547− , "powerpc"
2548− , "pqc"
2549− , "pqueue-mtl" -- depends on broken package MaybeT-0.1.2
2550− , "practice-room"
2551− , "precis"
2552− , "prefork"
2553− , "pregame"
2554− , "prelude-generalize"
2555− , "prelude-plus"
2556− , "preprocess-haskell"
2557− , "press"
2558− , "PrimitiveArray"
2559− , "primula-board"
2560− , "primula-bot"
2561− , "printf-mauke"
2562− , "Printf-TH"
2563− , "PriorityChansConverger"
2564− , "priority-queue"
2565− , "ProbabilityMonads" -- depends on broken package MaybeT-0.1.2
2566− , "proc"
2567− , "processing"
2568− , "process-iterio"
2569− , "process-leksah"
2570− , "process-listlike"
2571− , "process-progress"
2572− , "process-qq"
2573− , "procrastinating-structure"
2574− , "procrastinating-variable"
2575− , "procstat"
2576− , "prof2dot"
2577− , "profunctor-extras"
2578− , "progress"
2579− , "progressbar"
2580− , "progression"
2581− , "progressive"
2582− , "proj4-hs-bindings"
2583− , "prolog"
2584− , "prolog-graph"
2585− , "prolog-graph-lib"
2586− , "propane"
2587− , "Proper"
2588− , "proplang"
2589− , "protobuf-native"
2590− , "protocol-buffers-descriptor-fork"
2591− , "protocol-buffers-fork"
2592− , "prove-everywhere-server"
2593− , "proxy-kindness"
2594− , "pub"
2595− , "publicsuffixlistcreate"
2596− , "pubnub"
2597− , "pubsub"
2598− , "puffytools"
2599− , "Pugs"
2600− , "pugs-hsregex"
2601− , "pugs-HsSyck"
2602− , "punkt"
2603− , "Pup-Events"
2604− , "Pup-Events-Demo"
2605− , "puppetresources"
2606− , "pushme"
2607− , "push-notify"
2608− , "push-notify-ccs"
2609− , "push-notify-general"
2610− , "putlenses"
2611− , "puzzle-draw"
2612− , "puzzle-draw-cmdline"
2613− , "pvd"
2614− , "python-pickle"
2615− , "qd"
2616− , "qd-vec"
2617− , "qhull-simple"
2618− , "QIO"
2619− , "QuadEdge"
2620− , "quantum-arrow"
2621− , "qudb"
2622− , "quenya-verb"
2623− , "querystring-pickle"
2624− , "queuelike" -- depends on broken package MaybeT-0.1.2
2625− , "QuickAnnotate"
2626− , "QuickCheck-GenT"
2627− , "quickcheck-poly"
2628− , "quickcheck-regex"
2629− , "quickcheck-relaxng"
2630− , "quickcheck-rematch"
2631− , "quickpull"
2632− , "quickset"
2633− , "Quickson"
2634− , "quicktest"
2635− , "quoridor-hs"
2636− , "rabocsv2qif"
2637− , "rad"
2638− , "radium"
2639− , "radium-formula-parser"
2640− , "rados-haskell"
2641− , "rail-compiler-editor" -- depends on broken package llvm-general-3.4.5.4
2642− , "rainbow-tests"
2643− , "rakhana"
2644− , "ralist"
2645− , "rallod"
2646− , "random-access-list"
2647− , "RandomDotOrg"
2648− , "random-eff"
2649− , "random-effin"
2650− , "random-hypergeometric"
2651− , "random-stream"
2652− , "rand-vars"
2653− , "rangemin"
2654− , "Ranka"
2655− , "raven-haskell"
2656− , "raven-haskell-scotty"
2657− , "rbr"
2658− , "rdf4h"
2659− , "rdioh"
2660− , "reaction-logic"
2661− , "reactive"
2662− , "reactive-bacon"
2663− , "reactive-balsa"
2664− , "reactive-banana-sdl"
2665− , "reactive-banana-threepenny"
2666− , "reactive-fieldtrip"
2667− , "reactive-glut"
2668− , "reactive-thread"
2669− , "reactor"
2670− , "really-simple-xml-parser"
2671− , "reasonable-lens"
2672− , "record-aeson"
2673− , "record-gl"
2674− , "record-preprocessor"
2675− , "records"
2676− , "records-th"
2677− , "redHandlers" -- depends on broken package MaybeT-0.1.2
2678− , "ref"
2679− , "Ref"
2680− , "Referees"
2681− , "refh"
2682− , "reflection-extras"
2683− , "reflex"
2684− , "reflex-dom"
2685− , "reflex-gloss"
2686− , "regex-deriv"
2687− , "regex-dfa"
2688− , "regex-genex"
2689− , "regex-parsec"
2690− , "regex-pderiv"
2691− , "regexp-tries"
2692− , "regexqq"
2693− , "regex-tdfa-utf8"
2694− , "regex-tre"
2695− , "regex-xmlschema"
2696− , "regional-pointers"
2697− , "regions"
2698− , "regions-monadsfd"
2699− , "regions-monadstf"
2700− , "regions-mtl"
2701− , "regular-extras"
2702− , "regular-web"
2703− , "reheat"
2704− , "rei"
2705− , "reified-records"
2706− , "reify"
2707− , "remote"
2708− , "remotion"
2709− , "reorderable"
2710− , "repa-array"
2711− , "repa-bytestring"
2712− , "repa-flow"
2713− , "repa-plugin"
2714− , "repa-series"
2715− , "repa-stream"
2716− , "repa-v4l2"
2717− , "repl"
2718− , "RepLib"
2719− , "repo-based-blog"
2720− , "repr"
2721− , "representable-functors"
2722− , "representable-profunctors"
2723− , "representable-tries"
2724− , "resource-embed"
2725− , "resource-simple"
2726− , "respond"
2727− , "restful-snap"
2728− , "RESTng" -- depends on broken package MaybeT-0.1.2
2729− , "restricted-workers"
2730− , "restyle"
2731− , "resumable-exceptions"
2732− , "rethinkdb-client-driver"
2733− , "rethinkdb-model"
2734− , "ReviewBoard"
2735− , "rewrite"
2736− , "rewriting"
2737− , "rezoom"
2738− , "rfc3339"
2739− , "riak"
2740− , "riak-protobuf"
2741− , "riemann"
2742− , "riot"
2743− , "ripple"
2744− , "ripple-federation"
2745− , "risc386"
2746− , "rivers"
2747− , "RJson"
2748− , "rmonad"
2749− , "RMP"
2750− , "RNAdesign"
2751− , "RNAdraw"
2752− , "RNAFold"
2753− , "RNAFoldProgs"
2754− , "RNAwolf"
2755− , "roguestar"
2756− , "roguestar-engine" -- depends on broken package MaybeT-0.1.2
2757− , "roguestar-gl"
2758− , "roguestar-glut"
2759− , "RollingDirectory"
2760− , "rope"
2761− , "rosa"
2762− , "roshask" -- depends on broken package testpack-2.1.3.0
2763− , "rosso"
2764− , "rotating-log"
2765− , "rounding"
2766− , "roundtrip"
2767− , "roundtrip-aeson"
2768− , "roundtrip-string"
2769− , "roundtrip-xml"
2770− , "route-generator"
2771− , "route-planning"
2772− , "rowrecord"
2773− , "rpc"
2774− , "rpc-framework"
2775− , "rpm"
2776− , "rsagl"
2777− , "rsagl-frp"
2778− , "rsagl-math"
2779− , "rss2irc"
2780− , "ruff"
2781− , "ruler-core"
2782− , "rungekutta"
2783− , "RxHaskell"
2784− , "safe-freeze"
2785− , "safe-globals"
2786− , "safeint"
2787− , "safe-lazy-io"
2788− , "safe-plugins"
2789− , "safer-file-handles"
2790− , "safer-file-handles-bytestring"
2791− , "safer-file-handles-text"
2792− , "sai-shape-syb"
2793− , "Salsa"
2794− , "salvia"
2795− , "salvia-demo"
2796− , "salvia-extras"
2797− , "salvia-protocol"
2798− , "salvia-sessions"
2799− , "salvia-websocket"
2800− , "samtools-iteratee"
2801− , "sasl"
2802− , "sat"
2803− , "satchmo-backends"
2804− , "satchmo-examples"
2805− , "satchmo-funsat"
2806− , "satchmo-minisat"
2807− , "sat-micro-hs"
2808− , "SBench"
2809− , "scaleimage"
2810− , "scan-vector-machine"
2811− , "scat"
2812− , "scenegraph"
2813− , "schedevr"
2814− , "scholdoc"
2815− , "scholdoc-citeproc"
2816− , "scion"
2817− , "scion-browser"
2818− , "scope"
2819− , "scope-cairo"
2820− , "scottish"
2821− , "scotty-blaze"
2822− , "scotty-fay"
2823− , "scotty-hastache"
2824− , "scotty-session"
2825− , "scrabble-bot"
2826− , "ScratchFs"
2827− , "scrobble"
2828− , "scroll"
2829− , "scrz"
2830− , "Scurry"
2831− , "sdr"
2832− , "seacat"
2833− , "search"
2834− , "secdh"
2835− , "second-transfer"
2836− , "secret-santa"
2837− , "secret-sharing"
2838− , "secrm"
2839− , "sednaDBXML"
2840− , "selectors"
2841− , "selenium"
2842− , "selenium-server"
2843− , "selinux"
2844− , "Semantique"
2845− , "semigroups-actions"
2846− , "semi-iso"
2847− , "semiring"
2848− , "sensenet"
2849− , "sentry"
2850− , "senza"
2851− , "seqaid"
2852− , "SeqAlign"
2853− , "seqloc-datafiles"
2854− , "sequent-core"
2855− , "sequor"
2856− , "servant-pool"
2857− , "servant-postgresql"
2858− , "servant-scotty"
2859− , "serversession-backend-acid-state"
2860− , "servius"
2861− , "ses-html-snaplet"
2862− , "SessionLogger"
2863− , "sessions"
2864− , "set-with"
2865− , "sexp"
2866− , "sexpr"
2867− , "sext"
2868− , "SFML"
2869− , "SFML-control"
2870− , "SFont"
2871− , "SG"
2872− , "SGdemo"
2873− , "sgrep"
2874− , "shadower"
2875− , "shady-gen"
2876− , "shady-graphics"
2877− , "shake-extras"
2878− , "shaker"
2879− , "shakespeare-css"
2880− , "shakespeare-i18n"
2881− , "shapely-data"
2882− , "shared-buffer"
2883− , "she"
2884− , "Shellac"
2885− , "Shellac-compatline"
2886− , "Shellac-editline"
2887− , "Shellac-haskeline"
2888− , "Shellac-readline"
2889− , "shellish"
2890− , "shell-pipe"
2891− , "shivers-cfg"
2892− , "showdown"
2893− , "shpider"
2894− , "sifflet"
2895− , "sifflet-lib"
2896− , "signals"
2897− , "simd"
2898− , "simgi"
2899− , "simple"
2900− , "simple-bluetooth"
2901− , "simple-css"
2902− , "simple-c-value"
2903− , "simple-firewire"
2904− , "simple-form"
2905− , "SimpleGL"
2906− , "SimpleH"
2907− , "simpleirc"
2908− , "simpleirc-lens"
2909− , "SimpleLog"
2910− , "simple-log-syslog"
2911− , "simplenote"
2912− , "simple-pascal"
2913− , "simple-postgresql-orm"
2914− , "simpleprelude"
2915− , "simple-session"
2916− , "simplessh"
2917− , "simple-templates"
2918− , "simple-vec3"
2919− , "simseq"
2920− , "sindre"
2921− , "sirkel"
2922− , "sized" -- depends on broken package singletons-1.1.2.1
2923− , "sized-types" -- depends on broken package singletons-1.1.2.1
2924− , "sized-vector" -- depends on broken package singletons-1.1.2.1
2925− , "skeleton"
2926− , "skype4hs"
2927− , "slack"
2928− , "slidemews"
2929− , "sloth"
2930− , "smallarray"
2931− , "smallpt-hs"
2932− , "smallstring"
2933− , "smartcheck"
2934− , "smartGroup"
2935− , "smartword"
2936− , "sme"
2937− , "Smooth"
2938− , "smt-lib"
2939− , "smtlib2"
2940− , "smtp2mta"
2941− , "smtp-mail-ng"
2942− , "smtps-gmail"
2943− , "snake-game"
2944− , "snap-accept"
2945− , "snap-app"
2946− , "snap-elm" -- depends on broken package Elm-0.13
2947− , "snap-extras"
2948− , "snaplet-actionlog"
2949− , "snaplet-css-min"
2950− , "snaplet-environments"
2951− , "snaplet-haxl"
2952− , "snaplet-hdbc"
2953− , "snaplet-i18n"
2954− , "snaplet-mongoDB"
2955− , "snaplet-mongodb-minimalistic"
2956− , "snaplet-mysql-simple"
2957− , "snaplet-oauth"
2958− , "snaplet-redson"
2959− , "snaplet-rest"
2960− , "snaplet-riak"
2961− , "snaplet-sedna"
2962− , "snaplet-tasks"
2963− , "snaplet-typed-sessions"
2964− , "snaplet-wordpress"
2965− , "snap-predicates"
2966− , "snappy-iteratee"
2967− , "snap-testing"
2968− , "snap-utils"
2969− , "sndfile-enumerators"
2970− , "sneathlane-haste"
2971− , "SNet"
2972− , "snm"
2973− , "snow-white"
2974− , "Snusmumrik"
2975− , "SoccerFun"
2976− , "SoccerFunGL"
2977− , "sock2stream"
2978− , "socketio"
2979− , "socket-sctp"
2980− , "sonic-visualiser"
2981− , "SoOSiM"
2982− , "sorted"
2983− , "sound-collage"
2984− , "source-code-server"
2985− , "sousit"
2986− , "soxlib"
2987− , "soyuz"
2988− , "SpaceInvaders"
2989− , "SpacePrivateers"
2990− , "spanout"
2991− , "sparse"
2992− , "sparsebit"
2993− , "sparsecheck"
2994− , "spata"
2995− , "special-functors"
2996− , "specialize-th"
2997− , "speculation-transformers"
2998− , "sphero"
2999− , "sphinx-cli"
3000− , "spice"
3001− , "spike"
3002− , "splaytree"
3003− , "splines"
3004− , "split-record"
3005− , "splot"
3006− , "Spock-auth"
3007− , "spoonutil"
3008− , "spoty"
3009− , "Sprig"
3010− , "spy"
3011− , "sqlite-simple-typed"
3012− , "sql-simple"
3013− , "sql-simple-mysql"
3014− , "sql-simple-pool"
3015− , "sql-simple-postgresql"
3016− , "sql-simple-sqlite"
3017− , "srcinst"
3018− , "sscgi"
3019− , "ssh"
3020− , "sssp"
3021− , "sstable"
3022− , "stackage-curator" -- depends on broken package amazonka-s3-1.2.0
3023− , "stack-prism"
3024− , "starrover2"
3025− , "stateful-mtl" -- depends on broken package MaybeT-0.1.2
3026− , "statgrab"
3027− , "statistics-dirichlet"
3028− , "statistics-fusion"
3029− , "stb-truetype"
3030− , "step-function"
3031− , "stepwise"
3032− , "stm-chunked-queues"
3033− , "stmcontrol"
3034− , "stm-firehose"
3035− , "Stomp"
3036− , "storable-static-array"
3037− , "storablevector"
3038− , "storablevector-carray"
3039− , "storablevector-streamfusion"
3040− , "Strafunski-Sdf2Haskell"
3041− , "streamed"
3042− , "stream-fusion"
3043− , "StrictBench"
3044− , "strict-concurrency"
3045− , "string"
3046− , "stringlike"
3047− , "structured-mongoDB"
3048− , "structures"
3049− , "stunts"
3050− , "subhask"
3051− , "suitable"
3052− , "sunlight"
3053− , "sunroof-compiler"
3054− , "sunroof-examples"
3055− , "sunroof-server"
3056− , "supercollider-midi"
3057− , "superdoc"
3058− , "supero"
3059− , "supervisor"
3060− , "svg2q"
3061− , "SVG2Q"
3062− , "svm-simple"
3063− , "svndump"
3064− , "swapper"
3065− , "swearjure"
3066− , "swf"
3067− , "swift-lda"
3068− , "sws"
3069− , "syb-extras"
3070− , "sylvia"
3071− , "sym-plot"
3072− , "sync"
3073− , "sync-mht"
3074− , "syntax"
3075− , "syntax-attoparsec"
3076− , "syntax-example"
3077− , "syntax-example-json"
3078− , "SyntaxMacros"
3079− , "syntax-pretty"
3080− , "syntax-printer"
3081− , "syntax-trees"
3082− , "syntax-trees-fork-bairyn"
3083− , "synthesizer"
3084− , "synthesizer-alsa"
3085− , "synthesizer-core"
3086− , "synthesizer-dimensional"
3087− , "synthesizer-midi"
3088− , "Sysmon"
3089− , "system-canonicalpath"
3090− , "system-lifted"
3091− , "system-random-effect"
3092− , "ta"
3093− , "Tables"
3094− , "tablestorage"
3095− , "tabloid"
3096− , "tagged-list"
3097− , "tagged-th"
3098− , "tagsoup-ht"
3099− , "tagsoup-parsec"
3100− , "Takusen"
3101− , "takusen-oracle"
3102− , "tamarin-prover"
3103− , "tamarin-prover-term"
3104− , "tamarin-prover-theory"
3105− , "tamarin-prover-utils"
3106− , "tamper"
3107− , "target"
3108− , "task"
3109− , "tasty-integrate"
3110− , "TBC"
3111− , "tbox"
3112− , "tccli"
3113− , "tcp"
3114− , "tdd-util"
3115− , "TeaHS"
3116− , "teams"
3117− , "telegram"
3118− , "template-default"
3119− , "template-haskell-util"
3120− , "template-hsml"
3121− , "templatepg"
3122− , "tempodb"
3123− , "temporal-csound" -- depends on broken package temporal-music-notation-0.4.1
3124− , "tempus"
3125− , "tensor"
3126− , "termbox-bindings"
3127− , "term-rewriting"
3128− , "terrahs"
3129− , "tersmu"
3130− , "test-framework-doctest"
3131− , "test-framework-quickcheck" -- depends on broken package QuickCheck-1.2.0.1
3132− , "testloop"
3133− , "testpattern"
3134− , "testPkg"
3135− , "testrunner"
3136− , "tetris"
3137− , "tex2txt"
3138− , "texrunner"
3139− , "text-json-qq"
3140− , "textmatetags"
3141− , "text-normal"
3142− , "textPlot"
3143− , "text-register-machine"
3144− , "texts"
3145− , "text-xml-generic"
3146− , "text-xml-qq"
3147− , "tfp-th"
3148− , "Theora"
3149− , "theoremquest-client"
3150− , "thih"
3151− , "thimk"
3152− , "Thingie"
3153− , "th-instances"
3154− , "th-kinds"
3155− , "thrift"
3156− , "Thrift"
3157− , "throttle"
3158− , "tic-tac-toe"
3159− , "TicTacToe"
3160− , "tiger"
3161− , "tighttp"
3162− , "timberc"
3163− , "timecalc"
3164− , "time-extras"
3165− , "time-http"
3166− , "timeout"
3167− , "timeout-control"
3168− , "timeparsers"
3169− , "TimePiece"
3170− , "timeplot"
3171− , "time-recurrence"
3172− , "time-series"
3173− , "timestamp-subprocess-lines"
3174− , "time-w3c"
3175− , "TinyLaunchbury"
3176− , "TinyURL"
3177− , "Titim"
3178− , "tkhs"
3179− , "tkyprof"
3180− , "tls-extra"
3181− , "todos"
3182− , "to-haskell"
3183− , "toilet"
3184− , "toktok"
3185− , "tokyocabinet-haskell"
3186− , "toml"
3187− , "Top"
3188− , "topkata"
3189− , "torch"
3190− , "to-string-class"
3191− , "to-string-instances"
3192− , "Tournament"
3193− , "tracker"
3194− , "trajectory"
3195− , "transactional-events"
3196− , "transformers-convert"
3197− , "transformers-runnable"
3198− , "translate"
3199− , "traypoweroff"
3200− , "treemap-html-tools"
3201− , "treeviz"
3202− , "tremulous-query"
3203− , "TrendGraph"
3204− , "trhsx"
3205− , "triangulation"
3206− , "TrieMap"
3207− , "trimpolya"
3208− , "true-name"
3209− , "tsession"
3210− , "tsession-happstack"
3211− , "tskiplist"
3212− , "tsp-viz"
3213− , "tuntap"
3214− , "tup-functor"
3215− , "tuple-gen"
3216− , "tupleinstances"
3217− , "tuple-morph"
3218− , "twentefp-rosetree"
3219− , "twhs"
3220− , "twidge"
3221− , "twilight-stm"
3222− , "twilio"
3223− , "twill"
3224− , "twiml"
3225− , "twine"
3226− , "twisty"
3227− , "twitch"
3228− , "twitter"
3229− , "twitter-conduit"
3230− , "twitter-enumerator"
3231− , "twitter-types"
3232− , "twitter-types-lens"
3233− , "tx"
3234− , "TYB"
3235− , "typalyze"
3236− , "typeable-th"
3237− , "type-cereal"
3238− , "TypeClass"
3239− , "type-digits"
3240− , "typedquery"
3241− , "type-equality-check"
3242− , "typehash"
3243− , "TypeIlluminator"
3244− , "type-int"
3245− , "type-level"
3246− , "type-level-bst"
3247− , "type-level-sets"
3248− , "typelevel-tensor"
3249− , "type-list" -- depends on broken package singletons-1.1.2.1
3250− , "type-natural" -- depends on broken package singletons-1.1.2.1
3251− , "type-ord"
3252− , "type-ord-spine-cereal"
3253− , "typeparams"
3254− , "type-prelude"
3255− , "typescript-docs"
3256− , "type-settheory"
3257− , "type-spine"
3258− , "type-structure"
3259− , "type-sub-th"
3260− , "typography-geometry"
3261− , "tz"
3262− , "uAgda"
3263− , "uberlast"
3264− , "uconv"
3265− , "udbus"
3266− , "udbus-model"
3267− , "udev"
3268− , "ui-command"
3269− , "UMM"
3270− , "unamb-custom"
3271− , "unbound"
3272− , "unbounded-delays-units" -- depends on broken package singletons-1.1.2.1
3273− , "unboxed-containers"
3274− , "unicode-normalization"
3275− , "unicoder"
3276− , "uniform-io"
3277− , "union-map"
3278− , "uniqueid"
3279− , "unique-logic-tf"
3280− , "units-defs" -- depends on broken package singletons-1.1.2.1
3281− , "units" -- depends on broken package singletons-1.1.2.1
3282− , "unittyped"
3283− , "universe-th"
3284− , "unix-process-conduit"
3285− , "unlit"
3286− , "unordered-containers-rematch"
3287− , "unpack-funcs"
3288− , "unscramble"
3289− , "up"
3290− , "uploadcare"
3291− , "upskirt"
3292− , "ureader"
3293− , "urembed"
3294− , "uri-conduit"
3295− , "uri-enumerator"
3296− , "uri-enumerator-file"
3297− , "urlcheck"
3298− , "urldecode"
3299− , "UrlDisp" -- depends on broken package MaybeT-0.1.2
3300− , "urldisp-happstack"
3301− , "url-generic"
3302− , "URLT"
3303− , "urxml"
3304− , "usb-enumerator"
3305− , "usb-iteratee"
3306− , "usb-safe"
3307− , "uuagc-diagrams"
3308− , "uu-tc"
3309− , "uvector"
3310− , "uvector-algorithms"
3311− , "v4l2"
3312− , "v4l2-examples"
3313− , "vacuum"
3314− , "vacuum-cairo"
3315− , "vacuum-graphviz"
3316− , "vacuum-opengl"
3317− , "vacuum-ubigraph"
3318− , "validate"
3319− , "vampire"
3320− , "var"
3321− , "vaultaire-common"
3322− , "vcard"
3323− , "Vec-Boolean"
3324− , "Vec-OpenGLRaw"
3325− , "vector-bytestring"
3326− , "vector-clock"
3327− , "vector-conduit"
3328− , "vector-functorlazy"
3329− , "vector-instances-collections"
3330− , "vector-random"
3331− , "vector-read-instances"
3332− , "vector-space-opengl"
3333− , "vector-static"
3334− , "Vec-Transform"
3335− , "verilog"
3336− , "vigilance"
3337− , "vintage-basic"
3338− , "vinyl" -- depends on broken package singletons-1.1.2.1
3339− , "vinyl-gl" -- depends on broken package singletons-1.1.2.1
3340− , "vinyl-json" -- depends on broken package singletons-1.1.2.1
3341− , "vinyl-utils" -- depends on broken package singletons-1.1.2.1
3342− , "virthualenv"
3343− , "vision"
3344− , "visual-graphrewrite"
3345− , "visual-prof"
3346− , "vk-aws-route53"
3347− , "VKHS"
3348− , "vorbiscomment"
3349− , "vowpal-utils"
3350− , "voyeur"
3351− , "vtegtk3"
3352− , "vty-examples"
3353− , "vty-menu"
3354− , "vty-ui-extras"
3355− , "wai-cors"
3356− , "wai-eventsource"
3357− , "wai-graceful"
3358− , "wai-handler-devel"
3359− , "wai-handler-snap"
3360− , "wai-handler-webkit"
3361− , "wai-hastache"
3362− , "wai-lite"
3363− , "wai-logger-prefork"
3364− , "wai-middleware-cache"
3365− , "wai-middleware-cache-redis"
3366− , "wai-middleware-catch"
3367− , "wai-middleware-consul"
3368− , "wai-middleware-etag"
3369− , "wai-middleware-headers"
3370− , "wai-middleware-hmac-client"
3371− , "wai-middleware-preprocessor"
3372− , "wai-middleware-route"
3373− , "wai-middleware-static-caching"
3374− , "wai-predicates" -- depends on broken package singletons-1.1.2.1
3375− , "wai-routing" -- depends on broken package singletons-1.1.2.1
3376− , "wai-session-tokyocabinet"
3377− , "wai-static-cache"
3378− , "wai-throttler"
3379− , "waitra"
3380− , "warp-dynamic"
3381− , "warp-static"
3382− , "warp-tls-uid"
3383− , "WashNGo"
3384− , "watchdog"
3385− , "watcher"
3386− , "watchit"
3387− , "wavesurfer"
3388− , "weather-api"
3389− , "WebBits-Html"
3390− , "WebBits-multiplate"
3391− , "web-browser-in-haskell"
3392− , "WebCont"
3393− , "webcrank-dispatch"
3394− , "webcrank-wai"
3395− , "webdriver-snoy"
3396− , "web-encodings"
3397− , "webify"
3398− , "webkit-javascriptcore"
3399− , "web-mongrel2"
3400− , "Webrexp"
3401− , "web-routes-quasi"
3402− , "web-routes-transformers"
3403− , "webserver"
3404− , "websnap"
3405− , "webwire"
3406− , "wedged"
3407− , "weighted-regexp"
3408− , "welshy"
3409− , "Wheb"
3410− , "wheb-mongo"
3411− , "wheb-redis"
3412− , "wheb-strapped"
3413− , "whim"
3414− , "whitespace"
3415− , "WikimediaParser"
3416− , "wikipedia4epub"
3417− , "Win32-dhcp-server" -- depends on broken package Win32-2.3.1.0
3418− , "Win32-errors" -- depends on broken package Win32-2.3.1.0
3419− , "Win32-extras" -- depends on broken package Win32-2.3.1.0
3420− , "Win32-junction-point" -- depends on broken package Win32-2.3.1.0
3421− , "Win32-notify" -- depends on broken package Win32-2.3.1.0
3422− , "Win32-security" -- depends on broken package Win32-2.3.1.0
3423− , "Win32-services" -- depends on broken package Win32-2.3.1.0
3424− , "Win32-services-wrapper" -- depends on broken package Win32-2.3.1.0
3425− , "windowslive"
3426− , "winerror"
3427− , "winio"
3428− , "WL500gPControl"
3429− , "wlc-hs"
3430− , "wobsurv"
3431− , "woffex"
3432− , "wolf" -- depends on broken package amazonka-s3-1.2.0
3433− , "word24"
3434− , "wordcloud"
3435− , "Wordlint"
3436− , "WordNet"
3437− , "WordNet-ghc74"
3438− , "wordsearch"
3439− , "wp-archivebot"
3440− , "wraxml"
3441− , "wright"
3442− , "wtk"
3443− , "wtk-gtk"
3444− , "wumpus-basic"
3445− , "wumpus-core"
3446− , "wumpus-drawing"
3447− , "wumpus-microprint"
3448− , "wumpus-tree"
3449− , "WURFL"
3450− , "wxAsteroids"
3451− , "WXDiffCtrl"
3452− , "wxFruit"
3453− , "wxhnotepad"
3454− , "wxturtle"
3455− , "wyvern"
3456− , "X11-extras"
3457− , "X11-rm"
3458− , "X11-xdamage"
3459− , "X11-xfixes"
3460− , "x11-xinput"
3461− , "x509-util"
3462− , "xchat-plugin"
3463− , "x-dsp"
3464− , "Xec"
3465− , "xfconf"
3466− , "xhaskell-library"
3467− , "xhb-ewmh"
3468− , "xine"
3469− , "xing-api"
3470− , "XInput" -- depends on broken package Win32-2.3.1.0
3471− , "xkcd"
3472− , "xlsior"
3473− , "xlsx-templater"
3474− , "xml2json"
3475− , "xml2x"
3476− , "xml-catalog"
3477− , "xml-enumerator"
3478− , "xml-enumerator-combinators"
3479− , "XmlHtmlWriter"
3480− , "xml-parsec"
3481− , "xml-pipe"
3482− , "xml-prettify"
3483− , "xml-push"
3484− , "xmltv"
3485− , "XMMS"
3486− , "xmms2-client"
3487− , "xmms2-client-glib"
3488− , "xmonad-bluetilebranch"
3489− , "xmonad-contrib-bluetilebranch"
3490− , "xmonad-eval"
3491− , "xmpipe"
3492− , "XMPP"
3493− , "xournal-builder"
3494− , "xournal-convert"
3495− , "xournal-parser"
3496− , "xournal-render"
3497− , "xournal-types"
3498− , "xsact"
3499− , "XSaiga"
3500− , "xslt"
3501− , "y0l0bot"
3502− , "Yablog"
3503− , "YACPong"
3504− , "yahoo-web-search"
3505− , "yajl"
3506− , "yajl-enumerator"
3507− , "yaml2owl"
3508− , "YamlReference"
3509− , "yaml-rpc"
3510− , "yaml-rpc-scotty"
3511− , "yaml-rpc-snap"
3512− , "yampa-canvas"
3513− , "yampa-glfw"
3514− , "yampa-glut"
3515− , "yaop"
3516− , "yarr"
3517− , "yarr-image-io"
3518− , "yate"
3519− , "yavie"
3520− , "ycextra"
3521− , "yesod-angular-ui"
3522− , "yesod-auth-account-fork"
3523− , "yesod-auth-kerberos"
3524− , "yesod-auth-ldap"
3525− , "yesod-auth-pam"
3526− , "yesod-auth-smbclient"
3527− , "yesod-bootstrap"
3528− , "yesod-comments"
3529− , "yesod-continuations"
3530− , "yesod-datatables"
3531− , "yesod-eventsource"
3532− , "yesod-examples"
3533− , "yesod-goodies"
3534− , "yesod-links"
3535− , "yesod-mangopay"
3536− , "yesod-media-simple"
3537− , "yesod-paginate"
3538− , "yesod-pagination"
3539− , "yesod-paginator"
3540− , "yesod-platform"
3541− , "yesod-pure"
3542− , "yesod-purescript"
3543− , "yesod-routes-typescript"
3544− , "yesod-rst"
3545− , "yesod-s3"
3546− , "yesod-session-redis"
3547− , "yesod-tableview"
3548− , "yesod-test-json"
3549− , "yesod-tls"
3550− , "yesod-vend"
3551− , "yesod-worker"
3552− , "YFrob"
3553− , "yhccore"
3554− , "yi-contrib"
3555− , "yi-fuzzy-open"
3556− , "yi-gtk"
3557− , "yi-vty"
3558− , "yjftp"
3559− , "Yogurt"
3560− , "Yogurt-Standalone"
3561− , "yoko"
3562− , "york-lava"
3563− , "yql"
3564− , "yuiGrid"
3565− , "yuuko"
3566− , "zampolit"
3567− , "zasni-gerna"
3568− , "zendesk-api"
3569− , "zeno"
3570− , "zeromq3-conduit"
3571− , "zeromq3-haskell"
3572− , "zeromq-haskell"
3573− , "zeroth"
3574− , "ZFS"
3575− , "zipedit"
3576− , "ZMachine"
3577− , "zmcat"
3578− , "zmqat"
3579− , "zoneinfo"
3580− , "zoom"
3581− , "zoom-cache"
3582− , "zoom-cache-pcm"
3583− , "zoom-cache-sndfile"
3584− , "zot"
3585− , "zsh-battery"
3586− , "ztail"
3587− , "Zwaluw"
3588− ]
3589−
3590− }
src/Distribution/Nixpkgs/Haskell/FromCabal/Configuration/Maintainers.hsdeleted−26
@@ -1,26 +0,0 @@
1−module Distribution.Nixpkgs.Haskell.FromCabal.Configuration.Maintainers ( globalPackageMaintainers ) where
2−
3−import Data.Map as Map
4−import Data.Set as Set
5−import Distribution.Nixpkgs.Haskell.FromCabal.Configuration
6−import Internal.Lens
7−
8−globalPackageMaintainers :: Map PackageName (Set Identifier)
9−globalPackageMaintainers = Map.unionsWith Set.union [ Map.singleton p (Set.singleton m) | (m,ps) <- maintainedPackages, p <- ps ]
10−
11−maintainedPackages :: [(Identifier, [PackageName])]
12−maintainedPackages =
13− [ "simons" |->
14− [ "cabal2nix", "funcmp", "hackage-db", "hledger-interest", "hopenssl"
15− , "hsdns", "hsemail", "hsyslog", "jailbreak-cabal", "language-nix"
16− , "streamproc"
17− ]
18− , "gebner" |-> [ "hledger-diff" ]
19− , "jb55" |-> [ "pipes-csv", "pipes-mongodb", "cased" ]
20− , "psibi" |-> [ "shakespeare", "path-pieces", "persistent", "persistent-mysql"
21− , "persistent-postgresql", "persistent-sqlite", "persistent-redis"
22− , "persistent-mongoDB", "persistent-template", "persistent-zookeeper"]
23− ]
24−
25−(|->) :: String -> [String] -> (Identifier,[PackageName])
26−(|->) m ps = (create ident m, Prelude.map PackageName ps)
src/Distribution/Nixpkgs/Haskell/FromCabal/Flags.hs+44−10
@@ -1,34 +1,68 @@
1+{-# LANGUAGE OverloadedStrings #-}
2+
13module Distribution.Nixpkgs.Haskell.FromCabal.Flags ( configureCabalFlags ) where
24
5+import Distribution.Nixpkgs.Haskell.OrphanInstances ( )
6+
7+import Data.Char
38import Distribution.Package
49import Distribution.PackageDescription
10+import Distribution.Version
511
612configureCabalFlags :: PackageIdentifier -> FlagAssignment
7−configureCabalFlags (PackageIdentifier (PackageName name) _)
13+configureCabalFlags = mkFlagAssignment . configureCabalFlags'
14+
15+configureCabalFlags' :: PackageIdentifier -> [(FlagName,Bool)]
16+configureCabalFlags' (PackageIdentifier name version)
817 | name == "accelerate-examples"= [disable "opencl"]
918 | name == "arithmoi" = [disable "llvm"]
19+ | name == "bustle" = [disable "hgettext"] -- https://gitlab.freedesktop.org/bustle/bustle/issues/13
20+ | name == "cabal-plan" = [enable "exe"]
21+ | name == "cassava" = [disable "bytestring--lt-0_10_4"]
1022 | name == "darcs" = [enable "library", enable "force-char8-encoding"]
1123 | name == "diagrams-builder" = [enable "cairo", enable "svg", enable "ps", enable "rasterific"]
24+ | name == "fltkhs" = [enable "opengl"]
1225 | name == "folds" = [disable "test-hlint"]
13− | name == "git-annex" = [enable "Assistant" , enable "Production"]
26+ | name == "git-annex" = [ enable "assistant"
27+ , disable "benchmark"
28+ , enable "dbus"
29+ , disable "debuglocks"
30+ , enable "magicmime"
31+ , enable "networkbsd"
32+ , enable "pairing"
33+ , enable "production"
34+ , enable "s3"
35+ , enable "torrentparser"
36+ , enable "webapp"
37+ , enable "webdav"
38+ ]
1439 | name == "haskeline" = [enable "terminfo"]
1540 | name == "haste-compiler" = [enable "portable"]
1641 | name == "highlighting-kate" = [enable "pcre-light"]
17− | name == "hlibsass" = [enable "externalLibsass"]
18− | name == "hslua" = [enable "system-lua"]
19− | name == "hxt" = [enable "network-uri"]
20− | name == "idris" = [enable "gmp", enable "ffi"]
42+ | name == "hlibsass" && version >= mkVersion [0,1,5]
43+ = [enable "externalLibsass"]
44+ | name == "hmatrix" = [enable "openblas", enable "disable-default-paths"]
45+ | name == "hslua" = [enable "system-lua", disable "use-pkgconfig"]
46+ | name == "idris" = [enable "gmp", enable "ffi", enable "curses", ("execonly", version `withinRange` orLaterVersion (mkVersion [1,1,1])) ]
2147 | name == "io-streams" = [enable "NoInteractiveTests"]
22− | name == "pandoc" = [enable "https"]
48+ | name == "liquid-fixpoint" = [enable "build-external"]
49+ | name == "pandoc" = [enable "https", disable "trypandoc"]
50+ | name == "pandoc-placetable" = [enable "inlineMarkdown"]
51+ | name == "persistent-sqlite" = [enable "systemlib"]
2352 | name == "reactive-banana-wx" = [disable "buildExamples"]
2453 | name == "snap-server" = [enable "openssl"]
25− | name == "xmobar" = [enable "all_extensions"]
54+ | name == "stack" = [enable "disable-git-info", enable "hide-dependency-versions", enable "supported-build"]
55+ | name == "xmobar" = [enable "with_alsa", enable "with_conduit", enable "with_datezone", enable "with_dbus", enable "with_inotify", enable "with_iwlib", enable "with_mpd", enable "with_mpris", enable "with_rtsopts", enable "with_threaded", enable "with_utf8", enable "with_uvmeter", enable "with_weather", enable "with_xft", enable "with_xpm"]
2656 | name == "xmonad-extras" = [disable "with_hlist", enable "with_split", enable "with_parsec"]
57+ | name == "yaml" = [("system-libyaml", version >= "0.10.1.1")]
2758 | name == "yi" = [enable "pango", enable "vty"]
2859 | otherwise = []
2960
3061enable :: String -> (FlagName,Bool)
31−enable name = (FlagName name, True)
62+enable name = (mkFlagName' name, True)
3263
3364disable :: String -> (FlagName,Bool)
34−disable name = (FlagName name, False)
65+disable name = (mkFlagName' name, False)
66+
67+mkFlagName' :: String -> FlagName
68+mkFlagName' = mkFlagName . map toLower
src/Distribution/Nixpkgs/Haskell/FromCabal/License.hs+166−26
@@ -1,30 +1,170 @@
1−module Distribution.Nixpkgs.Haskell.FromCabal.License ( fromCabalLicense ) where
1+{-# LANGUAGE ViewPatterns #-}
22
3+module Distribution.Nixpkgs.Haskell.FromCabal.License
4+ ( fromCabalLicense
5+ , fromSPDXLicense
6+ , isFreeLicense
7+ ) where
8+
9+import Data.List (intercalate)
10+import Distribution.License ( License(..), knownLicenses )
311import Distribution.Nixpkgs.License
4−import Distribution.License ( License(..) )
5−import Data.Version
12+import Distribution.Pretty (prettyShow)
13+import qualified Distribution.SPDX as SPDX
14+import Distribution.Text (display)
15+import Distribution.Version
16+
17+-- TODO: Programmatically strip trailing zeros from license version numbers.
618
719fromCabalLicense :: Distribution.License.License -> Distribution.Nixpkgs.License.License
8−fromCabalLicense (GPL Nothing) = Unknown (Just "GPL")
9−fromCabalLicense (GPL (Just (Version [2] []))) = Known "stdenv.lib.licenses.gpl2"
10−fromCabalLicense (GPL (Just (Version [3] []))) = Known "stdenv.lib.licenses.gpl3"
11−fromCabalLicense (LGPL Nothing) = Unknown (Just "LGPL")
12−fromCabalLicense (LGPL (Just (Version [2,1] []))) = Known "stdenv.lib.licenses.lgpl21"
13−fromCabalLicense (LGPL (Just (Version [2] []))) = Known "stdenv.lib.licenses.lgpl2"
14−fromCabalLicense (LGPL (Just (Version [3] []))) = Known "stdenv.lib.licenses.gpl3"
15−fromCabalLicense (AGPL Nothing) = Unknown (Just "AGPL")
16−fromCabalLicense (AGPL (Just (Version [3] []))) = Known "stdenv.lib.licenses.agpl3"
17−fromCabalLicense (AGPL (Just (Version [3,0] []))) = Known "stdenv.lib.licenses.agpl3"
18−fromCabalLicense (MPL (Version [2,0] [])) = Known "stdenv.lib.licenses.mpl20"
19−fromCabalLicense BSD2 = Known "stdenv.lib.licenses.bsd2"
20−fromCabalLicense BSD3 = Known "stdenv.lib.licenses.bsd3"
21−fromCabalLicense BSD4 = Known "stdenv.lib.licenses.bsdOriginal"
22−fromCabalLicense MIT = Known "stdenv.lib.licenses.mit"
23−fromCabalLicense PublicDomain = Known "stdenv.lib.licenses.publicDomain"
24−fromCabalLicense UnspecifiedLicense = Known "stdenv.lib.licenses.unfree"
25−fromCabalLicense AllRightsReserved = Known "stdenv.lib.licenses.unfree"
26−fromCabalLicense (Apache Nothing) = Known "stdenv.lib.licenses.asl20"
27−fromCabalLicense (Apache (Just (Version [2,0] []))) = Known "stdenv.lib.licenses.asl20"
28−fromCabalLicense ISC = Known "stdenv.lib.licenses.isc"
29−fromCabalLicense OtherLicense = Unknown Nothing
30−fromCabalLicense l = error $ "Distribution.Nixpkgs.Haskell.FromCabal.License.fromCabalLicense: unknown license " ++ show l
20+fromCabalLicense (GPL Nothing) = Unknown (Just "GPL")
21+fromCabalLicense (GPL (Just (versionNumbers -> [2]))) = Known "stdenv.lib.licenses.gpl2"
22+fromCabalLicense (GPL (Just (versionNumbers -> [3]))) = Known "stdenv.lib.licenses.gpl3"
23+fromCabalLicense (GPL (Just (versionNumbers -> [3,0]))) = Known "stdenv.lib.licenses.gpl3"
24+fromCabalLicense (LGPL Nothing) = Unknown (Just "LGPL")
25+fromCabalLicense (LGPL (Just (versionNumbers -> [2,1]))) = Known "stdenv.lib.licenses.lgpl21"
26+fromCabalLicense (LGPL (Just (versionNumbers -> [2]))) = Known "stdenv.lib.licenses.lgpl2"
27+fromCabalLicense (LGPL (Just (versionNumbers -> [3]))) = Known "stdenv.lib.licenses.lgpl3"
28+fromCabalLicense (LGPL (Just (versionNumbers -> [3,0]))) = Known "stdenv.lib.licenses.lgpl3"
29+fromCabalLicense (AGPL Nothing) = Unknown (Just "AGPL")
30+fromCabalLicense (AGPL (Just (versionNumbers -> [3]))) = Known "stdenv.lib.licenses.agpl3"
31+fromCabalLicense (AGPL (Just (versionNumbers -> [3,0]))) = Known "stdenv.lib.licenses.agpl3"
32+fromCabalLicense (MPL (versionNumbers -> [2,0])) = Known "stdenv.lib.licenses.mpl20"
33+fromCabalLicense BSD2 = Known "stdenv.lib.licenses.bsd2"
34+fromCabalLicense BSD3 = Known "stdenv.lib.licenses.bsd3"
35+fromCabalLicense BSD4 = Known "stdenv.lib.licenses.bsdOriginal"
36+fromCabalLicense MIT = Known "stdenv.lib.licenses.mit"
37+fromCabalLicense PublicDomain = Known "stdenv.lib.licenses.publicDomain"
38+fromCabalLicense UnspecifiedLicense = Known "stdenv.lib.licenses.unfree"
39+fromCabalLicense AllRightsReserved = Known "stdenv.lib.licenses.unfree"
40+fromCabalLicense (Apache Nothing) = Known "stdenv.lib.licenses.asl20"
41+fromCabalLicense (Apache (Just (versionNumbers -> [2,0]))) = Known "stdenv.lib.licenses.asl20"
42+fromCabalLicense ISC = Known "stdenv.lib.licenses.isc"
43+fromCabalLicense OtherLicense = Unknown Nothing
44+fromCabalLicense (UnknownLicense "CC0-1.0") = Known "stdenv.lib.licenses.cc0"
45+fromCabalLicense (UnknownLicense "BSD3ClauseORApache20") = Known "stdenv.lib.licenses.bsd3"
46+fromCabalLicense l = error $ "Distribution.Nixpkgs.Haskell.FromCabal.License.fromCabalLicense: unknown license"
47+ ++ show l ++"\nChoose one of: " ++ intercalate ", " (map display knownLicenses)
48+
49+fromSPDXLicense :: SPDX.License -> Distribution.Nixpkgs.License.License
50+fromSPDXLicense SPDX.NONE = Unknown Nothing
51+fromSPDXLicense (SPDX.License expr) =
52+ case expr of
53+ SPDX.ELicense simpl Nothing ->
54+ -- Not handled: license exceptions
55+ case simpl of
56+ SPDX.ELicenseId lid ->
57+ case lid of
58+ SPDX.AFL_2_1 -> Known "stdenv.lib.licenses.afl21"
59+ SPDX.AFL_3_0 -> Known "stdenv.lib.licenses.afl3"
60+ SPDX.AGPL_3_0_only -> Known "stdenv.lib.licenses.agpl3"
61+ SPDX.AGPL_3_0_or_later -> Known "stdenv.lib.licenses.agpl3Plus"
62+ SPDX.APSL_2_0 -> Known "stdenv.lib.licenses.apsl20"
63+ SPDX.Artistic_1_0 -> Known "stdenv.lib.licenses.artistic1"
64+ SPDX.Artistic_2_0 -> Known "stdenv.lib.licenses.artistic2"
65+ SPDX.Apache_2_0 -> Known "stdenv.lib.licenses.asl20"
66+ SPDX.BSL_1_0 -> Known "stdenv.lib.licenses.boost"
67+ SPDX.Beerware -> Known "stdenv.lib.licenses.beerware"
68+ SPDX.NullBSD -> Known "stdenv.lib.licenses.bsd0"
69+ SPDX.BSD_2_Clause -> Known "stdenv.lib.licenses.bsd2"
70+ SPDX.BSD_3_Clause -> Known "stdenv.lib.licenses.bsd3"
71+ SPDX.BSD_4_Clause -> Known "stdenv.lib.licenses.bsdOriginal"
72+ SPDX.ClArtistic -> Known "stdenv.lib.licenses.clArtistic"
73+ SPDX.CC0_1_0 -> Known "stdenv.lib.licenses.cc0"
74+ SPDX.CC_BY_NC_SA_2_0 -> Known "stdenv.lib.licenses.cc-by-nc-sa-20"
75+ SPDX.CC_BY_NC_SA_2_5 -> Known "stdenv.lib.licenses.cc-by-nc-sa-25"
76+ SPDX.CC_BY_NC_SA_3_0 -> Known "stdenv.lib.licenses.cc-by-nc-sa-30"
77+ SPDX.CC_BY_NC_SA_4_0 -> Known "stdenv.lib.licenses.cc-by-nc-sa-40"
78+ SPDX.CC_BY_NC_4_0 -> Known "stdenv.lib.licenses.cc-by-nc-40"
79+ SPDX.CC_BY_ND_3_0 -> Known "stdenv.lib.licenses.cc-by-nd-30"
80+ SPDX.CC_BY_SA_2_5 -> Known "stdenv.lib.licenses.cc-by-sa-25"
81+ SPDX.CC_BY_3_0 -> Known "stdenv.lib.licenses.cc-by-30"
82+ SPDX.CC_BY_SA_3_0 -> Known "stdenv.lib.licenses.cc-by-sa-30"
83+ SPDX.CC_BY_4_0 -> Known "stdenv.lib.licenses.cc-by-40"
84+ SPDX.CC_BY_SA_4_0 -> Known "stdenv.lib.licenses.cc-by-sa-40"
85+ SPDX.CDDL_1_0 -> Known "stdenv.lib.licenses.cddl"
86+ SPDX.CECILL_2_0 -> Known "stdenv.lib.licenses.cecill20"
87+ SPDX.CECILL_B -> Known "stdenv.lib.licenses.cecill-b"
88+ SPDX.CECILL_C -> Known "stdenv.lib.licenses.cecill-c"
89+ SPDX.CPAL_1_0 -> Known "stdenv.lib.licenses.cpal10"
90+ SPDX.CPL_1_0 -> Known "stdenv.lib.licenses.cpl10"
91+ SPDX.Curl -> Known "stdenv.lib.licenses.curl"
92+ SPDX.DOC -> Known "stdenv.lib.licenses.doc"
93+ SPDX.EFL_1_0 -> Known "stdenv.lib.licenses.efl10"
94+ SPDX.EFL_2_0 -> Known "stdenv.lib.licenses.efl20"
95+ SPDX.EPL_1_0 -> Known "stdenv.lib.licenses.epl10"
96+ SPDX.EPL_2_0 -> Known "stdenv.lib.licenses.epl20"
97+ SPDX.EUPL_1_1 -> Known "stdenv.lib.licenses.eupl11"
98+ SPDX.GFDL_1_2_only -> Known "stdenv.lib.licenses.fdl12"
99+ SPDX.GFDL_1_3_only -> Known "stdenv.lib.licenses.fdl13"
100+ SPDX.GPL_1_0_only -> Known "stdenv.lib.licenses.gpl1"
101+ SPDX.GPL_1_0_or_later -> Known "stdenv.lib.licenses.gpl1Plus"
102+ SPDX.GPL_2_0_only -> Known "stdenv.lib.licenses.gpl2"
103+ SPDX.GPL_2_0_or_later -> Known "stdenv.lib.licenses.gpl2Plus"
104+ SPDX.GPL_3_0_only -> Known "stdenv.lib.licenses.gpl3"
105+ SPDX.GPL_3_0_or_later -> Known "stdenv.lib.licenses.gpl3Plus"
106+ SPDX.HPND -> Known "stdenv.lib.licenses.hpnd"
107+ SPDX.IJG -> Known "stdenv.lib.licenses.ijg"
108+ SPDX.ImageMagick -> Known "stdenv.lib.licenses.imagemagick"
109+ SPDX.IPA -> Known "stdenv.lib.licenses.ipa"
110+ SPDX.IPL_1_0 -> Known "stdenv.lib.licenses.ipl10"
111+ SPDX.ISC -> Known "stdenv.lib.licenses.isc"
112+ SPDX.JasPer_2_0 -> Known "stdenv.lib.licenses.jasper"
113+ SPDX.LGPL_2_0_only -> Known "stdenv.lib.licenses.lgpl2"
114+ SPDX.LGPL_2_0_or_later -> Known "stdenv.lib.licenses.lgpl2Plus"
115+ SPDX.LGPL_2_1_only -> Known "stdenv.lib.licenses.lgpl21"
116+ SPDX.LGPL_2_1_or_later -> Known "stdenv.lib.licenses.lgpl21Plus"
117+ SPDX.LGPL_3_0_only -> Known "stdenv.lib.licenses.lgpl3"
118+ SPDX.LGPL_3_0_or_later -> Known "stdenv.lib.licenses.lgpl3Plus"
119+ SPDX.Libpng -> Known "stdenv.lib.licenses.libpng"
120+ SPDX.Libtiff -> Known "stdenv.lib.licenses.libtiff"
121+ SPDX.LPPL_1_2 -> Known "stdenv.lib.licenses.lppl12"
122+ SPDX.LPPL_1_3c -> Known "stdenv.lib.licenses.lppl13c"
123+ SPDX.LPL_1_02 -> Known "stdenv.lib.licenses.lpl-102"
124+ SPDX.MIT -> Known "stdenv.lib.licenses.mit"
125+ SPDX.MPL_1_0 -> Known "stdenv.lib.licenses.mpl10"
126+ SPDX.MPL_1_1 -> Known "stdenv.lib.licenses.mpl11"
127+ SPDX.MPL_2_0 -> Known "stdenv.lib.licenses.mpl20"
128+ SPDX.MS_PL -> Known "stdenv.lib.licenses.mspl"
129+ SPDX.NCSA -> Known "stdenv.lib.licenses.ncsa"
130+ SPDX.NPOSL_3_0 -> Known "stdenv.lib.licenses.nposl3"
131+ SPDX.OFL_1_1 -> Known "stdenv.lib.licenses.ofl"
132+ SPDX.OLDAP_2_8 -> Known "stdenv.lib.licenses.openldap"
133+ SPDX.OpenSSL -> Known "stdenv.lib.licenses.openssl"
134+ SPDX.OSL_2_1 -> Known "stdenv.lib.licenses.osl21"
135+ SPDX.OSL_3_0 -> Known "stdenv.lib.licenses.osl3"
136+ SPDX.PHP_3_01 -> Known "stdenv.lib.licenses.php201"
137+ SPDX.PostgreSQL -> Known "stdenv.lib.licenses.postgresql"
138+ SPDX.Python_2_0 -> Known "stdenv.lib.licenses.psfl"
139+ SPDX.QPL_1_0 -> Known "stdenv.lib.licenses.qpl"
140+ SPDX.Ruby -> Known "stdenv.lib.licenses.ruby"
141+ SPDX.Sendmail -> Known "stdenv.lib.licenses.sendmail"
142+ SPDX.SGI_B_2_0 -> Known "stdenv.lib.licenses.sgi-b-0"
143+ SPDX.Sleepycat -> Known "stdenv.lib.licenses.sleepycat"
144+ SPDX.TCL -> Known "stdenv.lib.licenses.tcltx"
145+ SPDX.Unlicense -> Known "stdenv.lib.licenses.unlicense"
146+ SPDX.Vim -> Known "stdenv.lib.licenses.vim"
147+ SPDX.VSL_1_0 -> Known "stdenv.lib.licenses.vsl10"
148+ SPDX.Watcom_1_0 -> Known "stdenv.lib.licenses.watcom"
149+ SPDX.W3C -> Known "stdenv.lib.licenses.w3c"
150+ SPDX.WTFPL -> Known "stdenv.lib.licenses.wtfpl"
151+ SPDX.Zlib -> Known "stdenv.lib.licenses.zlib"
152+ SPDX.ZPL_2_0 -> Known "stdenv.lib.licenses.zpl20"
153+ SPDX.ZPL_2_1 -> Known "stdenv.lib.licenses.zpl21"
154+ _ ->
155+ -- Licence is not in Nixpkgs.
156+ -- Use the SPDX expression as a free-form license string.
157+ Unknown (Just $ prettyShow expr)
158+ _ ->
159+ -- Not handed: the '+' suffix and user-defined licences references.
160+ -- Use the SPDX expression as a free-form license string.
161+ Unknown (Just $ prettyShow expr)
162+ _ ->
163+ -- Not handled: compound expressions, not expressible in Nixpkgs.
164+ -- Use the SPDX expression as a free-form license string.
165+ Unknown (Just $ prettyShow expr)
166+
167+isFreeLicense :: Distribution.Nixpkgs.License.License -> Bool
168+isFreeLicense (Known "stdenv.lib.licenses.unfree") = False
169+isFreeLicense (Unknown Nothing) = False
170+isFreeLicense _ = True
src/Distribution/Nixpkgs/Haskell/FromCabal/Name.hs+107−56
@@ -2,74 +2,80 @@
22
33module Distribution.Nixpkgs.Haskell.FromCabal.Name ( toNixName, libNixName, buildToolNixName ) where
44
5+import Data.Maybe
56import Data.String
67import Distribution.Package
8+import Distribution.Text
79import Language.Nix
810
911-- | Map Cabal names to Nix attribute names.
1012toNixName :: PackageName -> Identifier
11−toNixName (PackageName "") = error "toNixName: invalid empty package name"
12−toNixName (PackageName n) = fromString n
13+toNixName "" = error "toNixName: invalid empty package name"
14+toNixName n = fromString (unPackageName n)
1315
14−-- | Map libraries to Nix packages.
16+-- | Map library names specified in Cabal files to Nix package identifiers.
1517--
1618-- TODO: This list should not be hard-coded here; it belongs into the Nixpkgs
17−-- repository.
19+-- repository.
20+--
21+-- TODO: Re-use hook matching system from PostProcess.hs here.
1822
1923libNixName :: String -> [Identifier]
2024libNixName "" = []
2125libNixName "adns" = return "adns"
2226libNixName "alsa" = return "alsaLib"
2327libNixName "alut" = return "freealut"
24−libNixName "appindicator-0.1" = return "appindicator"
25−libNixName "appindicator3-0.1" = return "appindicator"
28+libNixName "appindicator-0.1" = return "libappindicator-gtk2"
29+libNixName "appindicator3-0.1" = return "libappindicator-gtk3"
2630libNixName "asound" = return "alsaLib"
27−libNixName "awesomium-1.6.5" = return "awesomium"
31+libNixName "b2" = return "libb2"
32+libNixName "boost_context" = return "boost"
2833libNixName "bz2" = return "bzip2"
34+libNixName "c++" = [] -- What is that?
35+libNixName "cairo-gobject" = return "cairo"
2936libNixName "cairo-pdf" = return "cairo"
3037libNixName "cairo-ps" = return "cairo"
31−libNixName "cairo" = return "cairo"
3238libNixName "cairo-svg" = return "cairo"
33−libNixName "CEGUIBase-0.7.7" = return "CEGUIBase"
34−libNixName "CEGUIOgreRenderer-0.7.7" = return "CEGUIOgreRenderer"
35−libNixName "clutter-1.0" = return "clutter"
36−libNixName "crypto" = return "openssl"
3739libNixName "crypt" = [] -- provided by glibc
40+libNixName "crypto" = return "openssl"
3841libNixName "curses" = return "ncurses"
39−libNixName "c++" = [] -- What is that?
42+libNixName "dbusmenu-glib-0.4" = return "libdbusmenu"
43+libNixName "dbusmenu-gtk3-0.4" = ["libdbusmenu-gtk3", "gtk3"]
4044libNixName "dl" = [] -- provided by glibc
41−libNixName "fftw3f" = return "fftwFloat"
4245libNixName "fftw3" = return "fftw"
43−libNixName "gconf-2.0" = return "GConf"
46+libNixName "fftw3f" = return "fftwFloat"
4447libNixName "gconf" = return "GConf"
45−libNixName "gdk-2.0" = return "gtk"
46−libNixName "gdk-pixbuf-2.0" = return "gdk_pixbuf"
48+libNixName "gconf-2.0" = return "GConf"
49+libNixName "gdk-2.0" = return "gtk2"
50+libNixName "gdk-3.0" = return "gtk3"
51+libNixName "gdk-pixbuf-2.0" = return "gdk-pixbuf"
4752libNixName "gdk-x11-2.0" = return "gdk_x11"
53+libNixName "gdk-x11-3.0" = return "gtk3"
4854libNixName "gio-2.0" = return "glib"
49−libNixName "glib-2.0" = return "glib"
50−libNixName "GL" = return "mesa"
51−libNixName "GLU" = ["freeglut","mesa"]
52−libNixName "glut" = ["freeglut","mesa"]
53−libNixName "gmime-2.4" = return "gmime"
54−libNixName "gnome-keyring-1" = return "gnome_keyring"
55−libNixName "gnome-keyring" = return "gnome_keyring"
56−libNixName "gnome-vfs-2.0" = return "gnome_vfs"
57−libNixName "gnome-vfs-module-2.0" = return "gnome_vfs_module"
55+libNixName "GL" = return "libGL"
56+libNixName "GLU" = ["libGLU","libGL"]
57+libNixName "glut" = ["freeglut","libGLU","libGL"]
58+libNixName "gnome-keyring" = return "gnome-keyring"
59+libNixName "gnome-keyring-1" = return "libgnome-keyring"
60+libNixName "gnome-vfs-2.0" = return "gnome-vfs"
61+libNixName "gnome-vfs-module-2.0" = return "gnome-vfs_module"
5862libNixName "gobject-2.0" = return "glib"
59−libNixName "gstreamer-0.10" = return "gstreamer"
60−libNixName "gstreamer-audio-0.10" = return "gst_plugins_base"
61−libNixName "gstreamer-base-0.10" = return "gst_plugins_base"
63+libNixName "gobject-introspection-1.0" = return "gobject-introspection"
64+libNixName "gstreamer-audio-0.10" = return "gst-plugins-base"
65+libNixName "gstreamer-audio-1.0" = return "gst-plugins-base"
66+libNixName "gstreamer-base-0.10" = return "gst-plugins-base"
67+libNixName "gstreamer-base-1.0" = return "gst-plugins-base"
6268libNixName "gstreamer-controller-0.10" = return "gstreamer"
6369libNixName "gstreamer-dataprotocol-0.10" = return "gstreamer"
64−libNixName "gstreamer-net-0.10" = return "gst_plugins_base"
65−libNixName "gstreamer-plugins-base-0.10" = return "gst_plugins_base"
70+libNixName "gstreamer-net-0.10" = return "gst-plugins-base"
71+libNixName "gstreamer-plugins-base-0.10" = return "gst-plugins-base"
72+libNixName "gstreamer-video-1.0" = return "gst-plugins-base"
6673libNixName "gthread-2.0" = return "glib"
67−libNixName "gtk+-2.0" = return "gtk"
74+libNixName "gtk+-2.0" = return "gtk2"
6875libNixName "gtk+-3.0" = return "gtk3"
69−libNixName "gtkglext-1.0" = return "gtkglext"
70−libNixName "gtksourceview-2.0" = return "gtksourceview"
71−libNixName "gtksourceview-3.0" = return "gtksourceview"
7276libNixName "gtk-x11-2.0" = return "gtk_x11"
77+libNixName "gtksourceview-3.0" = return "gtksourceview3"
78+libNixName "hidapi-libusb" = return "hidapi"
7379libNixName "icudata" = return "icu"
7480libNixName "icui18n" = return "icu"
7581libNixName "icuuc" = return "icu"
@@ -79,96 +85,141 @@ libNixName "ImageMagick" = return "imagemagick"
7985libNixName "Imlib2" = return "imlib2"
8086libNixName "iw" = return "wirelesstools"
8187libNixName "jack" = return "libjack2"
88+libNixName "javascriptcoregtk-3.0" = return "webkitgtk24x-gtk3" -- These are the old APIs, of which 2.4 is the last provider, so map directly to that.
89+libNixName "javascriptcoregtk-4.0" = return "webkitgtk"
8290libNixName "jpeg" = return "libjpeg"
91+libNixName "jvm" = return "jdk"
92+libNixName "lapack" = return "liblapack"
93+libNixName "lber" = return "openldap"
8394libNixName "ldap" = return "openldap"
8495libNixName "libavutil" = return "ffmpeg"
85−libNixName "libglade-2.0" = return "libglade"
8696libNixName "libgsasl" = return "gsasl"
87−libNixName "librsvg-2.0" = return "librsvg"
97+libNixName "libpcre" = return "pcre"
98+libNixName "libpcre2" = return "pcre2"
99+libNixName "libpcre2-8" = libNixName "libpcre2"
100+libNixName "libqrencode" = return "qrencode"
101+libNixName "libR" = return "R"
88102libNixName "libsoup-gnome-2.4" = return "libsoup"
89103libNixName "libsystemd" = return "systemd"
90−libNixName "libusb-1.0" = return "libusb"
104+libNixName "libudev" = return "systemd"
91105libNixName "libxml-2.0" = return "libxml2"
92106libNixName "libzip" = return "libzip"
93107libNixName "libzmq" = return "zeromq"
94−libNixName "MagickWand" = return "imagemagick"
95−libNixName "magic" = return "file"
96108libNixName "m" = [] -- in stdenv
97−libNixName "mono-2.0" = return "mono"
109+libNixName "magic" = return "file"
110+libNixName "MagickWand" = return "imagemagick"
111+libNixName "mnl" = return "libmnl"
98112libNixName "mpi" = return "openmpi"
99113libNixName "ncursesw" = return "ncurses"
100114libNixName "netsnmp" = return "net_snmp"
115+libNixName "nix-expr" = return "nix"
116+libNixName "nix-main" = return "nix"
117+libNixName "nix-store" = return "nix"
101118libNixName "notify" = return "libnotify"
102119libNixName "odbc" = return "unixODBC"
120+libNixName "openblas" = return "openblasCompat"
103121libNixName "panelw" = return "ncurses"
104122libNixName "pangocairo" = return "pango"
105123libNixName "pcap" = return "libpcap"
106−libNixName "pcre" = return "pcre"
107124libNixName "pfs-1.2" = return "pfstools"
108125libNixName "png" = return "libpng"
109126libNixName "poppler-glib" = return "poppler"
110−libNixName "portaudio-2.0" = return "portaudio"
111127libNixName "pq" = return "postgresql"
112128libNixName "pthread" = []
129+libNixName "pulse" = return "libpulseaudio"
113130libNixName "pulse-simple" = return "libpulseaudio"
114−libNixName "python-3.3" = return "python3"
131+libNixName "python-3.3" = return "python33"
132+libNixName "python-3.4" = return "python34"
115133libNixName "Qt5Core" = return "qt5"
116134libNixName "Qt5Gui" = return "qt5"
117135libNixName "Qt5Qml" = return "qt5"
118136libNixName "Qt5Quick" = return "qt5"
119137libNixName "Qt5Widgets" = return "qt5"
120−libNixName "rtlsdr" = return "rtl-sdr"
138+libNixName "quadprog" = return "QuadProgpp"
121139libNixName "rt" = [] -- in glibc
140+libNixName "rtlsdr" = return "rtl-sdr"
122141libNixName "ruby1.8" = return "ruby"
123142libNixName "sass" = return "libsass"
124−libNixName "sane-backends" = return "saneBackends"
125−libNixName "SDL2-2.0" = return "SDL2"
143+libNixName "sctp" = return "lksctp-tools" -- This is linux-specific, we should create a common attribute if we ever add sctp support for other systems.
126144libNixName "sdl2" = return "SDL2"
127145libNixName "sndfile" = return "libsndfile"
128146libNixName "sodium" = return "libsodium"
129147libNixName "sqlite3" = return "sqlite"
148+libNixName "ssh2" = return "libssh2"
130149libNixName "ssl" = return "openssl"
131−libNixName "stdc++.dll" = [] -- What is that?
150+libNixName "statgrab" = return "libstatgrab"
132151libNixName "stdc++" = [] -- What is that?
152+libNixName "stdc++.dll" = [] -- What is that?
133153libNixName "systemd-journal" = return "systemd"
134154libNixName "tag_c" = return "taglib"
135155libNixName "taglib_c" = return "taglib"
156+libNixName "tensorflow" = return "libtensorflow"
136157libNixName "udev" = return "systemd";
137158libNixName "uuid" = return "libossp_uuid";
138−libNixName "vte-2.90" = return "vte"
159+libNixName "vte-2.91" = return "vte_291"
139160libNixName "wayland-client" = return "wayland"
140161libNixName "wayland-cursor" = return "wayland"
141−libNixName "wayland-egl" = return "mesa"
162+libNixName "wayland-egl" = return "libGL"
142163libNixName "wayland-server" = return "wayland"
143−libNixName "webkit-1.0" = return "webkit"
144−libNixName "webkitgtk-3.0" = return "webkit"
145−libNixName "webkitgtk" = return "webkit"
164+libNixName "webkit2gtk" = return "webkitgtk"
165+libNixName "webkit2gtk-4.0" = return "webkitgtk"
166+libNixName "webkit2gtk-web-extension-4.0" = return "webkitgtk"
167+libNixName "webkitgtk-3.0" = return "webkitgtk24x-gtk3" -- These are the old APIs, of which 2.4 is the last provider, so map directly to that
146168libNixName "X11" = return "libX11"
169+libNixName "x11" = return "xlibsWrapper"
147170libNixName "xau" = return "libXau"
148171libNixName "Xcursor" = return "libXcursor"
149172libNixName "xerces-c" = return "xercesc"
150173libNixName "Xext" = return "libXext"
151174libNixName "xft" = return "libXft"
152−libNixName "Xinerama" = return "libXinerama"
153175libNixName "Xi" = return "libXi"
176+libNixName "Xinerama" = return "libXinerama"
154177libNixName "xkbcommon" = return "libxkbcommon"
155178libNixName "xml2" = return "libxml2"
156179libNixName "Xpm" = return "libXpm"
157180libNixName "Xrandr" = return "libXrandr"
181+libNixName "Xrender" = return "libXrender"
158182libNixName "Xss" = return "libXScrnSaver"
159183libNixName "Xtst" = return "libXtst"
160184libNixName "Xxf86vm" = return "libXxf86vm"
161−libNixName "zmq" = return "zeromq"
185+libNixName "yaml" = return "libyaml"
186+libNixName "yaml-0.1" = return "libyaml"
162187libNixName "z" = return "zlib"
163−libNixName x = return (fromString x)
188+libNixName "zmq" = return "zeromq"
189+libNixName x = return (guessNixIdentifier x)
164190
165191-- | Map build tool names to Nix attribute names.
166192buildToolNixName :: String -> [Identifier]
167193buildToolNixName "" = return (error "buildToolNixName: invalid empty dependency name")
168194buildToolNixName "cabal" = return "cabal-install"
195+buildToolNixName "fltk-config" = return "fltk"
169196buildToolNixName "ghc" = []
170197buildToolNixName "gtk2hsC2hs" = return "gtk2hs-buildtools"
171198buildToolNixName "gtk2hsHookGenerator" = return "gtk2hs-buildtools"
172199buildToolNixName "gtk2hsTypeGen" = return "gtk2hs-buildtools"
173200buildToolNixName "hsc2hs" = []
201+buildToolNixName "nix-build" = return "nix"
202+buildToolNixName "nix-env" = return "nix"
203+buildToolNixName "nix-hash" = return "nix"
204+buildToolNixName "nix-instantiate" = return "nix"
205+buildToolNixName "nix-store" = return "nix"
174206buildToolNixName x = return (fromString x)
207+
208+-- | Helper function to extract the package name from a String that may or may
209+-- not be formatted like a Cabal package identifier.
210+--
211+-- >>> guessNixIdentifier "foo-1.0"
212+-- Identifier "foo"
213+-- >>> guessNixIdentifier "foo"
214+-- Identifier "foo"
215+-- >>> guessNixIdentifier "foo - 0"
216+-- Identifier "foo - 0"
217+-- >>> guessNixIdentifier "1foo-1.0"
218+-- Identifier "1foo"
219+-- >>> guessNixIdentifier "-foo-1.0"
220+-- Identifier "-foo-1.0"
221+
222+guessNixIdentifier :: String -> Identifier
223+guessNixIdentifier x = fromString (fromMaybe x maybePackageId)
224+ where
225+ maybePackageId = unPackageName . pkgName <$> simpleParse x
src/Distribution/Nixpkgs/Haskell/FromCabal/Normalize.hs+13−52
@@ -1,16 +1,13 @@
1−module Distribution.Nixpkgs.Haskell.FromCabal.Normalize ( normalize, normalizeCabalFlags ) where
1+{-# LANGUAGE OverloadedStrings #-}
22
3−import Data.Function
4−import Data.List
5−import Data.Set ( Set )
3+module Distribution.Nixpkgs.Haskell.FromCabal.Normalize ( normalize ) where
4+
5+import Control.Lens
66import qualified Data.Set as Set
77import Data.String
88import Distribution.Nixpkgs.Haskell
99import Distribution.Nixpkgs.Meta
1010import Distribution.Package
11−import Distribution.PackageDescription ( FlagAssignment, FlagName(..) )
12−import Distribution.Simple.Utils ( lowercase )
13−import Internal.Lens
1411import Language.Nix hiding ( quote )
1512
1613normalize :: Derivation -> Derivation
@@ -18,27 +15,20 @@ normalize drv = drv
1815 & over libraryDepends (normalizeBuildInfo (packageName drv))
1916 & over executableDepends (normalizeBuildInfo (packageName drv))
2017 & over testDepends (normalizeBuildInfo (packageName drv))
18+ & over benchmarkDepends (normalizeBuildInfo (packageName drv))
2119 & over metaSection normalizeMeta
22− & over cabalFlags normalizeCabalFlags
23− & jailbreak %~ (&& (packageName drv /= PackageName "jailbreak-cabal"))
20+ & jailbreak %~ (&& (packageName drv /= "jailbreak-cabal"))
2421
2522normalizeBuildInfo :: PackageName -> BuildInfo -> BuildInfo
26−normalizeBuildInfo (PackageName pname) bi = bi
27− & haskell %~ Set.filter (\b -> view localName b /= fromString pname)
28− & tool %~ Set.filter (\b -> view localName b /= fromString pname)
29−
30− {-
31− {
32− , testDepends = normalizeNixNames (Set.delete pname testDepends)
33− , extraLibs = normalizeNixLibs extraLibs
34− , pkgConfDeps = normalizeNixLibs pkgConfDeps
35− , configureFlags = normalizeSet configureFlags
36− }
37−-}
23+normalizeBuildInfo pname bi = bi
24+ & haskell %~ Set.filter (\b -> view localName b /= fromString (unPackageName pname))
25+ & tool %~ Set.filter (\b -> view localName b /= fromString (unPackageName pname))
3826
3927normalizeMeta :: Meta -> Meta
40−normalizeMeta = over description normalizeSynopsis
41− . over platforms normalizePlatforms
28+normalizeMeta meta = meta
29+ & description %~ normalizeSynopsis
30+ & platforms %~ Set.intersection allKnownPlatforms
31+ & hydraPlatforms %~ (if meta^.broken then const Set.empty else Set.intersection (meta^.platforms))
4232
4333normalizeSynopsis :: String -> String
4434normalizeSynopsis desc
@@ -51,32 +41,3 @@ quote ('\\':c:cs) = '\\' : c : quote cs
5141quote ('"':cs) = '\\' : '"' : quote cs
5242quote (c:cs) = c : quote cs
5343quote [] = []
54−
55−normalizeSet :: Set String -> Set String
56−normalizeSet = Set.filter (not . null)
57−
58−-- normalizeNixNames :: Set String -> Set String
59−-- normalizeNixNames = normalizeSet . Set.map toNixName
60−
61−-- normalizeNixLibs :: Set String -> Set String
62−-- normalizeNixLibs = normalizeSet . Set.fromList . concatMap libNixName . Set.toList
63−
64−-- normalizeNixBuildTools :: Set Identifier -> Set Identifier
65−-- normalizeNixBuildTools = Set.fromList . concatMap buildToolNixName . Set.toList
66−
67−normalizePlatforms :: Set String -> Set String
68−normalizePlatforms = normalizeSet . Set.map
69− (\p -> if '.' `elem` p then p else "stdenv.lib.platforms." ++ p)
70−
71−
72−-- |When a flag is specified multiple times, the first occurrence
73−-- counts. This is counter-intuitive, IMHO, but it's how cabal does it.
74−-- Flag names are spelled in all lowercase.
75−--
76−-- >>> normalizeCabalFlags [(FlagName "foo", True), (FlagName "FOO", True), (FlagName "Foo", False)]
77−-- [(FlagName "foo",True)]
78−
79−normalizeCabalFlags :: FlagAssignment -> FlagAssignment
80−normalizeCabalFlags flags' = nubBy ((==) `on` fst) (sortBy (compare `on` fst) flags)
81− where
82− flags = [ (FlagName (lowercase n), b) | (FlagName n, b) <- flags' ]
src/Distribution/Nixpkgs/Haskell/FromCabal/PostProcess.hs+281−163
@@ -1,20 +1,31 @@
11{-# LANGUAGE OverloadedStrings #-}
2+{-# LANGUAGE ScopedTypeVariables #-}
23
3−module Distribution.Nixpkgs.Haskell.FromCabal.PostProcess ( postProcess ) where
4+module Distribution.Nixpkgs.Haskell.FromCabal.PostProcess ( postProcess, pkg ) where
45
5−import Internal.Lens
6−import Data.Set.Lens
6+import Control.Lens
7+import Control.Monad.Trans.State
8+import Data.List.Split
9+import Data.Map ( Map )
10+import qualified Data.Map as Map
11+import Data.Map.Lens
712import Data.Set ( Set )
813import qualified Data.Set as Set
914import Distribution.Nixpkgs.Haskell
15+import Distribution.Nixpkgs.Meta
16+import Distribution.Nixpkgs.License
1017import Distribution.Package
18+import Distribution.System
1119import Distribution.Text
1220import Distribution.Version
1321import Language.Nix
14−import Data.List.Split
1522
1623postProcess :: Derivation -> Derivation
17−postProcess deriv = foldr ($) (fixGtkBuilds deriv) [ f | (Dependency n vr, f) <- hooks, packageName deriv == n, packageVersion deriv `withinRange` vr ]
24+postProcess deriv =
25+ foldr (.) id [ f | (Dependency n vr _, f) <- hooks, packageName deriv == n, packageVersion deriv `withinRange` vr ]
26+ . fixGtkBuilds
27+ . fixBuildDependsForTools
28+ $ deriv
1829
1930fixGtkBuilds :: Derivation -> Derivation
2031fixGtkBuilds drv = drv & dependencies . pkgconfig %~ Set.filter (not . collidesWithHaskellName)
@@ -22,65 +33,210 @@ fixGtkBuilds drv = drv & dependencies . pkgconfig %~ Set.filter (not . collidesW
2233 & dependencies . tool %~ Set.filter (not . collidesWithHaskellName)
2334 where
2435 collidesWithHaskellName :: Binding -> Bool
25− collidesWithHaskellName b = view localName b `Set.member` buildDeps
36+ collidesWithHaskellName b = case buildDeps Map.!? view localName b of
37+ Nothing -> False -- totally uncollided
38+ Just p -> p /= view reference b -- identical is not collision, and important to preserve for cross
2639
2740 myName :: Identifier
28− myName = create ident n where PackageName n = packageName drv
29−
30− buildDeps :: Set Identifier
31− buildDeps = Set.delete myName (setOf (dependencies . haskell . folded . localName) drv)
41+ myName = ident # unPackageName (packageName drv)
42+
43+ buildDeps :: Map Identifier Path
44+ buildDeps = Map.delete myName (toMapOf (dependencies . haskell . to Set.toList . traverse . binding . ifolded) drv)
45+
46+-- Per https://github.com/haskell/cabal/issues/5412 hvr considers
47+-- `build-depends` providing executables an accident, and fragile one at that,
48+-- unworthy of any compatibility hacks. But while he and the other Hackage
49+-- maintainers is dedicated to fixing executables and libraries on Hackage, test
50+-- suites and benchmarks are not a priority, as it is trivial to skip building
51+-- test-suites with cabal-install. Nix however wishes to build test suites much
52+-- more widely, so skipping those components is not an option.
53+--
54+-- Between that, and Stack not changing behavior as of
55+-- https://github.com/commercialhaskell/stack/pull/4132, it seems likely that
56+-- for a while packages scraped from Hackage will continue to improperly use
57+-- `build-depends: package-for-tool` instead of `build-tool-depends` (which does
58+-- also work for Stack). Until that changes, we provide do this to work around
59+-- those package's brokenness.
60+fixBuildDependsForTools :: Derivation -> Derivation
61+fixBuildDependsForTools = foldr (.) id
62+ [ fmap snd $ runState $ do
63+ needs <- use $ cloneLens c . haskell . contains p
64+ cloneLens c . tool . contains p ||= needs
65+ | (c :: ALens' Derivation BuildInfo) <- [ testDepends, benchmarkDepends ]
66+ , p <- self <$> [ "hspec-discover"
67+ , "tasty-discover"
68+ , "hsx2hs"
69+ , "markdown-unlit"
70+ ]
71+ ]
3272
3373hooks :: [(Dependency, Derivation -> Derivation)]
3474hooks =
35− [ ("Agda", set (executableDepends . tool . contains (pkg "emacs")) True . set phaseOverrides agdaPostInstall)
75+ [ ("Agda < 2.5", set (executableDepends . tool . contains (pkg "emacs")) True . set phaseOverrides agdaPostInstall)
76+ , ("Agda >= 2.5", set (executableDepends . tool . contains (pkg "emacs")) True . set phaseOverrides agda25PostInstall)
77+ , ("alex < 3.1.5", set (testDepends . tool . contains (pkg "perl")) True)
78+ , ("alex", set (executableDepends . tool . contains (self "happy")) True)
79+ , ("alsa-core", over (metaSection . platforms) (Set.filter (\(Platform _ os) -> os == Linux)))
80+ , ("bindings-GLFW", over (libraryDepends . system) (Set.union (Set.fromList [bind "pkgs.xorg.libXext", bind "pkgs.xorg.libXfixes"])))
81+ , ("bindings-lxc", over (metaSection . platforms) (Set.filter (\(Platform _ os) -> os == Linux)))
82+ , ("bustle", bustleOverrides)
83+ , ("Cabal", set doCheck False) -- test suite doesn't work in Nix
84+ , ("Cabal >2.2", over (setupDepends . haskell) (Set.union (Set.fromList [self "mtl", self "parsec"]))) -- https://github.com/haskell/cabal/issues/5391
85+ , ("cabal-helper", set doCheck False) -- https://github.com/DanielG/cabal-helper/issues/17
86+ , ("cabal-install", set doCheck False . set phaseOverrides cabalInstallPostInstall)
87+ , ("cabal2nix > 2", cabal2nixOverrides)
88+ , ("darcs", set phaseOverrides darcsInstallPostInstall . set doCheck False)
89+ , ("dbus", set doCheck False) -- don't execute tests that try to access the network
3690 , ("dns", set testTarget "spec") -- don't execute tests that try to access the network
37− , ("bindings-GLFW", over (libraryDepends . system) (Set.union (Set.fromList [bind "pkgs.xlibs.libXext", bind "pkgs.xlibs.libXfixes"])))
38− , ("cabal-install", set phaseOverrides cabalInstallPostInstall)
39− , ("darcs", set phaseOverrides darcsInstallPostInstall)
40− , ("git-annex", gitAnnexHook)
41− , ("haddock", set phaseOverrides "preCheck = \"unset GHC_PACKAGE_PATH\";")
42− , ("HFuse", set phaseOverrides hfusePreConfigure)
91+ , ("eventstore", over (metaSection . platforms) (Set.filter (\(Platform arch _) -> arch == X86_64)))
92+ , ("freenect < 1.2.1", over configureFlags (Set.union (Set.fromList ["--extra-include-dirs=${pkgs.freenect}/include/libfreenect", "--extra-lib-dirs=${pkgs.freenect}/lib"])))
93+ , ("fltkhs", set (libraryDepends . system . contains (pkg "fltk14")) True . over (libraryDepends . pkgconfig) (Set.union (pkgs ["libGLU", "libGL"]))) -- TODO: fltk14 belongs into the *setup* dependencies.
4394 , ("gf", set phaseOverrides gfPhaseOverrides . set doCheck False)
95+ , ("gi-cairo", giCairoPhaseOverrides) -- https://github.com/haskell-gi/haskell-gi/issues/36
96+ , ("gi-gdk", set runHaddock True )
97+ , ("gi-gio", set runHaddock True )
98+ , ("gi-glib", set runHaddock True )
99+ , ("gi-gst", giGstLibOverrides "gstreamer") -- https://github.com/haskell-gi/haskell-gi/issues/36
100+ , ("gi-gstaudio", giGstLibOverrides "gst-plugins-base") -- https://github.com/haskell-gi/haskell-gi/issues/36
101+ , ("gi-gstbase", giGstLibOverrides "gst-plugins-base") -- https://github.com/haskell-gi/haskell-gi/issues/36
102+ , ("gi-gstvideo", giGstLibOverrides "gst-plugins-base") -- https://github.com/haskell-gi/haskell-gi/issues/36
103+ , ("gi-gtk", set runHaddock True )
104+ , ("gi-javascriptcore < 4.0.0.0", webkitgtk24xHook) -- https://github.com/haskell-gi/haskell-gi/issues/36
105+ , ("gi-pango", giCairoPhaseOverrides) -- https://github.com/haskell-gi/haskell-gi/issues/36
106+ , ("gi-pango", set runHaddock True )
107+ , ("gi-pangocairo", giCairoPhaseOverrides) -- https://github.com/haskell-gi/haskell-gi/issues/36
108+ , ("gi-vte", set runHaddock True )
109+ , ("gi-webkit", webkitgtk24xHook) -- https://github.com/haskell-gi/haskell-gi/issues/36
110+ , ("gio", set (libraryDepends . pkgconfig . contains "system-glib = pkgs.glib") True)
111+ , ("git", set doCheck False) -- https://github.com/vincenthz/hit/issues/33
112+ , ("git-annex >= 6.20170925 && < 6.20171214", set doCheck False) -- some versions of git-annex require their test suite to be run inside of a git checkout
113+ , ("git-annex", gitAnnexHook)
44114 , ("github-backup", set (executableDepends . tool . contains (pkg "git")) True)
115+ , ("GLFW", over (libraryDepends . system) (Set.union (Set.fromList [bind "pkgs.xorg.libXext", bind "pkgs.xorg.libXfixes"])))
45116 , ("GlomeVec", set (libraryDepends . pkgconfig . contains (bind "self.llvmPackages.llvm")) True)
117+ , ("graphviz", set (testDepends . system . contains (pkg "graphviz")) True)
46118 , ("gtk3", gtk3Hook)
119+ , ("gtkglext", gtkglextHook)
120+ , ("haddock", haddockHook) -- https://github.com/haskell/haddock/issues/511
121+ , ("hakyll", set (testDepends . tool . contains (pkg "utillinux")) True) -- test suite depends on "rev"
122+ , ("haskell-src-exts", set doCheck False)
123+ , ("hfsevents", hfseventsOverrides)
124+ , ("HFuse", set phaseOverrides hfusePreConfigure)
125+ , ("hlibgit2 >= 0.18.0.14", set (testDepends . tool . contains (pkg "git")) True)
126+ , ("hmatrix < 0.18.1.1", set phaseOverrides "preConfigure = \"sed -i hmatrix.cabal -e '/\\\\/usr\\\\//D'\";")
127+ , ("holy-project", set doCheck False) -- attempts to access the network
128+ , ("hoogle", set testTarget "--test-option=--no-net")
129+ , ("hsignal < 0.2.7.4", set phaseOverrides "prePatch = \"rm -v Setup.lhs\";") -- https://github.com/amcphail/hsignal/issues/1
130+ , ("hslua < 0.9.3", over (libraryDepends . system) (replace (pkg "lua") (pkg "lua5_1")))
131+ , ("hslua >= 0.9.3", over (libraryDepends . system) (replace (pkg "lua") (pkg "lua5_3")))
132+ , ("hspec-core >= 2.4.4", hspecCoreOverrides)
133+ , ("http-client", set doCheck False) -- attempts to access the network
134+ , ("http-client-openssl >= 0.2.0.1", set doCheck False) -- attempts to access the network
135+ , ("http-client-tls >= 0.2.2", set doCheck False) -- attempts to access the network
136+ , ("http-conduit", set doCheck False) -- attempts to access the network
47137 , ("imagemagick", set (libraryDepends . pkgconfig . contains (pkg "imagemagick")) True) -- https://github.com/NixOS/cabal2nix/issues/136
48− , ("jsaddle", set (dependencies . haskell . contains (bind "self.ghcjs-base")) False)
138+ , ("include-file <= 0.1.0.2", set (libraryDepends . haskell . contains (self "random")) True) -- https://github.com/Daniel-Diaz/include-file/issues/1
139+ , ("js-jquery", set doCheck False) -- attempts to access the network
140+ , ("libconfig", over (libraryDepends . system) (replace "config = null" (pkg "libconfig")))
141+ , ("libxml", set (configureFlags . contains "--extra-include-dir=${libxml2.dev}/include/libxml2") True)
142+ , ("liquid-fixpoint", set (executableDepends . system . contains (pkg "ocaml")) True . set (testDepends . system . contains (pkg "z3")) True . set (testDepends . system . contains (pkg "nettools")) True . set (testDepends . system . contains (pkg "git")) True . set doCheck False)
143+ , ("liquidhaskell", set (testDepends . system . contains (pkg "z3")) True)
144+ , ("lzma-clib", over (metaSection . platforms) (Set.filter (\(Platform _ os) -> os == Windows)) . set (libraryDepends . haskell . contains (self "only-buildable-on-windows")) False)
145+ , ("MFlow < 4.6", set (libraryDepends . tool . contains (self "cpphs")) True)
146+ , ("mwc-random", set doCheck False)
49147 , ("mysql", set (libraryDepends . system . contains (pkg "mysql")) True)
148+ , ("network-attoparsec", set doCheck False) -- test suite requires network access
149+ , ("numeric-qq", set doCheck False) -- test suite doesn't finish even after 1+ days
150+ , ("opencv", opencvOverrides)
151+ , ("pandoc >= 1.16.0.2 && < 2.5", set doCheck False) -- https://github.com/jgm/pandoc/issues/2709 and https://github.com/fpco/stackage/issues/1332
152+ , ("pandoc < 2.6", pandocPre26Overrides)
153+ , ("pandoc >= 2.6", pandocOverrides)
154+ , ("pandoc-citeproc", set doCheck False) -- https://github.com/jgm/pandoc-citeproc/issues/369
155+ , ("purescript", set doCheck False) -- test suite doesn't cope with Nix build env
156+ , ("proto-lens-protobuf-types", set (libraryDepends . tool . contains (pkg "protobuf")) True)
157+ , ("proto-lens-protoc", set (libraryDepends . tool . contains (pkg "protobuf")) True)
158+ , ("qtah-cpp-qt5", set (libraryDepends . system . contains (bind "pkgs.qt5.qtbase")) True)
159+ , ("qtah-qt5", set (libraryDepends . tool . contains (bind "pkgs.qt5.qtbase")) True)
50160 , ("readline", over (libraryDepends . system) (Set.union (pkgs ["readline", "ncurses"])))
161+ , ("req", set doCheck False) -- test suite requires network access
162+ , ("sbv > 7", set (testDepends . system . contains (pkg "z3")) True)
163+ , ("sdr", over (metaSection . platforms) (Set.filter (\(Platform arch _) -> arch == X86_64))) -- https://github.com/adamwalker/sdr/issues/2
164+ , ("shake-language-c", set doCheck False) -- https://github.com/samplecount/shake-language-c/issues/26
165+ , ("ssh", set doCheck False) -- test suite runs forever, probably can't deal with our lack of network access
166+ , ("stack", set phaseOverrides stackOverrides . set doCheck False)
167+ , ("stripe-http-streams", set doCheck False . set (metaSection . broken) False)
168+ , ("target", set (testDepends . system . contains (pkg "z3")) True)
51169 , ("terminfo", set (libraryDepends . system . contains (pkg "ncurses")) True)
52− , ("thyme", set (libraryDepends . tool . contains (bind "self.cpphs")) True) -- required on Darwin
53− , ("xmonad", set phaseOverrides xmonadPostInstall)
170+ , ("text", set doCheck False) -- break infinite recursion
171+ , ("tensorflow-proto", set (libraryDepends . tool . contains (pkg "protobuf")) True)
172+ , ("thyme", set (libraryDepends . tool . contains (self "cpphs")) True) -- required on Darwin
173+ , ("twilio", set doCheck False) -- attempts to access the network
174+ , ("tz", set phaseOverrides "preConfigure = \"export TZDIR=${pkgs.tzdata}/share/zoneinfo\";")
175+ , ("udev", over (metaSection . platforms) (Set.filter (\(Platform _ os) -> os == Linux)))
176+ , ("webkitgtk3", webkitgtk24xHook) -- https://github.com/haskell-gi/haskell-gi/issues/36
177+ , ("webkitgtk3-javascriptcore", webkitgtk24xHook) -- https://github.com/haskell-gi/haskell-gi/issues/36
178+ , ("websockets", set doCheck False) -- https://github.com/jaspervdj/websockets/issues/104
179+ , ("Win32", over (metaSection . platforms) (Set.filter (\(Platform _ os) -> os == Windows)))
180+ , ("Win32-shortcut", over (metaSection . platforms) (Set.filter (\(Platform _ os) -> os == Windows)))
54181 , ("wxc", wxcHook)
55182 , ("wxcore", set (libraryDepends . pkgconfig . contains (pkg "wxGTK")) True)
56− , ("X11", over (libraryDepends . system) (Set.union (Set.fromList $ map bind ["pkgs.xlibs.libXinerama","pkgs.xlibs.libXext","pkgs.xlibs.libXrender"])))
183+ , ("X11", over (libraryDepends . system) (Set.union (Set.fromList $ map bind ["pkgs.xorg.libXinerama","pkgs.xorg.libXext","pkgs.xorg.libXrender","pkgs.xorg.libXScrnSaver"])))
184+ , ("xmonad >= 0.14.2", set phaseOverrides xmonadPostInstall)
185+ , ("zip-archive < 0.3.1", over (testDepends . tool) (replace (self "zip") (pkg "zip")))
186+ , ("zip-archive >= 0.3.1 && < 0.3.2.3", over (testDepends . tool) (Set.union (Set.fromList [pkg "zip", pkg "unzip"]))) -- https://github.com/jgm/zip-archive/issues/35
187+ , ("zip-archive >= 0.4", set (testDepends . tool . contains (pkg "which")) True)
57188 ]
58189
59190pkg :: Identifier -> Binding
60−pkg i = create binding (i, create path ["pkgs",i])
191+pkg i = binding # (i, path # ["pkgs",i])
192+
193+self :: Identifier -> Binding
194+self i = binding # (i, path # ["self",i])
61195
62196pkgs :: [Identifier] -> Set Binding
63197pkgs = Set.fromList . map pkg
64198
65199bind :: String -> Binding
66−bind s = create binding (i, create path is)
200+bind s = binding # (i, path # is)
67201 where
68− is = map (create ident) (splitOn "." s)
202+ is = map (review ident) (splitOn "." s)
69203 i = last is
70204
71−-- TODO: I need to figure out how to conveniently replace a binding in a set.
205+-- | @replace old new bset@ replaces the Nix binding @old@ with @new@ in the
206+-- set of bindings @bset@. If @old@ is not found in @bset@, then the function
207+-- fails with an 'error'.
208+replace :: Binding -> Binding -> Set Binding -> Set Binding
209+replace old new bs
210+ | old `Set.member` bs = Set.insert new (Set.delete old bs)
211+ | otherwise = error (unwords [ "post-process: cannot replace name binding"
212+ , show old, "by", show new
213+ , "because it's not found in set"
214+ , show bs
215+ ])
216+
72217gtk3Hook :: Derivation -> Derivation -- https://github.com/NixOS/cabal2nix/issues/145
73218gtk3Hook = set (libraryDepends . pkgconfig . contains (pkg "gtk3")) True
74219 . over (libraryDepends . pkgconfig) (Set.filter (\b -> view localName b /= "gtk3"))
75220
221+haddockHook :: Derivation -> Derivation
222+haddockHook = set doCheck False
223+ . set phaseOverrides "preCheck = \"unset GHC_PACKAGE_PATH\";"
224+ . over (dependencies . haskell) (Set.filter (\b -> view localName b /= "haddock-test"))
225+ . set (metaSection . broken) False
226+
76227gitAnnexHook :: Derivation -> Derivation
77−gitAnnexHook = set phaseOverrides gitAnnexOverrides . over (executableDepends . system) (Set.union buildInputs)
228+gitAnnexHook = set phaseOverrides gitAnnexOverrides
229+ . over (executableDepends . system) (Set.union buildInputs)
78230 where
79231 gitAnnexOverrides = unlines
80232 [ "preConfigure = \"export HOME=$TEMPDIR; patchShebangs .\";"
81− , "postBuild = \"ln -sf dist/build/git-annex/git-annex git-annex\";"
82− , "installPhase = \"make PREFIX=$out CABAL=./Setup install\";"
83− , "checkPhase = \"./git-annex test\";"
233+ , "postBuild = ''"
234+ , " ln -sf dist/build/git-annex/git-annex git-annex"
235+ , " ln -sf git-annex git-annex-shell"
236+ , "'';"
237+ , "installPhase = \"make PREFIX=$out BUILDER=: install install-completions\";"
238+ , "checkPhase = ''PATH+=\":$PWD\" git-annex test'';"
239+ , "enableSharedExecutables = false;"
84240 ]
85241 buildInputs = pkgs ["git","rsync","gnupg","curl","wget","lsof","openssh","which","bup","perl"]
86242
@@ -100,13 +256,13 @@ gfPhaseOverrides = unlines
100256 , " sed -i \"s|numJobs (bf bi)++||\" ./Setup.hs"
101257 -- Parallel compilation fails. Disable it.
102258 , "'';"
103− , "preBuild = ''export LD_LIBRARY_PATH=`pwd`/dist/build:$LD_LIBRARY_PATH'';"
259+ , "preBuild = ''export LD_LIBRARY_PATH=`pwd`/dist/build''${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH'';"
104260 -- The build step itself, after having built the library, needs to be able
105261 -- to find the library it just built in order to compile grammar files.
106262 ]
107263
108264wxcHook :: Derivation -> Derivation
109−wxcHook drv = drv & libraryDepends . system %~ Set.union (Set.fromList [pkg "mesa", bind "pkgs.xlibs.libX11"])
265+wxcHook drv = drv & libraryDepends . system %~ Set.union (Set.fromList [pkg "libGL", bind "pkgs.xorg.libX11"])
110266 & libraryDepends . pkgconfig . contains (pkg "wxGTK") .~ True
111267 & phaseOverrides .~ wxcPostInstall (packageVersion drv)
112268 & runHaddock .~ False
@@ -136,156 +292,118 @@ darcsInstallPostInstall = unlines
136292xmonadPostInstall :: String
137293xmonadPostInstall = unlines
138294 [ "postInstall = ''"
139− , " shopt -s globstar"
140− , " mkdir -p $out/share/man/man1"
141− , " mv \"$out/\"**\"/man/\"*.1 $out/share/man/man1/"
295+ , " install -D man/xmonad.1 ''${!outputDoc}/share/man/man1/xmonad.1"
296+ , " install -D man/xmonad.hs ''${!outputDoc}/share/doc/$name/sample-xmonad.hs"
142297 , "'';"
143298 ]
144299
145300agdaPostInstall :: String
146301agdaPostInstall = unlines
147302 [ "postInstall = ''"
148− , " $out/bin/agda -c --no-main $(find $out/share -name Primitive.agda)"
303+ , " $out/bin/agda -c --no-main $(find $data/share -name Primitive.agda)"
149304 , " $out/bin/agda-mode compile"
150305 , "'';"
151306 ]
152307
153−{-
154−postProcess' :: Derivation -> Derivation
155−postProcess' deriv@(MkDerivation {..})
156− | pname == "alex" && version < Version [3,1] []
157− = deriv { buildTools = Set.insert "perl" buildTools }
158− | pname == "alex" && version >= Version [3,1] []
159− = deriv { buildTools = Set.insert "perl" (Set.insert "happy" buildTools) }
160− | pname == "apache-md5" = deriv { testDepends = Set.delete "crypto" testDepends }
161− | pname == "bits-extras" = deriv { configureFlags = Set.insert "--ghc-option=-lgcc_s" configureFlags
162− , extraLibs = Set.filter (/= "gcc_s") extraLibs
163− }
164− | pname == "Cabal" = deriv { phaseOverrides = "preCheck = \"unset GHC_PACKAGE_PATH; export HOME=$NIX_BUILD_TOP\";" }
165− | pname == "cabal-bounds" = deriv { buildTools = Set.insert "cabal-install" buildTools }
166− | pname == "editline" = deriv { extraLibs = Set.insert "libedit" extraLibs }
167− | pname == "ghc-heap-view" = deriv { phaseOverrides = ghciPostInstall }
168− | pname == "ghc-mod" = deriv { phaseOverrides = ghcModPostInstall pname version, buildTools = Set.insert "emacs" buildTools }
169− | pname == "ghc-parser" = deriv { buildTools = Set.insert "cpphs" (Set.insert "happy" buildTools)
170− , phaseOverrides = ghcParserPatchPhase }
171− | pname == "ghc-vis" = deriv { phaseOverrides = ghciPostInstall }
172− | pname == "github-backup" = deriv { buildTools = Set.insert "git" buildTools }
173− | pname == "gloss-raster" = deriv { extraLibs = Set.insert "llvm" extraLibs }
174− | pname == "GLUT" = deriv { extraLibs = Set.fromList ["glut","libSM","libICE","libXmu","libXi","mesa"] `Set.union` extraLibs }
175− | pname == "gtkglext" = deriv { pkgConfDeps = Set.insert "pangox_compat" pkgConfDeps }
176− | pname == "gtk2hs-buildtools"= deriv { buildDepends = Set.insert "hashtables" buildDepends }
177− | pname == "haddock" && version < Version [2,14] []
178− = deriv { buildTools = Set.insert "alex" (Set.insert "happy" buildTools) }
179− | pname == "happy" = deriv { buildTools = Set.insert "perl" buildTools }
180− | pname == "haskeline" = deriv { buildDepends = Set.insert "utf8-string" buildDepends }
181− | pname == "haskell-src" = deriv { buildTools = Set.insert "happy" buildTools }
182− | pname == "haskell-src-meta" = deriv { buildDepends = Set.insert "uniplate" buildDepends }
183− | pname == "hlibgit2" = deriv { buildTools = Set.insert "git" buildTools }
184− | pname == "HList" = deriv { buildTools = Set.insert "diffutils" buildTools }
185− | pname == "hmatrix" = deriv { extraLibs = Set.insert "liblapack" (Set.insert "blas" (Set.filter (/= "lapack") extraLibs)) }
186− | pname == "hmatrix-special" = deriv { extraLibs = Set.insert "gsl" extraLibs }
187− | pname == "idris" = deriv { buildTools = Set.insert "happy" buildTools, extraLibs = Set.insert "gmp" (Set.insert "boehmgc" extraLibs) }
188− | pname == "inline-c-cpp" = deriv { testDepends = Set.delete "stdc++" testDepends }
189− | pname == "language-c-quote" = deriv { buildTools = Set.insert "alex" (Set.insert "happy" buildTools) }
190− | pname == "language-java" = deriv { buildDepends = Set.insert "syb" buildDepends }
191− | pname == "lhs2tex" = deriv { extraLibs = Set.insert "texLive" extraLibs, phaseOverrides = lhs2texPostInstall }
192− | pname == "libffi" = deriv { extraLibs = Set.delete "ffi" extraLibs }
193− | pname == "liquid-fixpoint" = deriv { buildTools = Set.insert "z3" (Set.insert "ocaml" buildTools), configureFlags = Set.insert "-fbuild-external" configureFlags }
194− | pname == "liquidhaskell" = deriv { buildTools = Set.insert "z3" buildTools }
195− | pname == "MFlow" = deriv { buildTools = Set.insert "cpphs" buildTools }
196− | pname == "multiarg" = deriv { buildDepends = Set.insert "utf8-string" buildDepends }
197− | pname == "ncurses" = deriv { phaseOverrides = ncursesPatchPhase }
198− | pname == "Omega" = deriv { testDepends = Set.delete "stdc++" testDepends }
199− | pname == "OpenAL" = deriv { extraLibs = Set.insert "openal" extraLibs }
200− | pname == "OpenGL" = deriv { extraLibs = Set.insert "mesa" (Set.insert "libX11" extraLibs) }
201− | pname == "pandoc" = deriv { buildDepends = Set.insert "alex" (Set.insert "happy" buildDepends) }
202− | pname == "persistent" = deriv { extraLibs = Set.insert "sqlite3" extraLibs }
203− | pname == "purescript" = deriv { buildTools = Set.insert "nodejs" buildTools }
204− | pname == "repa-algorithms" = deriv { extraLibs = Set.insert "llvm" extraLibs }
205− | pname == "repa-examples" = deriv { extraLibs = Set.insert "llvm" extraLibs }
206− | pname == "SDL-image" = deriv { extraLibs = Set.insert "SDL_image" extraLibs }
207− | pname == "SDL-mixer" = deriv { extraLibs = Set.insert "SDL_mixer" extraLibs }
208− | pname == "SDL-ttf" = deriv { extraLibs = Set.insert "SDL_ttf" extraLibs }
209− | pname == "sloane" = deriv { phaseOverrides = sloanePostInstall }
210− | pname == "structured-haskell-mode" = deriv { buildTools = Set.insert "emacs" buildTools
211− , phaseOverrides = structuredHaskellModePostInstall
212− }
213− | pname == "target" = deriv { buildTools = Set.insert "z3" buildTools }
214− | pname == "threadscope" = deriv { configureFlags = Set.insert "--ghc-options=-rtsopts" configureFlags }
215− | pname == "vacuum" = deriv { extraLibs = Set.insert "ghc-paths" extraLibs }
216− | pname == "wxcore" = deriv { extraLibs = Set.fromList ["wxGTK","mesa","libX11"] `Set.union` extraLibs }
217− | pname == "X11-xft" = deriv { extraLibs = Set.fromList ["pkgconfig","freetype","fontconfig"] `Set.union` extraLibs
218− , configureFlags = Set.insert "--extra-include-dirs=${freetype}/include/freetype2" configureFlags
219− }
220−-- Unbreak packages during hackage2nix generation:
221−
222− | pname == "hnetcdf" = deriv { testDepends = Set.delete "netcdf" testDepends }
223− | pname == "SDL2-ttf" = deriv { buildDepends = Set.delete "SDL2" buildDepends }
224− | pname == "hzk" = deriv { testDepends = Set.delete "zookeeper_mt" testDepends, buildTools = Set.insert "zookeeper_mt" buildTools }
225− | pname == "z3" = deriv { phaseOverrides = "preBuild = stdenv.lib.optionalString stdenv.isDarwin \"export DYLD_LIBRARY_PATH=${z3}/lib\";" }
226− | pname == "zip-archive" = deriv { testDepends = Set.delete "zip" testDepends, buildTools = Set.insert "zip" buildTools }
227− | otherwise = deriv
228−
229−ghcModPostInstall :: String -> Version -> String
230−ghcModPostInstall pname version = unlines
231− [ "configureFlags = \"--datasubdir=" ++ pname ++ "-" ++ display version ++ "\";"
232− , "postInstall = ''"
233− , " cd $out/share/" ++ pname ++ "-" ++ display version
234− , " make"
235− , " rm Makefile"
236− , " cd .."
237− , " ensureDir \"$out/share/emacs\""
238− , " mv " ++ pname ++ "-" ++ display version ++ " emacs/site-lisp"
239− , "'';"
240− ]
241−
242−ghciPostInstall :: String
243−ghciPostInstall = unlines
308+agda25PostInstall :: String
309+agda25PostInstall = unlines
244310 [ "postInstall = ''"
245− , " ensureDir \"$out/share/ghci\""
246− , " ln -s \"$out/share/$pname-$version/ghci\" \"$out/share/ghci/$pname\""
247− , "'';"
248− ]
249−
250−
251−lhs2texPostInstall :: String
252−lhs2texPostInstall = unlines
253− [ "postInstall = ''"
254− , " mkdir -p \"$out/share/doc/$name\""
255− , " cp doc/Guide2.pdf $out/share/doc/$name"
256− , " mkdir -p \"$out/nix-support\""
257− , "'';"
258− ]
259−
260−ncursesPatchPhase :: String
261−ncursesPatchPhase = "patchPhase = \"find . -type f -exec sed -i -e 's|ncursesw/||' {} \\\\;\";"
262−
263−
264−structuredHaskellModePostInstall :: String
265−structuredHaskellModePostInstall = unlines
266− [ "postInstall = ''"
267− , " emacs -L elisp --batch -f batch-byte-compile \"elisp/\"*.el"
268− , " install -d $out/share/emacs/site-lisp"
269− , " install \"elisp/\"*.el \"elisp/\"*.elc $out/share/emacs/site-lisp"
311+ , " files=(\"$data/share/ghc-\"*\"/\"*\"-ghc-\"*\"/Agda-\"*\"/lib/prim/Agda/\"{Primitive.agda,Builtin\"/\"*.agda})"
312+ -- Separate loops to avoid internal error
313+ , " for f in \"''${files[@]}\" ; do"
314+ , " $out/bin/agda $f"
315+ , " done"
316+ , " for f in \"''${files[@]}\" ; do"
317+ , " $out/bin/agda -c --no-main $f"
318+ , " done"
319+ , " $out/bin/agda-mode compile"
270320 , "'';"
271321 ]
272322
273−sloanePostInstall :: String
274−sloanePostInstall = unlines
275− [ "postInstall = ''"
276− , " mkdir -p $out/share/man/man1"
277− , " cp sloane.1 $out/share/man/man1/"
323+stackOverrides :: String
324+stackOverrides = unlines
325+ [ "preCheck = \"export HOME=$TMPDIR\";"
326+ , "postInstall = ''"
327+ , " exe=$out/bin/stack"
328+ , " mkdir -p $out/share/bash-completion/completions"
329+ , " $exe --bash-completion-script $exe >$out/share/bash-completion/completions/stack"
278330 , "'';"
279331 ]
280332
281−haddockPreCheck :: String
282−haddockPreCheck = "preCheck = \"unset GHC_PACKAGE_PATH\";"
333+-- Replace a binding for <package> to one to pkgs.gst_all_1.<package>
334+giGstLibOverrides :: String -> Derivation -> Derivation
335+giGstLibOverrides package
336+ = over (libraryDepends . pkgconfig) (replace (pkg (ident # package)) (binding # (ident # package, path # ["pkgs","gst_all_1", ident # package])))
283337
284−ghcParserPatchPhase :: String
285−ghcParserPatchPhase = unlines
286− [ "patchPhase = ''"
287− , " substituteInPlace build-parser.sh --replace \"/bin/bash\" \"$SHELL\""
338+giCairoPhaseOverrides :: Derivation -> Derivation
339+giCairoPhaseOverrides = over phaseOverrides (++txt)
340+ . set (libraryDepends . pkgconfig . contains (pkg "cairo")) True
341+ where
342+ txt = unlines [ "preCompileBuildDriver = ''"
343+ , " PKG_CONFIG_PATH+=\":${cairo}/lib/pkgconfig\""
344+ , " setupCompileFlags+=\" $(pkg-config --libs cairo-gobject)\""
345+ , "'';"
346+ ]
347+
348+hfseventsOverrides :: Derivation -> Derivation
349+hfseventsOverrides
350+ = set isLibrary True
351+ . over (metaSection . platforms) (Set.filter (\(Platform _ os) -> os == OSX))
352+ . set (libraryDepends . tool . contains (bind "pkgs.darwin.apple_sdk.frameworks.CoreServices")) True
353+ . set (libraryDepends . system . contains (bind "pkgs.darwin.apple_sdk.frameworks.Cocoa")) True
354+ . over (libraryDepends . haskell) (Set.union (Set.fromList (map bind ["self.base", "self.cereal", "self.mtl", "self.text", "self.bytestring"])))
355+
356+webkitgtk24xHook :: Derivation -> Derivation -- https://github.com/NixOS/cabal2nix/issues/145
357+webkitgtk24xHook = set (libraryDepends . pkgconfig . contains (pkg "webkitgtk24x-gtk3")) True
358+ . over (libraryDepends . pkgconfig) (Set.filter (\b -> view localName b /= "webkitgtk24x-gtk3"))
359+
360+opencvOverrides :: Derivation -> Derivation
361+opencvOverrides = set phaseOverrides "hardeningDisable = [ \"bindnow\" ];"
362+ . over (libraryDepends . pkgconfig) (replace (pkg "opencv") (pkg "opencv3"))
363+
364+hspecCoreOverrides :: Derivation -> Derivation -- https://github.com/hspec/hspec/issues/330
365+hspecCoreOverrides = set phaseOverrides "testTarget = \"--test-option=--skip --test-option='Test.Hspec.Core.Runner.hspecResult runs specs in parallel'\";"
366+
367+cabal2nixOverrides :: Derivation -> Derivation
368+cabal2nixOverrides = set phaseOverrides $ unlines
369+ [ "preCheck = ''"
370+ , " export PATH=\"$PWD/dist/build/cabal2nix:$PATH\""
371+ , " export HOME=\"$TMPDIR/home\""
288372 , "'';"
289373 ]
290374
291−-}
375+gtkglextHook :: Derivation -> Derivation
376+gtkglextHook = over (libraryDepends . system) (Set.union (Set.fromList deps))
377+ where
378+ deps :: [Binding]
379+ deps = bind <$> [ "pkgs.gtk2"
380+ , "pkgs.libGLU"
381+ , "pkgs.xorg.libSM"
382+ , "pkgs.xorg.libICE"
383+ , "pkgs.xorg.libXt"
384+ , "pkgs.xorg.libXmu"
385+ ]
386+
387+pandocPre26Overrides :: Derivation -> Derivation
388+pandocPre26Overrides = set phaseOverrides postInstall
389+ where
390+ postInstall = unlines [ "postInstall = ''"
391+ , " mkdir -p $out/share"
392+ , " mv $data/*/*/man $out/share/"
393+ , "'';"
394+ ]
395+
396+pandocOverrides :: Derivation -> Derivation
397+pandocOverrides = set phaseOverrides postInstall
398+ where
399+ postInstall = unlines [ "postInstall = ''"
400+ , " mkdir -p $out/share/man/man1"
401+ , " mv \"man/\"*.1 $out/share/man/man1/"
402+ , "'';"
403+ ]
404+
405+bustleOverrides :: Derivation -> Derivation
406+bustleOverrides = set (libraryDepends . pkgconfig . contains "system-glib = pkgs.glib") True
407+ . set (executableDepends . pkgconfig . contains "gio-unix = null") False
408+ . set (metaSection . license) (Known "stdenv.lib.licenses.lgpl21Plus")
409+ . set (metaSection . hydraPlatforms) allKnownPlatforms
src/Distribution/Nixpkgs/Haskell/Hackage.hs+41−25
@@ -1,29 +1,45 @@
1−module Distribution.Nixpkgs.Haskell.Hackage ( readHashedHackage, module Distribution.Hackage.DB ) where
1+module Distribution.Nixpkgs.Haskell.Hackage
2+ ( HackageDB, PackageData, VersionData(..)
3+ , hackageTarball, readTarball, parsePackageData
4+ )
5+ where
26
3−import Data.ByteString.Lazy ( ByteString )
4−import Data.Digest.Pure.SHA ( sha256, showDigest )
5−import Distribution.Hackage.DB
6−import qualified Distribution.Hackage.DB.Parsed as Unparsed ( parsePackage )
7−import qualified Distribution.Hackage.DB.Unparsed as Unparsed
7+import Data.Map as Map
8+import qualified Distribution.Hackage.DB.Parsed as P
9+import Distribution.Hackage.DB.Path
10+import qualified Distribution.Hackage.DB.Unparsed as U
11+import Distribution.Nixpkgs.Hashes
12+import Distribution.Package
13+import Distribution.PackageDescription
14+import Distribution.Version
15+import OpenSSL.Digest
16+import Data.Time
817
9−-- | A variant of 'readHackage' that adds the SHA256 digest of the
10−-- original Cabal file to the parsed 'GenericPackageDescription'. That
11−-- hash is required to build packages with an "edited" cabal file,
12−-- because Nix needs to download the edited file and patch it into the
13−-- original tarball.
18+type HackageDB = Map PackageName PackageData
1419
15−readHashedHackage :: IO Hackage
16−readHashedHackage = fmap parseUnparsedHackage Unparsed.readHackage
17− where
18− parseUnparsedHackage :: Unparsed.Hackage -> Hackage
19− parseUnparsedHackage = mapWithKey (mapWithKey . parsePackage)
20+type PackageData = Map Version VersionData
21+
22+data VersionData = VersionData
23+ { cabalFile :: !GenericPackageDescription
24+ , cabalFileSha256 :: !String
25+ , tarballSha256 :: !(Maybe String)
26+ }
27+ deriving (Show)
2028
21− parsePackage :: String -> Version -> ByteString -> GenericPackageDescription
22− parsePackage name version buf =
23− let pkg = Unparsed.parsePackage name version buf
24− hash = showDigest (sha256 buf)
25− in
26− pkg { packageDescription = (packageDescription pkg) {
27− customFieldsPD = ("X-Cabal-File-Hash", hash) : customFieldsPD (packageDescription pkg)
28− }
29− }
29+readTarball :: Maybe UTCTime -> FilePath -> IO HackageDB
30+readTarball ts p = do
31+ dbu <- U.readTarball ts p
32+ let dbp = P.parseDB dbu
33+ return (mapWithKey (parsePackageData dbu) dbp)
34+
35+parsePackageData :: U.HackageDB -> PackageName -> P.PackageData -> PackageData
36+parsePackageData dbu pn = mapWithKey (parseVersionData (dbu ! pn))
37+
38+parseVersionData :: U.PackageData -> Version -> P.VersionData -> VersionData
39+parseVersionData pdu v vd = VersionData
40+ { cabalFile = P.cabalFile vd
41+ , cabalFileSha256 = printSHA256 (digest (digestByName "sha256") file)
42+ , tarballSha256 = Map.lookup "sha256" (P.tarballHashes vd)
43+ }
44+ where
45+ file = U.cabalFile (U.versions pdu ! v)
src/Distribution/Nixpkgs/Haskell/HackageGit.hsdeleted−79
@@ -1,79 +0,0 @@
1−{-# LANGUAGE OverloadedStrings #-}
2−
3−module Distribution.Nixpkgs.Haskell.HackageGit ( Hackage, readHackage, module Data.Map ) where
4−
5−import Control.Monad
6−import Data.Aeson
7−import Data.ByteString.Char8 ( ByteString )
8−import qualified Data.ByteString.Char8 as BS
9−import Data.ByteString.Lazy.Char8 ( fromStrict )
10−import Data.Digest.Pure.SHA ( sha256, showDigest )
11−import Data.List ( foldl' )
12−import Data.Map
13−import Data.Maybe ( fromMaybe )
14−import Data.String.UTF8 ( toString, fromRep )
15−import Distribution.PackageDescription
16−import Distribution.PackageDescription.Parse ( parsePackageDescription, ParseResult(..) )
17−import Distribution.Text ( simpleParse )
18−import Distribution.Version ( Version )
19−import System.Directory
20−import System.FilePath
21−import System.IO.Unsafe
22−
23−type Hackage = Map String (Map Version GenericPackageDescription)
24−
25−readHackage :: FilePath -> IO Hackage
26−readHackage path = do db <- getSubDirs path >>= foldM discoverPackageVersions empty
27− return $ mapWithKey (\pkg -> Data.List.foldl' (makeVersionMap pkg) empty) db
28− where
29− discoverPackageVersions :: Map String [String] -> String -> IO (Map String [String])
30− discoverPackageVersions db pkg = getSubDirs (path </> pkg) >>= \vs -> return (insert pkg vs db)
31−
32− makeVersionMap :: String -> Map Version GenericPackageDescription -> String -> Map Version GenericPackageDescription
33− makeVersionMap pkg db v = insert (parseVersion v) (unsafePerformIO (readHackagePackage path pkg v)) db
34−
35−readHackagePackage :: FilePath -> String -> String -> IO GenericPackageDescription
36−readHackagePackage path pkg version = do
37− let cabalFile = path </> pkg </> version </> pkg <.> "cabal"
38− metaFile = path </> pkg </> version </> pkg <.> "json"
39− buf <- BS.readFile cabalFile
40− meta <- parseMeta path version <$> BS.readFile metaFile
41− cabal <- case parsePackageDescription (decodeUTF8 buf) of
42− ParseOk _ a -> return a
43− ParseFailed err -> fail $ cabalFile ++ ": " ++ show err
44− let cabal' = cabal { packageDescription = pd { customFieldsPD = cf } }
45− pd = packageDescription cabal
46− cf = customFieldsPD pd ++ ("X-Cabal-File-Hash", mkSHA256 buf)
47− : [ ("X-Package-" ++ k, v') | (k,v') <- toList (hashes meta) ]
48− return cabal'
49−
50−parseVersion :: String -> Version
51−parseVersion str = fromMaybe (error $ "hackage-db: cannot parse version " ++ show str) (simpleParse str)
52−
53−decodeUTF8 :: ByteString -> String
54−decodeUTF8 = toString . fromRep
55−
56−getSubDirs :: FilePath -> IO [FilePath]
57−getSubDirs path = do
58− let isDirectory p = doesDirectoryExist (path </> p)
59− getDirectoryContents path >>= filterM isDirectory . Prelude.filter (\x -> head x /= '.')
60−
61−mkSHA256 :: ByteString -> String
62−mkSHA256 = showDigest . sha256 . fromStrict
63−
64−data Meta = Meta { hashes :: Map String String {-, locations :: [String], pkgsize :: Int-} }
65− deriving (Show)
66−
67−instance FromJSON Meta where
68− parseJSON (Object v) = Meta <$>
69− v .: "package-hashes" {- <*>
70− v .: "package-locations" <*>
71− v .: "package-size" -}
72− -- A non-Object value is of the wrong type, so fail.
73− parseJSON _ = mzero
74−
75−parseMeta :: String -> String -> ByteString -> Meta
76−parseMeta pkg version buf =
77− case eitherDecodeStrict buf of
78− Left msg -> error $ "hackage-db: cannot decode JSON meta data for " ++ pkg ++ "-" ++ version ++ ":" ++ msg
79− Right x -> x
src/Distribution/Nixpkgs/Haskell/OrphanInstances.hs+71−53
@@ -1,64 +1,29 @@
1−{-# LANGUAGE DeriveGeneric #-}
2−{-# LANGUAGE StandaloneDeriving #-}
31{-# OPTIONS_GHC -fno-warn-orphans #-}
42
53module Distribution.Nixpkgs.Haskell.OrphanInstances ( ) where
64
7−import Control.DeepSeq.Generics
5+import Control.DeepSeq
86import Data.Maybe
97import Data.String
8+import qualified Data.Text as T
9+import Data.Yaml
1010import Distribution.Compiler
11−import Distribution.License
12−import Distribution.ModuleName hiding ( main )
1311import Distribution.Package
14−import Distribution.PackageDescription
12+import Distribution.Parsec
1513import Distribution.System
16−import Distribution.Text
14+import Distribution.Pretty as Cabal
15+import qualified Data.Version as Base
1716import Distribution.Version
18−import GHC.Generics ( Generic )
19−import Language.Haskell.Extension
20−
21−deriving instance Generic (CondTree v c a)
22−deriving instance Generic (Condition a)
23−deriving instance Generic ConfVar
24−deriving instance Generic Flag
25−deriving instance Generic GenericPackageDescription
26−
27−instance (NFData v, NFData c, NFData a) => NFData (CondTree v c a) where rnf = genericRnf
28−instance NFData Arch where rnf = genericRnf
29−instance NFData Benchmark where rnf = genericRnf
30−instance NFData BenchmarkInterface where rnf = genericRnf
31−instance NFData BenchmarkType where rnf = genericRnf
32−instance NFData BuildInfo where rnf = genericRnf
33−instance NFData BuildType where rnf = genericRnf
34−instance NFData CompilerFlavor where rnf = genericRnf
35−instance NFData ConfVar where rnf = genericRnf
36−instance NFData Dependency where rnf = genericRnf
37−instance NFData Executable where rnf = genericRnf
38−instance NFData Extension where rnf = genericRnf
39−instance NFData Flag where rnf = genericRnf
40−instance NFData FlagName where rnf = genericRnf
41−instance NFData GenericPackageDescription where rnf = genericRnf
42−instance NFData KnownExtension where rnf = genericRnf
43−instance NFData Language where rnf = genericRnf
44−instance NFData Library where rnf = genericRnf
45−instance NFData License where rnf = genericRnf
46−instance NFData ModuleName where rnf = genericRnf
47−instance NFData ModuleReexport where rnf = genericRnf
48−instance NFData ModuleRenaming where rnf = genericRnf
49−instance NFData OS where rnf = genericRnf
50−instance NFData PackageDescription where rnf = genericRnf
51−instance NFData RepoKind where rnf = genericRnf
52−instance NFData RepoType where rnf = genericRnf
53−instance NFData SourceRepo where rnf = genericRnf
54−instance NFData TestSuite where rnf = genericRnf
55−instance NFData TestSuiteInterface where rnf = genericRnf
56−instance NFData TestType where rnf = genericRnf
57−instance NFData VersionRange where rnf = genericRnf
58−instance NFData a => NFData (Condition a) where rnf = genericRnf
59−
60−instance IsString PackageName where
61− fromString = text2isString "PackageName"
17+import Language.Nix.PrettyPrinting as Nix
18+
19+instance NFData CompilerInfo
20+instance NFData AbiTag
21+
22+instance IsString Version where
23+ fromString = text2isString "Version"
24+
25+instance IsString VersionRange where
26+ fromString = text2isString "VersionRange"
6227
6328instance IsString PackageIdentifier where
6429 fromString = text2isString "PackageIdentifier"
@@ -66,5 +31,58 @@ instance IsString PackageIdentifier where
6631instance IsString Dependency where
6732 fromString = text2isString "Dependency"
6833
69−text2isString :: Text a => String -> String -> a
70−text2isString t s = fromMaybe (error ("fromString: " ++ show s ++ " is not a valid " ++ t)) (simpleParse s)
34+instance IsString CompilerId where
35+ fromString = text2isString "CompilerId"
36+
37+instance IsString Platform where
38+ fromString "i686-linux" = Platform I386 Linux
39+ fromString "x86_64-linux" = Platform X86_64 Linux
40+ fromString "x86_64-darwin" = Platform X86_64 OSX
41+ fromString s = error ("fromString: " ++ show s ++ " is not a valid platform")
42+
43+instance FromJSON Platform where
44+ parseJSON (String s) = pure (fromString (T.unpack s))
45+ parseJSON s = fail ("parseJSON: " ++ show s ++ " is not a valid platform")
46+
47+instance FromJSON PackageName where
48+ parseJSON (String s) = return (fromString (T.unpack s))
49+ parseJSON s = fail ("parseJSON: " ++ show s ++ " is not a valid Haskell package name")
50+
51+instance FromJSON PackageIdentifier where
52+ parseJSON (String s) = return (fromString (T.unpack s))
53+ parseJSON s = fail ("parseJSON: " ++ show s ++ " is not a valid Haskell package identifier")
54+
55+instance FromJSON VersionRange where
56+ parseJSON (String s) = return (fromString (T.unpack s))
57+ parseJSON s = fail ("parseJSON: " ++ show s ++ " is not a valid Cabal VersionRange")
58+
59+instance FromJSON Dependency where
60+ parseJSON (String s) = return (fromString (T.unpack s))
61+ parseJSON s = fail ("parseJSON: " ++ show s ++ " is not a valid Haskell Dependency")
62+
63+instance FromJSON CompilerInfo where
64+ parseJSON (String s) = return (unknownCompilerInfo (fromString (T.unpack s)) NoAbiTag)
65+ parseJSON s = fail ("parseJSON: " ++ show s ++ " is not a valid Haskell compiler")
66+
67+instance Nix.Pretty Version where
68+ pPrint = pretty
69+
70+instance Nix.Pretty PackageName where
71+ pPrint = pretty
72+
73+instance Nix.Pretty PackageIdentifier where
74+ pPrint = pretty
75+
76+instance Nix.Pretty CompilerId where
77+ pPrint = pretty
78+
79+instance Nix.Pretty Platform where
80+ pPrint = pretty
81+
82+instance Nix.Pretty Base.Version where
83+ pPrint = text . Base.showVersion
84+
85+-- parsing tools
86+
87+text2isString :: Parsec a => String -> String -> a
88+text2isString t s = fromMaybe (error ("fromString: " ++ show s ++ " is not a valid " ++ t)) (simpleParsec s)
src/Distribution/Nixpkgs/Haskell/PackageSourceSpec.hsnew file+272
@@ -0,0 +1,272 @@
1+module Distribution.Nixpkgs.Haskell.PackageSourceSpec
2+ ( HpackUse(..), Package(..), getPackage, getPackage', loadHackageDB, sourceFromHackage
3+ ) where
4+
5+import qualified Control.Exception as Exception
6+import Control.Monad
7+import Control.Monad.IO.Class
8+import Control.Monad.Trans.Maybe
9+import Data.Bifunctor
10+import qualified Data.ByteString.Char8 as BS
11+import Data.List ( isSuffixOf, isPrefixOf )
12+import qualified Data.Map as DB
13+import Data.Maybe
14+import qualified Data.Text as T
15+import qualified Data.Text.Encoding as T
16+import Data.Time
17+import Distribution.Nixpkgs.Fetch
18+import Distribution.Nixpkgs.Hashes
19+import qualified Distribution.Nixpkgs.Haskell.Hackage as DB
20+import Distribution.Nixpkgs.Haskell.OrphanInstances ( )
21+import qualified Distribution.Package as Cabal
22+import Distribution.PackageDescription
23+import qualified Distribution.PackageDescription as Cabal
24+import Distribution.PackageDescription.Parsec as Cabal
25+import Distribution.Parsec
26+import Distribution.Version
27+import qualified Hpack.Config as Hpack
28+import qualified Hpack.Render as Hpack
29+import OpenSSL.Digest ( digest, digestByName )
30+import System.Directory ( doesDirectoryExist, doesFileExist, createDirectoryIfMissing, getHomeDirectory, getDirectoryContents )
31+import System.Exit ( exitFailure )
32+import System.FilePath ( (</>), (<.>) )
33+import System.IO
34+import Text.PrettyPrint.HughesPJClass hiding ( first )
35+
36+data HpackUse
37+ = ForceHpack
38+ | PackageYamlHpack
39+ | NoHpack
40+
41+data Package = Package
42+ { pkgSource :: DerivationSource
43+ , pkgRanHpack :: Bool -- ^ If hpack generated a new cabal file
44+ , pkgCabal :: Cabal.GenericPackageDescription
45+ }
46+ deriving (Show)
47+
48+getPackage :: HpackUse
49+ -- ^ the way hpack should be used.
50+ -> Bool
51+ -- ^ Whether to fetch submodules if fetching from git
52+ -> Maybe FilePath
53+ -- ^ The path to the Hackage database.
54+ -> Maybe UTCTime
55+ -- ^ If we have hackage-snapshot time.
56+ -> Source
57+ -> IO Package
58+getPackage optHpack optSubmodules optHackageDB optHackageSnapshot =
59+ getPackage' optHpack optSubmodules (loadHackageDB optHackageDB optHackageSnapshot)
60+
61+getPackage' :: HpackUse
62+ -- ^ the way hpack should be used.
63+ -> Bool
64+ -- ^ Whether to fetch submodules if fetching from git
65+ -> IO DB.HackageDB
66+ -> Source
67+ -> IO Package
68+getPackage' optHpack optSubmodules hackageDB source = do
69+ (derivSource, ranHpack, pkgDesc) <- fetchOrFromDB optHpack optSubmodules hackageDB source
70+ (\s -> Package s ranHpack pkgDesc) <$> maybe (sourceFromHackage (sourceHash source) (showPackageIdentifier pkgDesc) $ sourceCabalDir source) return derivSource
71+
72+fetchOrFromDB :: HpackUse
73+ -- ^ the way hpack should be used
74+ -> Bool
75+ -- ^ Whether to fetch submodules if fetching from git
76+ -> IO DB.HackageDB
77+ -> Source
78+ -> IO (Maybe DerivationSource, Bool, Cabal.GenericPackageDescription)
79+fetchOrFromDB optHpack optSubmodules hackageDB src
80+ | "cabal://" `isPrefixOf` sourceUrl src = do
81+ (msrc, pkgDesc) <- fromDB hackageDB . drop (length "cabal://") $ sourceUrl src
82+ return (msrc, False, pkgDesc)
83+ | otherwise = do
84+ r <- fetch optSubmodules (\dir -> cabalFromPath optHpack (dir </> sourceCabalDir src)) src
85+ case r of
86+ Nothing -> fail $ "Failed to fetch source. Does this source exist? " ++ show src
87+ Just (derivSource, (externalSource, ranHpack, pkgDesc)) ->
88+ return (derivSource <$ guard externalSource, ranHpack, pkgDesc)
89+
90+loadHackageDB :: Maybe FilePath
91+ -- ^ The path to the Hackage database.
92+ -> Maybe UTCTime
93+ -- ^ If we have hackage-snapshot time.
94+ -> IO DB.HackageDB
95+loadHackageDB optHackageDB optHackageSnapshot = do
96+ dbPath <- maybe DB.hackageTarball return optHackageDB
97+ DB.readTarball optHackageSnapshot dbPath
98+
99+fromDB :: IO DB.HackageDB
100+ -> String
101+ -> IO (Maybe DerivationSource, Cabal.GenericPackageDescription)
102+fromDB hackageDBIO pkg = do
103+ hackageDB <- hackageDBIO
104+ vd <- maybe unknownPackageError return (DB.lookup name hackageDB >>= lookupVersion)
105+ let ds = case DB.tarballSha256 vd of
106+ Nothing -> Nothing
107+ Just hash -> Just (urlDerivationSource url hash)
108+ return (ds, setCabalFileHash (DB.cabalFileSha256 vd) (DB.cabalFile vd))
109+ where
110+ pkgId :: Cabal.PackageIdentifier
111+ pkgId = fromMaybe (error ("invalid Haskell package id " ++ show pkg)) (simpleParsec pkg)
112+ name = Cabal.packageName pkgId
113+
114+ unknownPackageError = fail $ "No such package " ++ prettyShow pkgId ++ " in the cabal database. Did you run cabal update?"
115+
116+ url = "mirror://hackage/" ++ prettyShow pkgId ++ ".tar.gz"
117+
118+ version :: Version
119+ version = Cabal.packageVersion pkgId
120+
121+ lookupVersion :: DB.Map Version DB.VersionData -> Maybe DB.VersionData
122+ -- No version is specified, pick latest one
123+ lookupVersion m | version == nullVersion = fmap snd (listToMaybe (DB.toDescList m))
124+ lookupVersion m = DB.lookup version m
125+
126+readFileMay :: FilePath -> IO (Maybe String)
127+readFileMay file = do
128+ e <- doesFileExist file
129+ if e
130+ then Just <$> readFile file
131+ else return Nothing
132+
133+hashCachePath :: String -> IO String
134+hashCachePath pid = do
135+ home <- getHomeDirectory
136+ let cacheDir = home </> ".cache/cabal2nix"
137+ createDirectoryIfMissing True cacheDir
138+ return $ cacheDir </> pid <.> "sha256"
139+
140+sourceFromHackage :: Hash -> String -> FilePath -> IO DerivationSource
141+sourceFromHackage optHash pkgId cabalDir = do
142+ cacheFile <- hashCachePath pkgId
143+ cachedHash <-
144+ case optHash of
145+ Certain h -> return . Certain $ h
146+ Guess h -> return . Guess $ h
147+ _ -> fmap (maybe UnknownHash Certain) . readFileMay $ cacheFile
148+ let url = "mirror://hackage/" ++ pkgId ++ ".tar.gz"
149+
150+ -- Use the cached hash (either from cache file or given on cmdline via sha256 opt)
151+ -- if available, otherwise download from hackage to compute hash.
152+ case cachedHash of
153+ Guess hash -> return $ urlDerivationSource url hash
154+ Certain hash ->
155+ -- We need to force the hash here. If we didn't do this, then when reading the
156+ -- hash from the cache file, the cache file will still be open for reading
157+ -- (because lazy io) when writeFile opens the file again for writing. By forcing
158+ -- the hash here, we ensure that the file is closed before opening it again.
159+ seq (length hash) $
160+ urlDerivationSource url hash <$ writeFile cacheFile hash
161+ UnknownHash -> do
162+ maybeHash <- runMaybeT (derivHash . fst <$> fetchWith (False, "url", []) (Source url "" UnknownHash cabalDir))
163+ case maybeHash of
164+ Just hash ->
165+ seq (length hash) $
166+ urlDerivationSource url hash <$ writeFile cacheFile hash
167+ Nothing -> do
168+ hPutStr stderr $ unlines
169+ [ "*** cannot compute hash. (Not a hackage project?)"
170+ , " If your project is not on hackage, please supply the path to the root directory of"
171+ , " the project, not to the cabal file."
172+ , ""
173+ , " If your project is on hackage but you still want to specify the hash manually, you"
174+ , " can use the --sha256 option."
175+ ]
176+ exitFailure
177+
178+showPackageIdentifier :: Cabal.GenericPackageDescription -> String
179+showPackageIdentifier pkgDesc = name ++ "-" ++ prettyShow version where
180+ pkgId = Cabal.package . Cabal.packageDescription $ pkgDesc
181+ name = Cabal.unPackageName (Cabal.packageName pkgId)
182+ version = Cabal.packageVersion pkgId
183+
184+cabalFromPath :: HpackUse -- ^ the way hpack should be used
185+ -> FilePath -> MaybeT IO (Bool, Bool, Cabal.GenericPackageDescription)
186+cabalFromPath optHpack path = do
187+ d <- liftIO $ doesDirectoryExist path
188+ if d
189+ then do
190+ (ranHpack, pkg) <- cabalFromDirectory optHpack path
191+ return (d, ranHpack, pkg)
192+ else (,,) d False <$> cabalFromFile False path
193+
194+cabalFromDirectory :: HpackUse -- ^ the way hpack should be used
195+ -> FilePath -> MaybeT IO (Bool, Cabal.GenericPackageDescription)
196+cabalFromDirectory ForceHpack dir = hpackDirectory dir
197+cabalFromDirectory NoHpack dir = onlyCabalFromDirectory dir "*** No .cabal file was found. Exiting."
198+cabalFromDirectory PackageYamlHpack dir = do
199+ useHpack <- liftIO $ doesFileExist (dir </> "package.yaml")
200+ if useHpack
201+ then do
202+ liftIO $ hPutStrLn stderr "*** found package.yaml. Using hpack..."
203+ hpackDirectory dir
204+ else onlyCabalFromDirectory dir "*** Found neither a .cabal file nor package.yaml. Exiting."
205+
206+onlyCabalFromDirectory :: FilePath -> String -> MaybeT IO (Bool, Cabal.GenericPackageDescription)
207+onlyCabalFromDirectory dir errMsg = do
208+ cabals <- liftIO $ getDirectoryContents dir >>= filterM doesFileExist . map (dir </>) . filter (".cabal" `isSuffixOf`)
209+ case cabals of
210+ [] -> fail errMsg
211+ [cabalFile] -> (,) False <$> cabalFromFile True cabalFile
212+ _ -> liftIO $ fail ("*** found more than one cabal file (" ++ show cabals ++ "). Exiting.")
213+
214+handleIO :: (Exception.IOException -> IO a) -> IO a -> IO a
215+handleIO = Exception.handle
216+
217+encodeUtf8 :: String -> BS.ByteString
218+encodeUtf8 = T.encodeUtf8 . T.pack
219+
220+hpackDirectory :: FilePath -> MaybeT IO (Bool, Cabal.GenericPackageDescription)
221+hpackDirectory dir = do
222+ mPackage <- liftIO $ Hpack.readPackageConfig Hpack.defaultDecodeOptions {
223+ Hpack.decodeOptionsProgramName = Hpack.ProgramName "cabal2nix"
224+ , Hpack.decodeOptionsTarget = dir </> Hpack.packageConfig
225+ }
226+ case mPackage of
227+ Left err -> liftIO $ hPutStrLn stderr ("*** hpack error: " ++ show err ++ ". Exiting.") >> exitFailure
228+ Right r -> do
229+ let hpackOutput =
230+ let body = Hpack.renderPackage [] (Hpack.decodeResultPackage r)
231+ cabalVersion = Hpack.decodeResultCabalVersion r
232+ in encodeUtf8 $ cabalVersion ++ body
233+ hash = printSHA256 $ digest (digestByName "sha256") hpackOutput
234+ case runParseGenericPackageDescription "<hpack output>" hpackOutput of
235+ Left msg -> liftIO $ do
236+ hPutStrLn stderr "*** hpack output:"
237+ BS.hPutStrLn stderr hpackOutput
238+ hPutStrLn stderr "*** cannot parse hpack output:"
239+ hPutStrLn stderr msg
240+ fail "*** Exiting."
241+ Right pkg -> MaybeT $ return $ Just $ (,) True $ setCabalFileHash hash pkg
242+
243+cabalFromFile :: Bool -> FilePath -> MaybeT IO Cabal.GenericPackageDescription
244+cabalFromFile failHard file =
245+ -- hGetContents throws an error if it's used on files which contain sequences
246+ -- that do not represent valid characters. To catch that exception, we need to
247+ -- wrap the whole block in `catchIO`.
248+ MaybeT $ handleIO (\err -> Nothing <$ hPutStrLn stderr ("*** parsing cabal file: " ++ show err)) $ do
249+ buf <- BS.readFile file
250+ let hash = printSHA256 (digest (digestByName "sha256") buf)
251+ case runParseGenericPackageDescription file buf of
252+ Left msg | failHard -> liftIO $ do
253+ hPutStrLn stderr $ "*** cannot parse " ++ show file ++ ":"
254+ hPutStrLn stderr msg
255+ fail "*** Exiting."
256+ Left _ -> return Nothing
257+ Right pkg -> return $ Just $ setCabalFileHash hash pkg
258+
259+runParseGenericPackageDescription
260+ :: FilePath
261+ -> BS.ByteString
262+ -> Either String Cabal.GenericPackageDescription
263+runParseGenericPackageDescription fpath
264+ = first (unlines . fmap (showPError fpath) . snd)
265+ . snd . runParseResult
266+ . parseGenericPackageDescription
267+
268+setCabalFileHash :: String -> GenericPackageDescription -> GenericPackageDescription
269+setCabalFileHash sha256 gpd = gpd { packageDescription = (packageDescription gpd) {
270+ customFieldsPD = ("X-Cabal-File-Hash", sha256) : customFieldsPD (packageDescription gpd)
271+ }
272+ }
src/Distribution/Nixpkgs/License.hsdeleted−47
@@ -1,47 +0,0 @@
1−{-# LANGUAGE DeriveGeneric #-}
2−{- |
3− Known licenses in Nix expressions are represented using the
4− attributes defined in @pkgs\/lib\/licenses.nix@, and unknown licenses
5− are represented as a literal string.
6− -}
7−
8−module Distribution.Nixpkgs.License ( License(..) ) where
9−
10−import Control.DeepSeq.Generics
11−import Data.Maybe
12−import GHC.Generics ( Generic )
13−import Internal.PrettyPrinting
14−
15−-- | The representation for licenses used in Nix derivations. Known
16−-- licenses are Nix expressions -- such as @stdenv.lib.licenses.bsd3@
17−-- --, so their exact \"name\" is not generally known, because the path
18−-- to @stdenv@ depends on the context defined in the expression. In
19−-- Cabal expressions, for example, the BSD3 license would have to be
20−-- referred to as @self.stdenv.lib.licenses.bsd3@. Other expressions,
21−-- however, use different paths to the @licenses@ record. Because of tat
22−-- situation, the library cannot provide an abstract data type that
23−-- encompasses all known licenses. Instead, the @License@ type just
24−-- distinguishes references to known and unknown licenses. The
25−-- difference between the two is in the way they are pretty-printed:
26−--
27−-- > > putStrLn (display (Known "stdenv.lib.license.gpl2"))
28−-- > stdenv.lib.license.gpl2
29−-- >
30−-- > > putStrLn (display (Unknown (Just "GPL")))
31−-- > "GPL"
32−-- >
33−-- > > putStrLn (display (Unknown Nothing))
34−-- > "unknown"
35−--
36−-- Note that the "Text" instance definition provides pretty-printing,
37−-- but no parsing as of now!
38−
39−data License = Known String
40− | Unknown (Maybe String)
41− deriving (Show, Eq, Ord, Generic)
42−
43−instance Pretty License where
44− pPrint (Known x) = text x
45− pPrint (Unknown x) = string (fromMaybe "unknown" x)
46−
47−instance NFData License where rnf = genericRnf
src/Distribution/Nixpkgs/Meta.hsdeleted−85
@@ -1,85 +0,0 @@
1−{-# LANGUAGE TemplateHaskell #-}
2−{-# LANGUAGE DeriveGeneric, RecordWildCards #-}
3−{- |
4− A representation of the @meta@ section used in Nix expressions. A
5− detailed description can be found in section 4, \"Meta-attributes\",
6− of the Nixpkgs manual at <http://nixos.org/nixpkgs/docs.html>.
7− -}
8−
9−module Distribution.Nixpkgs.Meta
10− ( Meta
11− , homepage, description, license, platforms, hydraPlatforms, maintainers, broken
12− ) where
13−
14−
15−import Control.DeepSeq.Generics
16−import Data.Set ( Set )
17−import qualified Data.Set as Set
18−import Distribution.Nixpkgs.License
19−import GHC.Generics ( Generic )
20−import Internal.Lens
21−import Internal.PrettyPrinting
22−import Language.Nix.Identifier
23−
24−-- | A representation of the @meta@ section used in Nix expressions.
25−--
26−-- >>> :{
27−-- print (pPrint (Meta "http://example.org" "an example package" (Unknown Nothing)
28−-- (Set.singleton "stdenv.lib.platforms.unix")
29−-- (Set.singleton "stdenv.lib.platforms.none")
30−-- (Set.fromList ["joe","jane"])
31−-- True))
32−-- :}
33−-- homepage = "http://example.org";
34−-- description = "an example package";
35−-- license = "unknown";
36−-- platforms = stdenv.lib.platforms.unix;
37−-- hydraPlatforms = stdenv.lib.platforms.none;
38−-- maintainers = with stdenv.lib.maintainers; [ jane joe ];
39−-- broken = true;
40−--
41−-- Note that the "Text" instance definition provides pretty-printing,
42−-- but no parsing as of now!
43−
44−data Meta = Meta
45− { _homepage :: String -- ^ URL of the package homepage
46− , _description :: String -- ^ short description of the package
47− , _license :: License -- ^ licensing terms
48− , _platforms :: Set String -- ^ list of supported platforms (from @pkgs\/lib\/platforms.nix@)
49− , _hydraPlatforms :: Set String -- ^ list of platforms built by Hydra (from @pkgs\/lib\/platforms.nix@)
50− , _maintainers :: Set Identifier -- ^ list of maintainers from @pkgs\/lib\/maintainers.nix@
51− , _broken :: Bool -- ^ set to @true@ if the build is known to fail
52− }
53− deriving (Show, Eq, Ord, Generic)
54−
55−makeLenses ''Meta
56−
57−instance NFData Meta where rnf = genericRnf
58−
59−instance Pretty Meta where
60− pPrint Meta {..} = vcat
61− [ onlyIf (not (null _homepage)) $ attr "homepage" $ string _homepage
62− , onlyIf (not (null _description)) $ attr "description" $ string _description
63− , attr "license" $ pPrint _license
64− , onlyIf (not (Set.null _platforms) && _platforms /= Set.singleton "ghc.meta.platforms") $ sep
65− [ text "platforms" <+> equals, renderPlatformList (Set.toAscList _platforms) ]
66− , onlyIf (not (Set.null _hydraPlatforms)) $ sep
67− [ text "hydraPlatforms" <+> equals, renderPlatformList (Set.toAscList _hydraPlatforms) ]
68− , setattr "maintainers" (text "with stdenv.lib.maintainers;") (Set.map (view ident) _maintainers)
69− , boolattr "broken" _broken _broken
70− ]
71−
72−renderPlatformList :: [String] -> Doc
73−renderPlatformList plats =
74− nest 2 (fsep $ punctuate (text " ++") $ map text plats) <> semi
75−
76−instance Default Meta where
77− def = Meta
78− { _homepage = error "undefined Meta.homepage"
79− , _description = error "undefined Meta.description"
80− , _license = error "undefined Meta.license"
81− , _platforms = error "undefined Meta.platforms"
82− , _hydraPlatforms = error "undefined Meta.hydraPlatforms"
83− , _maintainers = error "undefined Meta.maintainers"
84− , _broken = error "undefined Meta.broken"
85− }
src/Distribution/Nixpkgs/PackageMap.hsdeleted−59
@@ -1,59 +0,0 @@
1−module Distribution.Nixpkgs.PackageMap
2− ( PackageMap, readNixpkgPackageMap
3− , resolve
4− ) where
5−
6−import qualified Data.Aeson as JSON
7−import qualified Data.ByteString.Lazy as LBS
8−import Data.Function
9−import Data.List as List
10−import Data.List.Split
11−import qualified Data.Map.Strict as Map
12−import Data.Map.Strict ( Map )
13−import Data.Maybe
14−import Data.Set ( Set )
15−import qualified Data.Set as Set
16−import Internal.Lens
17−import Internal.PrettyPrinting
18−import Language.Nix
19−import System.Process
20−
21−type PackageMap = Map Identifier (Set Path)
22−
23−readNixpkgPackageMap :: FilePath -> Maybe Path -> IO PackageMap
24−readNixpkgPackageMap nixpkgs attrpath = fmap identifierSet2PackageMap (readNixpkgSet nixpkgs attrpath)
25−
26−readNixpkgSet :: FilePath -> Maybe Path -> IO (Set String)
27−readNixpkgSet nixpkgs attrpath = do
28− let extraArgs = maybe [] (\p -> ["-A", render (pPrint p)]) attrpath
29− (_, Just h, _, _) <- createProcess (proc "nix-env" (["-qaP", "--json", "-f"++nixpkgs] ++ extraArgs))
30− { std_out = CreatePipe, env = Nothing } -- TODO: ensure that overrides don't screw up our results
31− buf <- LBS.hGetContents h
32− let pkgmap :: Either String (Map String JSON.Object)
33− pkgmap = JSON.eitherDecode buf
34− either fail (return . Map.keysSet) pkgmap
35−
36−identifierSet2PackageMap :: Set String -> PackageMap
37−identifierSet2PackageMap pkgset = foldr (uncurry insertIdentifier) Map.empty pkglist
38− where
39− pkglist :: [(Identifier, Path)]
40− pkglist = mapMaybe parsePackage (Set.toList pkgset)
41−
42− insertIdentifier :: Identifier -> Path -> PackageMap -> PackageMap
43− insertIdentifier i = Map.insertWith Set.union i . Set.singleton
44−
45−parsePackage :: String -> Maybe (Identifier, Path)
46−parsePackage x | null x = error "Distribution.Nixpkgs.PackageMap.parsepackage: empty string is no valid identifier"
47− | xs <- splitOn "." x = if needsQuoting (head xs)
48− then Nothing
49− else Just (create ident (last xs), create path (map (create ident) xs))
50−
51−resolve :: PackageMap -> Identifier -> Maybe Binding
52−resolve nixpkgs i = case Map.lookup i nixpkgs of
53− Nothing -> Nothing
54− Just ps -> let p = chooseShortestPath (Set.toList ps)
55− in Just $ create binding (i,p)
56−
57−chooseShortestPath :: [Path] -> Path
58−chooseShortestPath [] = error "chooseShortestPath: called with empty list argument"
59−chooseShortestPath ps = minimumBy (on compare (view (path . to length))) ps
src/Internal/HaskellPackage.hsdeleted−154
@@ -1,154 +0,0 @@
1−module Internal.HaskellPackage
2− ( Package(..), getPackage, sourceFromHackage
3− ) where
4−
5−import qualified Distribution.Nixpkgs.Haskell.Hackage as DB
6−import qualified Control.Exception as Exception
7−import Control.Monad
8−import Control.Monad.IO.Class
9−import Control.Monad.Trans.Maybe
10−import Data.List ( isSuffixOf, isPrefixOf )
11−import Data.Maybe
12−import Data.Version
13−import Distribution.Nixpkgs.Fetch
14−import qualified Distribution.Package as Cabal
15−import qualified Distribution.PackageDescription as Cabal
16−import qualified Distribution.PackageDescription.Parse as Cabal
17−import qualified Distribution.ParseUtils as ParseUtils
18−import Distribution.Text ( simpleParse )
19−import System.Directory ( doesDirectoryExist, doesFileExist, createDirectoryIfMissing, getHomeDirectory, getDirectoryContents )
20−import System.Exit ( exitFailure )
21−import System.FilePath ( (</>), (<.>) )
22−import System.IO ( hPutStrLn, stderr, hPutStr )
23−
24−data Package = Package
25− { pkgSource :: DerivationSource
26− , pkgCabal :: Cabal.GenericPackageDescription
27− }
28− deriving (Show)
29−
30−getPackage :: Maybe String -> Source -> IO Package
31−getPackage optHackageDB source = do
32− (derivSource, pkgDesc) <- fetchOrFromDB optHackageDB source
33− flip Package pkgDesc <$> maybe (sourceFromHackage (sourceHash source) $ showPackageIdentifier pkgDesc) return derivSource
34−
35−
36−fetchOrFromDB :: Maybe String -> Source -> IO (Maybe DerivationSource, Cabal.GenericPackageDescription)
37−fetchOrFromDB optHackageDB src
38− | "cabal://" `isPrefixOf` sourceUrl src = fmap ((,) Nothing) . fromDB optHackageDB . drop (length "cabal://") $ sourceUrl src
39− | otherwise = do
40− r <- fetch cabalFromPath src
41− case r of
42− Nothing ->
43− hPutStrLn stderr "*** failed to fetch source. Does the URL exist?" >> exitFailure
44− Just (derivSource, (externalSource, pkgDesc)) ->
45− return (derivSource <$ guard externalSource, pkgDesc)
46−
47−fromDB :: Maybe String -> String -> IO Cabal.GenericPackageDescription
48−fromDB optHackageDB pkg = do
49− pkgDesc <- (lookupVersion <=< DB.lookup name) <$> maybe DB.readHashedHackage DB.readHackage' optHackageDB
50− case pkgDesc of
51− Just r -> return r
52− Nothing -> hPutStrLn stderr "*** no such package in the cabal database (did you run cabal update?). " >> exitFailure
53− where
54− pkgId = fromMaybe (error ("invalid Haskell package id " ++ show pkg)) (simpleParse pkg)
55− Cabal.PackageName name = Cabal.pkgName pkgId
56− version = Cabal.pkgVersion pkgId
57−
58− lookupVersion :: DB.Map DB.Version Cabal.GenericPackageDescription -> Maybe Cabal.GenericPackageDescription
59− lookupVersion
60− | null (versionBranch version) = fmap snd . listToMaybe . reverse . DB.toAscList
61− | otherwise = DB.lookup version
62−
63−
64−readFileMay :: String -> IO (Maybe String)
65−readFileMay file = do
66− e <- doesFileExist file
67− if e
68− then Just <$> readFile file
69− else return Nothing
70−
71−hashCachePath :: String -> IO String
72−hashCachePath pid = do
73− home <- getHomeDirectory
74− let cacheDir = home </> ".cache/cabal2nix"
75− createDirectoryIfMissing True cacheDir
76− return $ cacheDir </> pid <.> "sha256"
77−
78−sourceFromHackage :: Hash -> String -> IO DerivationSource
79−sourceFromHackage optHash pkgId = do
80− cacheFile <- hashCachePath pkgId
81− cachedHash <-
82− case optHash of
83− Certain h -> return . Certain $ h
84− Guess h -> return . Guess $ h
85− _ -> fmap (maybe UnknownHash Certain) . readFileMay $ cacheFile
86− let url = "mirror://hackage/" ++ pkgId ++ ".tar.gz"
87−
88− -- Use the cached hash (either from cache file or given on cmdline via sha256 opt)
89− -- if available, otherwise download from hackage to compute hash.
90− case cachedHash of
91− Guess hash -> return $ DerivationSource "url" url "" hash
92− Certain hash ->
93− -- We need to force the hash here. If we didn't do this, then when reading the
94− -- hash from the cache file, the cache file will still be open for reading
95− -- (because lazy io) when writeFile opens the file again for writing. By forcing
96− -- the hash here, we ensure that the file is closed before opening it again.
97− seq (length hash) $
98− DerivationSource "url" url "" hash <$ writeFile cacheFile hash
99− UnknownHash -> do
100− maybeHash <- runMaybeT (derivHash . fst <$> fetchWith (False, "url", []) (Source url "" UnknownHash))
101− case maybeHash of
102− Just hash ->
103− seq (length hash) $
104− DerivationSource "url" url "" hash <$ writeFile cacheFile hash
105− Nothing -> do
106− hPutStr stderr $ unlines
107− [ "*** cannot compute hash. (Not a hackage project?)"
108− , " If your project is not on hackage, please supply the path to the root directory of"
109− , " the project, not to the cabal file."
110− , ""
111− , " If your project is on hackage but you still want to specify the hash manually, you"
112− , " can use the --sha256 option."
113− ]
114− exitFailure
115−
116−showPackageIdentifier :: Cabal.GenericPackageDescription -> String
117−showPackageIdentifier pkgDesc = name ++ "-" ++ showVersion version where
118− pkgId = Cabal.package . Cabal.packageDescription $ pkgDesc
119− Cabal.PackageName name = Cabal.packageName pkgId
120− version = Cabal.packageVersion pkgId
121−
122−cabalFromPath :: FilePath -> MaybeT IO (Bool, Cabal.GenericPackageDescription)
123−cabalFromPath path = do
124− d <- liftIO $ doesDirectoryExist path
125− (,) d <$> if d
126− then cabalFromDirectory path
127− else cabalFromFile False path
128−
129−cabalFromDirectory :: FilePath -> MaybeT IO Cabal.GenericPackageDescription
130−cabalFromDirectory dir = do
131− cabals <- liftIO $ getDirectoryContents dir >>= filterM doesFileExist . map (dir </>) . filter (".cabal" `isSuffixOf`)
132− case cabals of
133− [cabalFile] -> cabalFromFile True cabalFile
134− _ -> liftIO $ hPutStrLn stderr "*** found zero or more than one cabal file. Exiting." >> exitFailure
135−
136−handleIO :: (Exception.IOException -> IO a) -> IO a -> IO a
137−handleIO = Exception.handle
138−
139−cabalFromFile :: Bool -> FilePath -> MaybeT IO Cabal.GenericPackageDescription
140−cabalFromFile failHard file =
141− -- readFile throws an error if it's used on binary files which contain sequences
142− -- that do not represent valid characters. To catch that exception, we need to
143− -- wrap the whole block in `catchIO`, because of lazy IO. The `case` will force
144− -- the reading of the file, so we will always catch the expression here.
145− MaybeT $ handleIO (\err -> Nothing <$ hPutStrLn stderr ("*** parsing cabal file: " ++ show err)) $ do
146− content <- readFile file
147− case Cabal.parsePackageDescription content of
148− Cabal.ParseFailed e | failHard -> do
149− let (line, err) = ParseUtils.locatedErrorMsg e
150− msg = maybe "" ((++ ": ") . show) line ++ err
151− hPutStrLn stderr $ "*** error parsing cabal file: " ++ msg
152− exitFailure
153− Cabal.ParseFailed _ -> return Nothing
154− Cabal.ParseOk _ a -> return (Just a)
src/Internal/Lens.hsdeleted−13
@@ -1,13 +0,0 @@
1−module Internal.Lens
2− ( create
3− , module Data.Default
4− , module Control.Lens
5− ) where
6−
7−import Control.Lens
8−import Data.Default
9−
10−-- | A convenient helper function for using Lenses as constructors.
11−
12−create :: Default s => ASetter s t a b -> b -> t
13−create f x = set f x def
src/Internal/PrettyPrinting.hsdeleted−62
@@ -1,62 +0,0 @@
1−-- | Internal pretty-printing helpers for Nix expressions.
2−
3−module Internal.PrettyPrinting
4− ( onlyIf
5− , setattr, toAscList
6− , listattr
7− , boolattr
8− , attr
9− , string
10− , funargs
11− -- * Re-exports from other modules
12− , module Text.PrettyPrint.HughesPJClass
13− , Text, disp
14− )
15− where
16−
17−import Data.Char
18−import Data.Function
19−import Data.List
20−import Data.Set ( Set )
21−import qualified Data.Set as Set
22−import Distribution.Text ( Text, disp )
23−import Text.PrettyPrint.HughesPJClass
24−
25−attr :: String -> Doc -> Doc
26−attr n v = text n <+> equals <+> v <> semi
27−
28−onlyIf :: Bool -> Doc -> Doc
29−onlyIf b d = if b then d else empty
30−
31−boolattr :: String -> Bool -> Bool -> Doc
32−boolattr n p v = if p then attr n (bool v) else empty
33−
34−listattr :: String -> Doc -> [String] -> Doc
35−listattr n prefix vs = onlyIf (not (null vs)) $
36− sep [ text n <+> equals <+> prefix <+> lbrack,
37− nest 2 $ fsep $ map text vs,
38− rbrack <> semi
39− ]
40−
41−setattr :: String -> Doc -> Set String -> Doc
42−setattr name prefix set = listattr name prefix (toAscList set)
43−
44−toAscList :: Set String -> [String]
45−toAscList = sortBy (compare `on` map toLower) . Set.toList
46−
47−bool :: Bool -> Doc
48−bool True = text "true"
49−bool False = text "false"
50−
51−string :: String -> Doc
52−string = doubleQuotes . text
53−
54−prepunctuate :: Doc -> [Doc] -> [Doc]
55−prepunctuate _ [] = []
56−prepunctuate p (d:ds) = d : map (p <>) ds
57−
58−funargs :: [Doc] -> Doc
59−funargs xs = sep [
60− lbrace <+> fcat (prepunctuate (comma <> text " ") $ map (nest 2) xs),
61− rbrace <> colon
62− ]
src/Language/Nix.hsdeleted−11
@@ -1,11 +0,0 @@
1−module Language.Nix
2− ( module Language.Nix.Identifier
3− , module Language.Nix.Path
4− , module Language.Nix.Binding
5− ) where
6−
7−import Language.Nix.Identifier
8−import Language.Nix.Path
9−import Language.Nix.Binding
10−
11−{-# ANN module "HLint: ignore Use import/export shortcut" #-}
src/Language/Nix/Binding.hsdeleted−37
@@ -1,37 +0,0 @@
1−{-# LANGUAGE DeriveGeneric #-}
2−{-# LANGUAGE TemplateHaskell #-}
3−
4−module Language.Nix.Binding ( Binding, binding, localName, reference ) where
5−
6−import Control.DeepSeq.Generics
7−import GHC.Generics ( Generic )
8−import Internal.Lens
9−import Internal.PrettyPrinting
10−import Language.Nix.Identifier
11−import Language.Nix.Path
12−
13−data Binding = Bind { _localName :: Identifier, _reference :: Path }
14− deriving (Show, Eq, Ord, Generic)
15−
16−makeLenses ''Binding
17−
18−binding :: Lens' Binding (Identifier,Path)
19−binding f (Bind l r) = uncurry Bind `fmap` f (l, r)
20−
21−instance NFData Binding where rnf = genericRnf
22−
23−instance Default Binding where
24− def = Bind def def
25−
26−instance Pretty Binding where
27− pPrint b = case (init ps, last ps) of
28− ([], i') -> if i == i'
29− then text "inherit" <+> pPrint i' <> semi
30− else pPrint i <+> equals <+> pPrint p <> semi
31− (p', i') -> if i == i'
32− then text "inherit" <+> parens (pPrint (create path p')) <+> pPrint i' <> semi
33− else pPrint i <+> equals <+> pPrint p <> semi
34−
35− where
36− (i, p) = view binding b
37− ps = view path p
src/Language/Nix/Identifier.hsdeleted−66
@@ -1,66 +0,0 @@
1−{-# LANGUAGE DeriveGeneric #-}
2−{-# LANGUAGE GeneralizedNewtypeDeriving #-}
3−
4−module Language.Nix.Identifier ( Identifier, ident, quote, needsQuoting ) where
5−
6−import Control.DeepSeq.Generics
7−import Data.String
8−import Internal.PrettyPrinting ( Pretty(..), text )
9−import GHC.Generics ( Generic )
10−import Internal.Lens
11−import Text.Regex.Posix
12−
13−-- | Identifiers in Nix are essentially strings. Reasonable people restrict
14−-- themselves to identifiers of the form @[a-zA-Z\_][a-zA-Z0-9\_\'\-]*@,
15−-- because these don't need quoting. The @Identifier@ type is an instance of
16−-- the 'IsString' class for convenience. The methods of the 'Pretty' class can
17−-- be used to pretty-print an identifier with proper quoting.
18−--
19−-- >>> let i = Identifier "test" in (i, pPrint i)
20−-- (Identifier "test",test)
21−-- >>> let i = Identifier "foo.bar" in (i, pPrint i)
22−-- (Identifier "foo.bar","foo.bar")
23−
24−newtype Identifier = Identifier String
25− deriving (Show, Eq, IsString, Generic)
26−
27−instance Default Identifier where def = Identifier ""
28−
29−instance Pretty Identifier where
30− pPrint i = text (i ^. ident . to quote)
31−
32−instance Ord Identifier where
33− compare (Identifier a) (Identifier b) = compare a b
34−
35−instance NFData Identifier where rnf = genericRnf
36−
37−-- | Checks whether a given string would need quoting when interpreted as an
38−-- intentifier.
39−
40−needsQuoting :: String -> Bool
41−needsQuoting str = not (str =~ grammar)
42− where grammar :: String -- TODO: should be a compiled regular expression
43− grammar = "^[a-zA-Z\\_][a-zA-Z0-9\\_\\'\\-]*$"
44−
45−-- | Lens that allows conversion from/to the standard 'String' type. The setter
46−-- does not evaluate its input, so it's safe to use with 'undefined'.
47−--
48−-- >>> putStrLn $ Identifier "abc.def" ^. ident
49−-- abc.def
50−--
51−-- >>> pPrint $ undefined & ident .~ "abcdef"
52−-- abcdef
53−
54−ident :: Lens' Identifier String
55−ident f (Identifier str) = Identifier `fmap` f str
56−
57−-- | Helper function to quote a given identifier string if necessary.
58−--
59−-- >>> putStrLn (quote "abc")
60−-- abc
61−--
62−-- >>> putStrLn (quote "abc.def")
63−-- "abc.def"
64−
65−quote :: String -> String
66−quote s = if needsQuoting s then show s else s
src/Language/Nix/Path.hsdeleted−53
@@ -1,53 +0,0 @@
1−{-# LANGUAGE DeriveGeneric #-}
2−
3−module Language.Nix.Path ( Path, path ) where
4−
5−import Internal.Lens
6−import Internal.PrettyPrinting ( Pretty (..), char, hcat, punctuate )
7−import Language.Nix.Identifier
8−import Control.DeepSeq.Generics
9−import GHC.Generics ( Generic )
10−
11−-- | Paths are non-empty lists of identifiers in Nix.
12−--
13−-- >>> set path [set ident "yo" undefined] undefined
14−-- Path {_segments = [Identifier "yo"]}
15−--
16−-- Any attempt to construct the empty path throws an 'error':
17−--
18−-- >>> set path [] undefined
19−-- Path {_segments = *** Exception: Nix paths cannot be empty
20−--
21−-- 'Identifier' is an instance of 'IsString':
22−--
23−-- >>> :set -XOverloadedStrings
24−-- >>> pPrint $ set path ["yo","bar"] undefined
25−-- yo.bar
26−--
27−-- Freaky quoted identifiers are fine except in the first segment:
28−--
29−-- >>> pPrint $ set path ["yo","b\"ar"] undefined
30−-- yo."b\"ar"
31−-- >>> pPrint $ set path ["5ident"] undefined
32−-- *** Exception: invalid Nix path: [Identifier "5ident"]
33−-- >>> pPrint $ set path ["5ident","foo","bar"] undefined
34−-- *** Exception: invalid Nix path: [Identifier "5ident",Identifier "foo",Identifier "bar"]
35−
36−newtype Path = Path { _segments :: [Identifier] }
37− deriving (Show, Eq, Ord, Generic)
38−
39−instance NFData Path where rnf = genericRnf
40−
41−instance Default Path where def = Path (error "undefined Nix.Path")
42−
43−path :: Lens' Path [Identifier]
44−path f (Path ids) = mkPath `fmap` f ids
45− where
46− mkPath :: [Identifier] -> Path
47− mkPath [] = error "Nix paths cannot be empty"
48− mkPath p@(s0:_)
49− | s0^.ident.to needsQuoting = error ("invalid Nix path: " ++ show p)
50− | otherwise = Path p
51−
52−instance Pretty Path where
53− pPrint p = hcat $ punctuate (char '.') $ pPrint <$> p^.path
test/Main.hs+113−56
@@ -1,65 +1,122 @@
1+{-# LANGUAGE OverloadedStrings #-}
2+
13module Main ( main ) where
24
3−import Control.DeepSeq
4−import Control.Exception
5−import qualified Data.Map as Map
5+import Distribution.Nixpkgs.Fetch
6+import Distribution.Nixpkgs.Haskell.Derivation
7+import Distribution.Nixpkgs.Haskell.FromCabal
8+import Distribution.Nixpkgs.Haskell.FromCabal.Flags
9+
10+import Control.Lens
11+import Control.Monad
612import qualified Data.Set as Set
7−import Distribution.Nixpkgs.Haskell.FromCabal.Configuration.GHC7102
8−import Distribution.Nixpkgs.License
9−import Distribution.Nixpkgs.Meta
10−import Internal.Lens
11−import Test.Hspec
12−import Test.DocTest
13+import Distribution.Compiler
14+import Distribution.Package
15+import Distribution.PackageDescription
16+import Distribution.PackageDescription.Parsec
17+import Distribution.System
18+import Distribution.Verbosity
19+import Distribution.Version
20+import Language.Nix
21+import System.Directory
22+import System.FilePath
23+import System.Process
24+import Test.Tasty
25+import Test.Tasty.Golden
26+import Text.PrettyPrint.HughesPJClass
1327
1428main :: IO ()
1529main = do
16− doctest [ "-isrc", "-optP-include", "-optPdist/build/autogen/cabal_macros.h"
17− , "src/Distribution/Nixpkgs/Fetch.hs"
18− , "src/Distribution/Nixpkgs/Haskell.hs"
19− , "src/Distribution/Nixpkgs/Haskell/BuildInfo.hs"
20− , "src/Distribution/Nixpkgs/Haskell/Constraint.hs"
21− , "src/Distribution/Nixpkgs/Haskell/Derivation.hs"
22− , "src/Distribution/Nixpkgs/Haskell/FromCabal.hs"
23− , "src/Distribution/Nixpkgs/Haskell/FromCabal/Configuration.hs"
24− , "src/Distribution/Nixpkgs/Haskell/FromCabal/Configuration/GHC7102.hs"
25− , "src/Distribution/Nixpkgs/Haskell/FromCabal/Configuration/Maintainers.hs"
26− , "src/Distribution/Nixpkgs/Haskell/FromCabal/Flags.hs"
27− , "src/Distribution/Nixpkgs/Haskell/FromCabal/License.hs"
28− , "src/Distribution/Nixpkgs/Haskell/FromCabal/Name.hs"
29− , "src/Distribution/Nixpkgs/Haskell/FromCabal/Normalize.hs"
30− , "src/Distribution/Nixpkgs/Haskell/FromCabal/PostProcess.hs"
31− , "src/Distribution/Nixpkgs/Haskell/Hackage.hs"
32− , "src/Distribution/Nixpkgs/Haskell/HackageGit.hs"
33− , "src/Distribution/Nixpkgs/Haskell/OrphanInstances.hs"
34− , "src/Distribution/Nixpkgs/License.hs"
35− , "src/Distribution/Nixpkgs/Meta.hs"
36− , "src/Distribution/Nixpkgs/PackageMap.hs"
37− , "src/Internal/HaskellPackage.hs"
38− , "src/Internal/Lens.hs"
39− , "src/Internal/PrettyPrinting.hs"
40− , "src/Language/Nix.hs"
41− , "src/Language/Nix/Binding.hs"
42− , "src/Language/Nix/Identifier.hs"
43− , "src/Language/Nix/Path.hs"
44− ]
45− doctest ["-isrc", "-optP-include", "-optPdist/build/autogen/cabal_macros.h", "cabal2nix/Main.hs"]
46− doctest ["-isrc", "-optP-include", "-optPdist/build/autogen/cabal_macros.h", "hackage2nix/Main.hs"]
30+ -- TODO: Run this test with all kinds of setLocaleEncoding values to ensure we don't
31+ -- depend on the system environment: https://github.com/NixOS/cabal2nix/issues/333.
32+ --
33+ -- TODO: Run this test without $HOME defined to ensure that we don't need that variable.
34+ cabal2nix <- findExecutable "cabal2nix" >>= maybe (fail "cannot find 'cabal2nix' in $PATH") return
35+ testCases <- listDirectoryFilesBySuffix ".cabal" "test/golden-test-cases"
36+ defaultMain $ testGroup "regression-tests"
37+ [ testGroup "cabal2nix library" (map testLibrary testCases)
38+ , testGroup "cabal2nix executable" (map (testExecutable cabal2nix) testCases)
39+ ]
40+
41+testLibrary :: String -> TestTree
42+testLibrary cabalFile = do
43+ let nixFile = cabalFile `replaceExtension` "nix"
44+ goldenFile = nixFile `addExtension` "golden"
45+
46+ cabal2nix :: GenericPackageDescription -> Derivation
47+ cabal2nix gpd = fromGenericPackageDescription
48+ (const True)
49+ (\i -> Just (binding # (i, path # [ident # "pkgs", i])))
50+ (Platform X86_64 Linux)
51+ (unknownCompilerInfo (CompilerId GHC (mkVersion [8,2])) NoAbiTag)
52+ (configureCabalFlags (packageId gpd))
53+ []
54+ gpd
55+ & src .~ DerivationSource
56+ { derivKind = "url"
57+ , derivUrl = "mirror://hackage/foo.tar.gz"
58+ , derivRevision = ""
59+ , derivHash = "deadbeef"
60+ , derivSubmodule = Nothing
61+ }
62+ & extraFunctionArgs %~ Set.union (Set.singleton "inherit stdenv")
63+ goldenVsFileDiff
64+ nixFile
65+ (\ref new -> ["diff", "-u", ref, new])
66+ goldenFile
67+ nixFile
68+ (readGenericPackageDescription silent cabalFile >>= writeFileLn nixFile . prettyShow . cabal2nix)
69+
70+-- | TODO:
71+--
72+-- * Run cabal2nix in an empty environment. Currently, this fails because the
73+-- tool uses $HOME to write cache files for SHA256 hashes. To fix this, use
74+-- of the cache directory ought to be optional. Arguably, the whole notion
75+-- of caching those hashes is a bit silly in the presence of format 01
76+-- cabal-install tarballs which contain them already.
77+--
78+-- * If we cannot get along without $HOME, then we should at least set it to
79+-- some temporary location that is empty.
80+--
81+-- * Run this test with different kinds of encodings.
82+--
83+-- * Run tests with a different target OS, like Darwin. The packages "iconv",
84+-- "crypt-sha512", "gl" might be worthwhile for testing since their output
85+-- differs on Darwin.
86+
87+testExecutable :: FilePath -> FilePath -> TestTree
88+testExecutable exe cabalFile = do
89+ let nixFile = cabalFile `replaceExtension` "nix"
90+ goldenFile = nixFile `addExtension` "golden"
91+ goldenVsFileDiff
92+ nixFile
93+ (\ref new -> ["diff", "-u", ref, new])
94+ goldenFile
95+ nixFile
96+ (callCommand (unwords ["env LANG=en_US.UTF-8", exe, "--sha256=deadbeef", "--system=x86_64-linux", "--compiler=ghc-8.2", "--", cabalFile, ">"++nixFile]))
97+
98+-------------------------------------------------------------------------------
99+-- * Helper functions
100+-------------------------------------------------------------------------------
101+
102+-- | Find all *files* in the given directory that end with the given suffix.
103+-- This function does not recurse, nor does it include the special entries
104+-- @'.'@ or @'..'@ in the result.
105+--
106+-- "Test.Tasty.Golden" offers 'findByExtension', which does something similar
107+-- (and arguably more general) as those two functions, but unfortunately that
108+-- function recurses through the directory hierarchy and in the process needs
109+-- plenty of stack space. There might be a space leak in that code, I am not
110+-- sure. Anyhow, since our test suite is supposed to run with 1K stack space,
111+-- we prefer our own simpler code.
47112
48− hspec $ do
49− describe "DeepSeq instances work properly for" $ do
50− it "License" $ mapM_ hitsBottom [Known undefined, Unknown (Just undefined)]
51− it "Meta" $ do mapM_ hitsBottom
52− [ def & homepage .~ undefined
53− , def & description .~ undefined
54− , def & license .~ undefined
55− , def & platforms .~ undefined
56− , def & maintainers .~ undefined
57− , def & broken .~ undefined
58− ]
113+listDirectoryFilesBySuffix :: String -> FilePath -> IO [FilePath]
114+listDirectoryFilesBySuffix suff dirPath = do
115+ entries <- listDirectory dirPath
116+ filterM doesFileExist [ dirPath </> e | e <- entries, takeExtension e == suff ]
59117
60− describe "Configuration records are consistent" $
61− it "No maintained package is marked as \"dont-distribute\"" $
62− Map.keysSet (packageMaintainers ghc7102) `Set.intersection` (dontDistributePackages ghc7102) `shouldSatisfy` Set.null
118+-- | A variant of 'writeFile' that appends a newline to the end of the buffer
119+-- before writing.
63120
64−hitsBottom :: NFData a => a -> Expectation
65−hitsBottom x = evaluate (rnf x) `shouldThrow` anyErrorCall
121+writeFileLn :: FilePath -> String -> IO ()
122+writeFileLn p buf = writeFile p (buf ++ "\n")
test/golden-test-cases/.gitignorenew file+1
@@ -0,0 +1 @@
1+/*.nix
test/golden-test-cases/ChasingBottoms.cabalnew file+185
@@ -0,0 +1,185 @@
1+name: ChasingBottoms
2+version: 1.3.1.3
3+license: MIT
4+license-file: LICENCE
5+copyright: Copyright (c) Nils Anders Danielsson 2004-2017.
6+author: Nils Anders Danielsson
7+maintainer: http://www.cse.chalmers.se/~nad/
8+synopsis: For testing partial and infinite values.
9+description:
10+ Do you ever feel the need to test code involving bottoms (e.g. calls to
11+ the @error@ function), or code involving infinite values? Then this
12+ library could be useful for you.
13+ .
14+ It is usually easy to get a grip on bottoms by showing a value and
15+ waiting to see how much gets printed before the first exception is
16+ encountered. However, that quickly gets tiresome and is hard to automate
17+ using e.g. QuickCheck
18+ (<http://www.cse.chalmers.se/~rjmh/QuickCheck/>). With this library you
19+ can do the tests as simply as the following examples show.
20+ .
21+ Testing explicitly for bottoms:
22+ .
23+ > > isBottom (head [])
24+ > True
25+ .
26+ > > isBottom bottom
27+ > True
28+ .
29+ > > isBottom (\_ -> bottom)
30+ > False
31+ .
32+ > > isBottom (bottom, bottom)
33+ > False
34+ .
35+ Comparing finite, partial values:
36+ .
37+ > > ((bottom, 3) :: (Bool, Int)) ==! (bottom, 2+5-4)
38+ > True
39+ .
40+ > > ((bottom, bottom) :: (Bool, Int)) <! (bottom, 8)
41+ > True
42+ .
43+ Showing partial and infinite values (@\\\/!@ is join and @\/\\!@ is meet):
44+ .
45+ > > approxShow 4 $ (True, bottom) \/! (bottom, 'b')
46+ > "Just (True, 'b')"
47+ .
48+ > > approxShow 4 $ (True, bottom) /\! (bottom, 'b')
49+ > "(_|_, _|_)"
50+ .
51+ > > approxShow 4 $ ([1..] :: [Int])
52+ > "[1, 2, 3, _"
53+ .
54+ > > approxShow 4 $ (cycle [bottom] :: [Bool])
55+ > "[_|_, _|_, _|_, _"
56+ .
57+ Approximately comparing infinite, partial values:
58+ .
59+ > > approx 100 [2,4..] ==! approx 100 (filter even [1..] :: [Int])
60+ > True
61+ .
62+ > > approx 100 [2,4..] /=! approx 100 (filter even [bottom..] :: [Int])
63+ > True
64+ .
65+ The code above relies on the fact that @bottom@, just as @error
66+ \"...\"@, @undefined@ and pattern match failures, yield
67+ exceptions. Sometimes we are dealing with properly non-terminating
68+ computations, such as the following example, and then it can be nice to
69+ be able to apply a time-out:
70+ .
71+ > > timeOut' 1 (reverse [1..5])
72+ > Value [5,4,3,2,1]
73+ .
74+ > > timeOut' 1 (reverse [1..])
75+ > NonTermination
76+ .
77+ The time-out functionality can be used to treat \"slow\" computations as
78+ bottoms:
79+ .
80+ @
81+ \> let tweak = Tweak &#x7b; approxDepth = Just 5, timeOutLimit = Just 2 &#x7d;
82+ \> semanticEq tweak (reverse [1..], [1..]) (bottom :: [Int], [1..] :: [Int])
83+ True
84+ @
85+ .
86+ @
87+ \> let tweak = noTweak &#x7b; timeOutLimit = Just 2 &#x7d;
88+ \> semanticJoin tweak (reverse [1..], True) ([] :: [Int], bottom)
89+ Just ([],True)
90+ @
91+ .
92+ This can of course be dangerous:
93+ .
94+ @
95+ \> let tweak = noTweak &#x7b; timeOutLimit = Just 0 &#x7d;
96+ \> semanticEq tweak (reverse [1..100000000]) (bottom :: [Integer])
97+ True
98+ @
99+ .
100+ Timeouts can also be applied to @IO@ computations:
101+ .
102+ > > let primes () = unfoldr (\(x:xs) -> Just (x, filter ((/= 0) . (`mod` x)) xs)) [2..]
103+ > > timeOutMicro 100 (print $ primes ())
104+ > [2,NonTermination
105+ > > timeOutMicro 10000 (print $ take 10 $ primes ())
106+ > [2,3,5,7,11,13,17,19,23,29]
107+ > Value ()
108+ .
109+ For the underlying theory and a larger example involving use of
110+ QuickCheck, see the article \"Chasing Bottoms, A Case Study in Program
111+ Verification in the Presence of Partial and Infinite Values\"
112+ (<http://www.cse.chalmers.se/~nad/publications/danielsson-jansson-mpc2004.html>).
113+ .
114+ The code has been tested using GHC. Most parts can probably be
115+ ported to other Haskell compilers, but this would require some work.
116+ The @TimeOut@ functions require preemptive scheduling, and most of
117+ the rest requires @Data.Generics@; @isBottom@ only requires
118+ exceptions, though.
119+category: Testing
120+tested-with: GHC == 6.12.3,
121+ GHC == 7.0.4,
122+ GHC == 7.4.2,
123+ GHC == 7.6.3,
124+ GHC == 7.8.4,
125+ GHC == 7.10.3,
126+ GHC == 8.0.2,
127+ GHC == 8.2.1
128+cabal-version: >= 1.9.2
129+build-type: Simple
130+
131+source-repository head
132+ type: darcs
133+ location: http://www.cse.chalmers.se/~nad/repos/ChasingBottoms/
134+
135+library
136+ exposed-modules:
137+ Test.ChasingBottoms,
138+ Test.ChasingBottoms.Approx,
139+ Test.ChasingBottoms.ApproxShow,
140+ Test.ChasingBottoms.ContinuousFunctions,
141+ Test.ChasingBottoms.IsBottom,
142+ Test.ChasingBottoms.Nat,
143+ Test.ChasingBottoms.SemanticOrd,
144+ Test.ChasingBottoms.TimeOut
145+
146+ other-modules: Test.ChasingBottoms.IsType
147+
148+ build-depends: QuickCheck >= 2.3 && < 2.11,
149+ mtl >= 2 && < 2.3,
150+ base >= 4.2 && < 4.11,
151+ containers >= 0.3 && < 0.6,
152+ random >= 1.0 && < 1.2,
153+ syb >= 0.1.0.2 && < 0.8
154+
155+test-suite ChasingBottomsTestSuite
156+ type: exitcode-stdio-1.0
157+
158+ main-is: Test/ChasingBottoms/Tests.hs
159+
160+ other-modules: Test.ChasingBottoms.Approx,
161+ Test.ChasingBottoms.Approx.Tests,
162+ Test.ChasingBottoms.ApproxShow,
163+ Test.ChasingBottoms.ApproxShow.Tests,
164+ Test.ChasingBottoms.ContinuousFunctions,
165+ Test.ChasingBottoms.ContinuousFunctions.Tests,
166+ Test.ChasingBottoms.IsBottom,
167+ Test.ChasingBottoms.IsBottom.Tests,
168+ Test.ChasingBottoms.IsType,
169+ Test.ChasingBottoms.IsType.Tests,
170+ Test.ChasingBottoms.Nat,
171+ Test.ChasingBottoms.Nat.Tests,
172+ Test.ChasingBottoms.SemanticOrd,
173+ Test.ChasingBottoms.SemanticOrd.Tests,
174+ Test.ChasingBottoms.TestUtilities,
175+ Test.ChasingBottoms.TestUtilities.Generators,
176+ Test.ChasingBottoms.TimeOut
177+ Test.ChasingBottoms.TimeOut.Tests
178+
179+ build-depends: QuickCheck >= 2.3 && < 2.11,
180+ mtl >= 2 && < 2.3,
181+ base >= 4.2 && < 4.11,
182+ containers >= 0.3 && < 0.6,
183+ random >= 1.0 && < 1.2,
184+ syb >= 0.1.0.2 && < 0.8,
185+ array >= 0.3 && < 0.6
test/golden-test-cases/ChasingBottoms.nix.goldennew file+16
@@ -0,0 +1,16 @@
1+{ mkDerivation, array, base, containers, mtl, QuickCheck, random
2+, stdenv, syb
3+}:
4+mkDerivation {
5+ pname = "ChasingBottoms";
6+ version = "1.3.1.3";
7+ sha256 = "deadbeef";
8+ libraryHaskellDepends = [
9+ base containers mtl QuickCheck random syb
10+ ];
11+ testHaskellDepends = [
12+ array base containers mtl QuickCheck random syb
13+ ];
14+ description = "For testing partial and infinite values";
15+ license = stdenv.lib.licenses.mit;
16+}
test/golden-test-cases/Clipboard.cabalnew file+55
@@ -0,0 +1,55 @@
1+Name: Clipboard
2+Version: 2.3.2.0
3+Author: Sævar Berg (Windows), Matthew Bekkema (X11), Daniel Díaz (Maintainer)
4+Homepage: http://haskell.org/haskellwiki/Clipboard
5+License: BSD3
6+License-file: license
7+Maintainer: dhelta.diaz `at` gmail.com
8+Category: System
9+Stability: Stable
10+Synopsis: System clipboard interface.
11+Bug-reports: https://github.com/Daniel-Diaz/Clipboard/issues
12+Description:
13+ /Clipboard/ is a library for easily interfacing with the system clipboard with additional unicode support.
14+ Currently, only in a Windows or GNU/Linux (X11) system.
15+ .
16+ For example, if you type:
17+ .
18+ > $ setClipboardString "Hello, World!"
19+ .
20+ Then you have @\"Hello, World!\"@ available to be pasted wherever you want.
21+ .
22+ Now, if you type:
23+ .
24+ > $ modifyClipboardString reverse
25+ .
26+ You will have @\"!dlroW ,olleH\"@ in your clipboard. So:
27+ .
28+ > $ getClipboardString
29+ > "!dlroW ,olleH"
30+ .
31+ The X11 version depends on the @X11@ package, so you will need the X11 development library
32+ available on your system at compile time. You can install it by @sudo apt-get install libxrandr-dev@
33+ (or the equivalent on your system).
34+Build-type: Simple
35+Cabal-version: >= 1.6
36+Extra-source-files: README.md
37+
38+Source-repository head
39+ type: git
40+ location: git://github.com/Daniel-Diaz/Clipboard.git
41+
42+Library
43+ Exposed-modules: System.Clipboard
44+ Extensions: CPP
45+ if os(windows)
46+ Build-depends: base == 4.*
47+ , Win32 >= 2.2.0.0 && < 2.4
48+ Other-modules: System.Clipboard.Windows
49+ else
50+ Build-depends: base == 4.*
51+ , X11 >= 1.6
52+ , utf8-string
53+ , unix
54+ , directory
55+ Other-modules: System.Clipboard.X11
test/golden-test-cases/Clipboard.nix.goldennew file+10
@@ -0,0 +1,10 @@
1+{ mkDerivation, base, directory, stdenv, unix, utf8-string, X11 }:
2+mkDerivation {
3+ pname = "Clipboard";
4+ version = "2.3.2.0";
5+ sha256 = "deadbeef";
6+ libraryHaskellDepends = [ base directory unix utf8-string X11 ];
7+ homepage = "http://haskell.org/haskellwiki/Clipboard";
8+ description = "System clipboard interface";
9+ license = stdenv.lib.licenses.bsd3;
10+}
test/golden-test-cases/FenwickTree.cabalnew file+41
@@ -0,0 +1,41 @@
1+name: FenwickTree
2+version: 0.1.2.1
3+stability: alpha
4+homepage: https://github.com/mgajda/FenwickTree
5+package-url: http://hackage.haskell.org/package/FenwickTree
6+synopsis: Data structure for fast query and update of cumulative sums
7+description: Fenwick trees are a O(log N) data structure for updating cumulative sums.
8+ This implementation comes with an operation to find a least element for
9+ which real-valued cumulative sum reaches certain value, and allows for
10+ storage of arbitrary information in the nodes.
11+category: Data Structures
12+license: BSD3
13+license-file: LICENSE
14+
15+author: Michal J. Gajda
16+copyright: Copyright by Michal J. Gajda '2013
17+maintainer: mjgajda@googlemail.com
18+bug-reports: mailto:mjgajda@googlemail.com
19+
20+build-type: Simple
21+cabal-version: >=1.8
22+tested-with: GHC==7.8.4
23+data-files: README.md changelog
24+
25+source-repository head
26+ type: git
27+ location: git://github.com:mgajda/FenwickTree.git
28+
29+Library
30+ ghc-options: -fspec-constr-count=4 -O3
31+ build-depends: base>=4.0, base <5, template-haskell, QuickCheck >= 2.5.0.0
32+ other-extensions: ScopedTypeVariables
33+ exposed-modules: Data.Tree.Fenwick
34+ exposed: True
35+
36+Test-suite test_FenwickTree
37+ Type: exitcode-stdio-1.0
38+ main-is: tests/test_Fenwick.hs
39+ ghc-options: -fspec-constr-count=4 -O3
40+ Build-depends: base>=4.0, base <5, template-haskell, QuickCheck >= 2.5.0.0
41+
test/golden-test-cases/FenwickTree.nix.goldennew file+12
@@ -0,0 +1,12 @@
1+{ mkDerivation, base, QuickCheck, stdenv, template-haskell }:
2+mkDerivation {
3+ pname = "FenwickTree";
4+ version = "0.1.2.1";
5+ sha256 = "deadbeef";
6+ enableSeparateDataOutput = true;
7+ libraryHaskellDepends = [ base QuickCheck template-haskell ];
8+ testHaskellDepends = [ base QuickCheck template-haskell ];
9+ homepage = "https://github.com/mgajda/FenwickTree";
10+ description = "Data structure for fast query and update of cumulative sums";
11+ license = stdenv.lib.licenses.bsd3;
12+}
test/golden-test-cases/GPipe-GLFW.cabalnew file+51
@@ -0,0 +1,51 @@
1+name: GPipe-GLFW
2+version: 1.4.1.1
3+cabal-version: >=1.10
4+build-type: Simple
5+author: Patrick Redmond
6+license: MIT
7+license-file: LICENSE
8+copyright: Patrick Redmond
9+category: Graphics
10+stability: Experimental
11+homepage: https://github.com/plredmond/GPipe-GLFW
12+synopsis: GLFW OpenGL context creation for GPipe
13+description:
14+ GPipe-GLFW is a utility library to enable the use of GLFW as
15+ the OpenGL window and context handler for GPipe. GPipe is a
16+ typesafe functional API based on the conceptual model of
17+ OpenGL.
18+maintainer: Patrick Redmond
19+data-files: CHANGELOG.md
20+
21+library
22+ hs-source-dirs: src
23+ build-depends: base >= 4.7 && <4.11
24+ , stm >= 2.4 && <2.5
25+ , containers >= 0.5 && <0.6
26+ , async >= 2.1 && <2.3
27+ , GLFW-b >= 1.4 && <1.5
28+ , GPipe >= 2.2 && <2.3
29+ ghc-options: -Wall -Wno-orphans
30+ default-language: Haskell2010
31+ exposed-modules: Graphics.GPipe.Context.GLFW
32+ Graphics.GPipe.Context.GLFW.Input
33+ Graphics.GPipe.Context.GLFW.Window
34+ Graphics.GPipe.Context.GLFW.Misc
35+ other-modules: Graphics.GPipe.Context.GLFW.Calls
36+ Graphics.GPipe.Context.GLFW.Resource
37+ Graphics.GPipe.Context.GLFW.Wrappers
38+ Graphics.GPipe.Context.GLFW.Format
39+ Graphics.GPipe.Context.GLFW.Handler
40+ Graphics.GPipe.Context.GLFW.RPC
41+
42+source-repository head
43+ type: git
44+ location: https://github.com/plredmond/GPipe-GLFW.git
45+ subdir: GPipe-GLFW
46+
47+source-repository this
48+ type: git
49+ location: https://github.com/plredmond/GPipe-GLFW.git
50+ subdir: GPipe-GLFW
51+ tag: v1.4.1.1
test/golden-test-cases/GPipe-GLFW.nix.goldennew file+12
@@ -0,0 +1,12 @@
1+{ mkDerivation, async, base, containers, GLFW-b, GPipe, stdenv, stm
2+}:
3+mkDerivation {
4+ pname = "GPipe-GLFW";
5+ version = "1.4.1.1";
6+ sha256 = "deadbeef";
7+ enableSeparateDataOutput = true;
8+ libraryHaskellDepends = [ async base containers GLFW-b GPipe stm ];
9+ homepage = "https://github.com/plredmond/GPipe-GLFW";
10+ description = "GLFW OpenGL context creation for GPipe";
11+ license = stdenv.lib.licenses.mit;
12+}
test/golden-test-cases/GenericPretty.cabalnew file+99
@@ -0,0 +1,99 @@
1+-- GenericPretty.cabal auto-generated by cabal init. For additional
2+-- options, see
3+-- http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/authors.html#pkg-descr.
4+-- The name of the package.
5+Name: GenericPretty
6+
7+-- The package version. See the Haskell package versioning policy
8+-- (http://www.haskell.org/haskellwiki/Package_versioning_policy) for
9+-- standards guiding when and how versions should be incremented.
10+Version: 1.2.1
11+
12+-- A short (one-line) description of the package.
13+Synopsis: A generic, derivable, haskell pretty printer.
14+
15+-- A longer description of the package.
16+Description:
17+ GenericPretty is a Haskell library that supports automatic
18+ derivation of pretty printing functions on user defined data
19+ types.
20+ .
21+ The form of generics used is based on that introduced in the paper:
22+ Magalhaes, Dijkstra, Jeuring, and Loh,
23+ A Generic Deriving Mechanism for Haskell,
24+ 3'rd ACM Symposium on Haskell, pp. 37-48, September 2010,
25+ <http://dx.doi.org/10.1145/1863523.1863529>.
26+ Changes from the original paper in the GHC implementation
27+ are described here:
28+ <http://www.haskell.org/haskellwiki/GHC.Generics#Changes_from_the_paper>.
29+ .
30+ This package requires the use of the new GHC.Generics features
31+ <http://www.haskell.org/haskellwiki/GHC.Generics>, present from GHC 7.2.
32+ Use of these features is indicated by the DeriveGeneric pragma
33+ or the flag -XDeriveGeneric.
34+ .
35+ Pretty printing produces values of type Text.PrettyPrint.Doc, using
36+ the Text.PrettyPrint library
37+ <http://www.haskell.org/ghc/docs/latest/html/libraries/pretty-1.1.1.0/Text-PrettyPrint.html>.
38+ .
39+ The output provided is a pretty printed version of that provided by
40+ Prelude.show. That is, rendering the document provided by this pretty
41+ printer yields an output identical to that of Prelude.show, except
42+ for extra whitespace.
43+ .
44+ For information about the functions exported by the package please see
45+ the API linked further down this page.
46+
47+ For examples of usage, both basic and more complex see the README file and
48+ the haskell source code files in the TestSuite folder, both included in the package.
49+
50+ Finally for installation instructions also see the README file or this page:
51+ <http://www.haskell.org/haskellwiki/Cabal/How_to_install_a_Cabal_package>
52+
53+-- URL for the project homepage or repository.
54+Homepage: https://github.com/RazvanRanca/GenericPretty
55+
56+-- The license under which the package is released.
57+License: BSD3
58+
59+-- The file containing the license text.
60+License-file: LICENSE
61+
62+-- The package author(s).
63+Author: Razvan Ranca
64+
65+-- An email address to which users can send suggestions, bug reports,
66+-- and patches.
67+Maintainer: ranca.razvan@gmail.com
68+
69+-- A copyright notice.
70+-- Copyright:
71+
72+Category: Text, Generics, Pretty Printer
73+
74+Build-type: Simple
75+
76+-- Extra files to be distributed with the package, such as examples or
77+-- a README.
78+Extra-source-files: README TestSuite/SimpleTest.hs TestSuite/Tests.hs TestSuite/CustomTest.hs TestSuite/ZigZagTest.hs
79+
80+-- Constraint on the version of Cabal needed to build this package.
81+Cabal-version: >=1.6
82+
83+
84+Library
85+ -- Modules exported by the library.
86+ Exposed-modules: Text.PrettyPrint.GenericPretty
87+
88+ -- Packages needed in order to build this package.
89+ Build-depends: base >= 3 && < 5, ghc-prim, pretty
90+
91+ -- Modules not exported by this package.
92+ -- Other-modules:
93+
94+ -- Extra tools (e.g. alex, hsc2hs, ...) needed to build the source.
95+ -- Build-tools:
96+
97+source-repository head
98+ type: git
99+ location: git@github.com:RazvanRanca/GenericPretty.git
test/golden-test-cases/GenericPretty.nix.goldennew file+10
@@ -0,0 +1,10 @@
1+{ mkDerivation, base, ghc-prim, pretty, stdenv }:
2+mkDerivation {
3+ pname = "GenericPretty";
4+ version = "1.2.1";
5+ sha256 = "deadbeef";
6+ libraryHaskellDepends = [ base ghc-prim pretty ];
7+ homepage = "https://github.com/RazvanRanca/GenericPretty";
8+ description = "A generic, derivable, haskell pretty printer";
9+ license = stdenv.lib.licenses.bsd3;
10+}
test/golden-test-cases/HPDF.cabalnew file+97
@@ -0,0 +1,97 @@
1+Name: HPDF
2+Version: 1.4.10
3+cabal-version: >=1.10
4+License: BSD3
5+License-file:LICENSE
6+Copyright: Copyright (c) 2007-2016, alpheccar.org
7+category: Graphics
8+synopsis: Generation of PDF documents
9+maintainer: misc@NOSPAMalpheccar.org
10+build-type: Simple
11+tested-with: GHC==7.8.4,GHC==7.10.2
12+homepage: http://www.alpheccar.org
13+description: A PDF library with support for several pages, page transitions, outlines, annotations, compression, colors, shapes, patterns, jpegs, fonts, typesetting ... Have a look at the "Graphics.PDF.Documentation" module to see how to use it. Or, download the package and look at the test.hs file in the Test folder. That file is giving an example of each feature.
14+extra-source-files:
15+ c/ctext.h
16+ c/metrics.h
17+ c/conversion.h
18+ Test/AFMParser.hs
19+ Test/logo.jpg
20+ Test/Makefile
21+ Test/Penrose.hs
22+ Test/test.hs
23+ README.txt
24+ NEWS.txt
25+ TODO.txt
26+ changelog.md
27+
28+source-repository head
29+ type: git
30+ location: https://github.com/alpheccar/HPDF.git
31+
32+Test-Suite HPDF-Tests
33+ Type: exitcode-stdio-1.0
34+ Main-is: HPDF-tests.hs
35+ hs-source-dirs: Test
36+ Build-depends: base >= 4,
37+ HTF >= 0.10,
38+ HPDF
39+ Default-language: Haskell2010
40+
41+library
42+ build-depends:
43+ base >= 4 && < 5,
44+ containers,
45+ random >= 1.0,
46+ bytestring >= 0.9,
47+ array >= 0.1,
48+ zlib >= 0.5,
49+ binary >= 0.4,
50+ mtl,
51+ vector >=0.10,
52+ errors,
53+ base64-bytestring >= 0.1
54+ Default-language: Haskell2010
55+
56+ ghc-options: -Wall -fno-warn-tabs -funbox-strict-fields -O2
57+
58+ C-Sources:
59+ c/metrics.c
60+ c/conversion.c
61+ Include-Dirs: c
62+ Install-Includes:
63+ ctext.h
64+ conversion.h
65+ exposed-Modules:
66+ Graphics.PDF
67+ Graphics.PDF.Colors
68+ Graphics.PDF.Coordinates
69+ Graphics.PDF.Document
70+ Graphics.PDF.Shapes
71+ Graphics.PDF.Text
72+ Graphics.PDF.Navigation
73+ Graphics.PDF.Image
74+ Graphics.PDF.Action
75+ Graphics.PDF.Annotation
76+ Graphics.PDF.Pattern
77+ Graphics.PDF.Shading
78+ Graphics.PDF.Typesetting
79+ Graphics.PDF.Hyphenate
80+ Graphics.PDF.Documentation
81+ Other-Modules:
82+ Graphics.PDF.LowLevel.Types
83+ Graphics.PDF.Data.PDFTree
84+ Graphics.PDF.Data.Trie
85+ Graphics.PDF.Pages
86+ Graphics.PDF.Resources
87+ Graphics.PDF.Draw
88+ Graphics.PDF.Hyphenate.English
89+ Graphics.PDF.Hyphenate.LowLevel
90+ Graphics.PDF.LowLevel.Kern
91+ Graphics.PDF.Typesetting.Breaking
92+ Graphics.PDF.Typesetting.Horizontal
93+ Graphics.PDF.Typesetting.Vertical
94+ Graphics.PDF.Typesetting.Box
95+ Graphics.PDF.Typesetting.Layout
96+ Graphics.PDF.LowLevel.Serializer
97+ Graphics.PDF.Typesetting.StandardStyle
test/golden-test-cases/HPDF.nix.goldennew file+16
@@ -0,0 +1,16 @@
1+{ mkDerivation, array, base, base64-bytestring, binary, bytestring
2+, containers, errors, HTF, mtl, random, stdenv, vector, zlib
3+}:
4+mkDerivation {
5+ pname = "HPDF";
6+ version = "1.4.10";
7+ sha256 = "deadbeef";
8+ libraryHaskellDepends = [
9+ array base base64-bytestring binary bytestring containers errors
10+ mtl random vector zlib
11+ ];
12+ testHaskellDepends = [ base HTF ];
13+ homepage = "http://www.alpheccar.org";
14+ description = "Generation of PDF documents";
15+ license = stdenv.lib.licenses.bsd3;
16+}
test/golden-test-cases/HTF.cabalnew file+197
@@ -0,0 +1,197 @@
1+Name: HTF
2+Version: 0.13.2.2
3+License: LGPL
4+License-File: LICENSE
5+Copyright: (c) 2005-2015 Stefan Wehr
6+Author: Stefan Wehr <wehr@factisresearch.com>
7+Maintainer: Stefan Wehr <wehr@factisresearch.com>
8+Stability: Beta
9+Category: Testing
10+Synopsis: The Haskell Test Framework
11+Homepage: https://github.com/skogsbaer/HTF/
12+Bug-Reports: https://github.com/skogsbaer/HTF/issues
13+Description:
14+
15+ The Haskell Test Framework (/HTF/ for short) lets you define unit
16+ tests (<http://hunit.sourceforge.net>), QuickCheck properties
17+ (<http://www.cs.chalmers.se/~rjmh/QuickCheck/>), and black box
18+ tests in an easy and convenient way. HTF uses a custom
19+ preprocessor that collects test definitions automatically.
20+ Furthermore, the preprocessor allows HTF to report failing
21+ test cases with exact file name and line number information.
22+ Additionally, HTF tries to produce highly readable output
23+ for failing tests: for example, it colors and pretty prints expected and
24+ actual results and provides a diff between the two values.
25+
26+ .
27+
28+ The documentation of the "Test.Framework.Tutorial" module
29+ provides a tutorial for HTF. There is also a slightly out-dated
30+ blog article (<http://factisresearch.blogspot.de/2011/10/new-version-of-htf-with-diffs-colors.html>)
31+ demonstrating HTF's coloring, pretty-printing and diff functionality.
32+
33+Build-Type: Simple
34+Cabal-Version: >= 1.10
35+Extra-Source-Files:
36+ README.md
37+ TODO.org
38+ ChangeLog
39+ tests/bbt/should_fail/BBTArgs
40+ tests/bbt/should_fail/*.err
41+ tests/bbt/should_fail/*.out
42+ tests/bbt/should_fail/*.x
43+ tests/bbt/should_pass/*.in
44+ tests/bbt/should_pass/*.err
45+ tests/bbt/should_pass/*.out
46+ tests/bbt/should_pass/*.x
47+ tests/bbt/Skip/BBTArgs
48+ tests/bbt/Skip/some_unknown_but_skipped_file.x
49+ tests/bbt/Verbose/BBTArgs
50+ tests/bbt/Verbose/not_ok_because_stdout1.out
51+ tests/bbt/Verbose/not_ok_because_stdout1.x
52+ tests/Foo/test.h
53+ tests/Tutorial.hs
54+ tests/run-bbt.sh
55+ tests/compile-errors/Foo.h
56+ tests/compile-errors/run-tests.sh
57+ tests/compile-errors/Test1.hs
58+ tests/compile-errors/Test2.hs
59+ tests/compile-errors/Test3.hs
60+ tests/compile-errors/Test4.hs
61+ sample/LICENSE
62+ sample/Main.hs
63+ sample/MyPkg/A.hs
64+ sample/MyPkg/B.hs
65+ sample/README
66+ sample/sample-HTF.cabal
67+ sample/Setup.hs
68+ sample/TestMain.hs
69+ sample/bbt-dir/should-fail/BBTArgs
70+ sample/bbt-dir/should-fail/z.err
71+ sample/bbt-dir/should-fail/z.num
72+ sample/bbt-dir/should-pass/x.num
73+ sample/bbt-dir/should-pass/x.out
74+ scripts/local-htfpp
75+ scripts/run-sample
76+
77+Source-Repository head
78+ Type: git
79+ Location: http://github.com/skogsbaer/HTF.git
80+
81+Executable htfpp
82+ Main-Is: HTFPP.hs
83+ Build-Depends: HUnit,
84+ array,
85+ base == 4.*,
86+ cpphs >= 1.19,
87+ directory >= 1.0,
88+ mtl >= 1.1,
89+ old-time >= 1.0,
90+ random >= 1.0,
91+ text,
92+ HTF
93+ Other-Modules:
94+ Paths_HTF
95+ Test.Framework.Location
96+ Test.Framework.Preprocessor
97+ Default-language: Haskell2010
98+
99+Library
100+ Build-Depends: Diff >= 0.3,
101+ HUnit >= 1.2.5,
102+ QuickCheck >= 2.3,
103+ aeson < 0.10 || >= 0.11,
104+ array,
105+ base == 4.*,
106+ base64-bytestring,
107+ bytestring >= 0.9,
108+ containers >= 0.5,
109+ cpphs >= 1.19,
110+ haskell-src,
111+ directory >= 1.0,
112+ lifted-base >= 0.1,
113+ monad-control >= 0.3,
114+ mtl >= 1.1,
115+ old-time >= 1.0,
116+ pretty >= 1.0,
117+ process >= 1.0,
118+ random >= 1.0,
119+ regex-compat >= 0.92,
120+ text >= 0.11,
121+ time,
122+ vector,
123+ xmlgen >= 0.6
124+ if !os(windows)
125+ Build-Depends: unix >= 2.4
126+ Exposed-Modules:
127+ Test.Framework
128+ Test.Framework.HUnitWrapper
129+ Test.Framework.TestManager
130+ Test.Framework.TestInterface
131+ Test.Framework.TestTypes
132+ Test.Framework.TestReporter
133+ Test.Framework.History
134+ Test.Framework.CmdlineOptions
135+ Test.Framework.QuickCheckWrapper
136+ Test.Framework.BlackBoxTest
137+ Test.Framework.Location
138+ Test.Framework.Tutorial
139+ Test.Framework.Pretty
140+ Test.Framework.JsonOutput
141+ Test.Framework.XmlOutput
142+ Test.Framework.ThreadPool
143+ Test.Framework.AssertM
144+ Test.Framework.Colors
145+ Test.Framework.PrettyHaskell
146+ Test.Framework.Preprocessor
147+ Other-Modules:
148+ Test.Framework.Utils
149+ Test.Framework.Diff
150+ Test.Framework.Process
151+ Default-language: Haskell2010
152+ Ghc-Options: -W -fwarn-unused-imports -fwarn-unused-binds -fwarn-unused-matches -fwarn-unused-do-bind -fwarn-wrong-do-bind
153+
154+Test-Suite MiscTests
155+ Main-is: MiscTest.hs
156+ Type: exitcode-stdio-1.0
157+ Hs-Source-Dirs: tests
158+ Build-depends: HTF,
159+ HUnit,
160+ base == 4.*,
161+ mtl,
162+ random
163+ Default-language: Haskell2010
164+
165+Test-Suite TestHTF
166+ Main-is: TestHTF.hs
167+ Hs-Source-Dirs: tests, tests/real-bbt
168+ Type: exitcode-stdio-1.0
169+ Build-depends: HTF,
170+ aeson >= 0.6,
171+ aeson-pretty,
172+ base == 4.*,
173+ bytestring >= 0.9,
174+ directory >= 1.0,
175+ filepath >= 1.1,
176+ process >= 1.0,
177+ random,
178+ regex-compat >= 0.92,
179+ template-haskell,
180+ temporary >= 1.1,
181+ text >= 0.11,
182+ unordered-containers >= 0.2
183+ Default-language: Haskell2010
184+ Other-Modules:
185+ Foo.A, Foo.B, TestHTFHunitBackwardsCompatible, FailFast, MaxCurTime,
186+ MaxPrevTime, PrevFactor, SortByPrevTime, UniqTests1, UniqTests2, Quasi,
187+ Tutorial, Repeat
188+
189+Test-Suite TestThreadPools
190+ Main-is: ThreadPoolTest.hs
191+ Type: exitcode-stdio-1.0
192+ Hs-Source-Dirs: tests
193+ Build-depends: HTF,
194+ base == 4.*,
195+ mtl,
196+ random
197+ Default-language: Haskell2010
test/golden-test-cases/HTF.nix.goldennew file+31
@@ -0,0 +1,31 @@
1+{ mkDerivation, aeson, aeson-pretty, array, base, base64-bytestring
2+, bytestring, containers, cpphs, Diff, directory, filepath
3+, haskell-src, HUnit, lifted-base, monad-control, mtl, old-time
4+, pretty, process, QuickCheck, random, regex-compat, stdenv
5+, template-haskell, temporary, text, time, unix
6+, unordered-containers, vector, xmlgen
7+}:
8+mkDerivation {
9+ pname = "HTF";
10+ version = "0.13.2.2";
11+ sha256 = "deadbeef";
12+ isLibrary = true;
13+ isExecutable = true;
14+ libraryHaskellDepends = [
15+ aeson array base base64-bytestring bytestring containers cpphs Diff
16+ directory haskell-src HUnit lifted-base monad-control mtl old-time
17+ pretty process QuickCheck random regex-compat text time unix vector
18+ xmlgen
19+ ];
20+ executableHaskellDepends = [
21+ array base cpphs directory HUnit mtl old-time random text
22+ ];
23+ testHaskellDepends = [
24+ aeson aeson-pretty base bytestring directory filepath HUnit mtl
25+ process random regex-compat template-haskell temporary text
26+ unordered-containers
27+ ];
28+ homepage = "https://github.com/skogsbaer/HTF/";
29+ description = "The Haskell Test Framework";
30+ license = "LGPL";
31+}
test/golden-test-cases/HTTP.cabalnew file+182
@@ -0,0 +1,182 @@
1+Name: HTTP
2+Version: 4000.3.9
3+Cabal-Version: >= 1.8
4+Build-type: Simple
5+License: BSD3
6+License-file: LICENSE
7+Author: Warrick Gray <warrick.gray@hotmail.com>
8+Maintainer: Ganesh Sittampalam <ganesh@earth.li>
9+Homepage: https://github.com/haskell/HTTP
10+Category: Network
11+Synopsis: A library for client-side HTTP
12+Description:
13+
14+ The HTTP package supports client-side web programming in Haskell. It lets you set up
15+ HTTP connections, transmitting requests and processing the responses coming back, all
16+ from within the comforts of Haskell. It's dependent on the network package to operate,
17+ but other than that, the implementation is all written in Haskell.
18+ .
19+ A basic API for issuing single HTTP requests + receiving responses is provided. On top
20+ of that, a session-level abstraction is also on offer (the @BrowserAction@ monad);
21+ it taking care of handling the management of persistent connections, proxies,
22+ state (cookies) and authentication credentials required to handle multi-step
23+ interactions with a web server.
24+ .
25+ The representation of the bytes flowing across is extensible via the use of a type class,
26+ letting you pick the representation of requests and responses that best fits your use.
27+ Some pre-packaged, common instances are provided for you (@ByteString@, @String@).
28+ .
29+ Here's an example use:
30+ .
31+ >
32+ > do
33+ > rsp <- Network.HTTP.simpleHTTP (getRequest "http://www.haskell.org/")
34+ > -- fetch document and return it (as a 'String'.)
35+ > fmap (take 100) (getResponseBody rsp)
36+ >
37+ > do
38+ > (_, rsp)
39+ > <- Network.Browser.browse $ do
40+ > setAllowRedirects True -- handle HTTP redirects
41+ > request $ getRequest "http://www.haskell.org/"
42+ > return (take 100 (rspBody rsp))
43+ .
44+ __Note:__ This package does not support HTTPS connections.
45+ If you need HTTPS, take a look at the following packages:
46+ .
47+ * <http://hackage.haskell.org/package/http-streams http-streams>
48+ .
49+ * <http://hackage.haskell.org/package/http-client http-client> (in combination with
50+ <http://hackage.haskell.org/package/http-client-tls http-client-tls>)
51+ .
52+ * <http://hackage.haskell.org/package/req req>
53+ .
54+ * <http://hackage.haskell.org/package/wreq wreq>
55+ .
56+
57+Extra-Source-Files: CHANGES
58+
59+Source-Repository head
60+ type: git
61+ location: https://github.com/haskell/HTTP.git
62+
63+Flag mtl1
64+ description: Use the old mtl version 1.
65+ default: False
66+
67+Flag warn-as-error
68+ default: False
69+ description: Build with warnings-as-errors
70+ manual: True
71+
72+Flag network23
73+ description: Use version 2.3.x or below of the network package
74+ default: False
75+
76+Flag conduit10
77+ description: Use version 1.0.x or below of the conduit package (for the test suite)
78+ default: False
79+
80+Flag warp-tests
81+ description: Test against warp
82+ default: True
83+ manual: True
84+
85+flag network-uri
86+ description: Get Network.URI from the network-uri package
87+ default: True
88+
89+Library
90+ Exposed-modules:
91+ Network.BufferType,
92+ Network.Stream,
93+ Network.StreamDebugger,
94+ Network.StreamSocket,
95+ Network.TCP,
96+ Network.HTTP,
97+ Network.HTTP.Headers,
98+ Network.HTTP.Base,
99+ Network.HTTP.Stream,
100+ Network.HTTP.Auth,
101+ Network.HTTP.Cookie,
102+ Network.HTTP.Proxy,
103+ Network.HTTP.HandleStream,
104+ Network.Browser
105+ Other-modules:
106+ Network.HTTP.Base64,
107+ Network.HTTP.MD5Aux,
108+ Network.HTTP.Utils
109+ Paths_HTTP
110+ GHC-options: -fwarn-missing-signatures -Wall
111+
112+ -- note the test harness constraints should be kept in sync with these
113+ -- where dependencies are shared
114+ Build-depends: base >= 4.3.0.0 && < 4.11, parsec >= 2.0 && < 3.2
115+ Build-depends: array >= 0.3.0.2 && < 0.6, bytestring >= 0.9.1.5 && < 0.11
116+ Build-depends: time >= 1.1.2.3 && < 1.9
117+
118+ Extensions: FlexibleInstances
119+
120+ if flag(mtl1)
121+ Build-depends: mtl >= 1.1.1.0 && < 1.2
122+ CPP-Options: -DMTL1
123+ else
124+ Build-depends: mtl >= 2.0 && < 2.3
125+
126+ if flag(network-uri)
127+ Build-depends: network-uri == 2.6.*, network == 2.6.*
128+ else
129+ Build-depends: network >= 2.2.1.8 && < 2.6
130+
131+ if flag(warn-as-error)
132+ ghc-options: -Werror
133+
134+ if os(windows)
135+ Build-depends: Win32 >= 2.2.0.0 && < 2.6
136+
137+Test-Suite test
138+ type: exitcode-stdio-1.0
139+
140+ hs-source-dirs: test
141+ main-is: httpTests.hs
142+
143+ other-modules:
144+ Httpd
145+ UnitTests
146+
147+ -- note: version constraints for dependencies shared with the library
148+ -- should be the same
149+ build-depends: HTTP,
150+ HUnit >= 1.2.0.1 && < 1.7,
151+ httpd-shed >= 0.4 && < 0.5,
152+ mtl >= 1.1.1.0 && < 2.3,
153+ bytestring >= 0.9.1.5 && < 0.11,
154+ deepseq >= 1.3.0.0 && < 1.5,
155+ pureMD5 >= 0.2.4 && < 2.2,
156+ base >= 4.3.0.0 && < 4.11,
157+ split >= 0.1.3 && < 0.3,
158+ test-framework >= 0.2.0 && < 0.9,
159+ test-framework-hunit >= 0.3.0 && <0.4
160+
161+ if flag(network-uri)
162+ Build-depends: network-uri == 2.6.*, network == 2.6.*
163+ else
164+ Build-depends: network >= 2.2.1.5 && < 2.6
165+
166+ if flag(warp-tests)
167+ CPP-Options: -DWARP_TESTS
168+ build-depends:
169+ case-insensitive >= 0.4.0.1 && < 1.3,
170+ http-types >= 0.8.0 && < 1.0,
171+ wai >= 2.1.0 && < 3.3,
172+ warp >= 2.1.0 && < 3.3
173+
174+ if flag(conduit10)
175+ build-depends:
176+ conduit >= 1.0.8 && < 1.1
177+ else
178+ build-depends:
179+ conduit >= 1.1 && < 1.3,
180+ conduit-extra >= 1.1 && < 1.3
181+
182+
test/golden-test-cases/HTTP.nix.goldennew file+21
@@ -0,0 +1,21 @@
1+{ mkDerivation, array, base, bytestring, case-insensitive, conduit
2+, conduit-extra, deepseq, http-types, httpd-shed, HUnit, mtl
3+, network, network-uri, parsec, pureMD5, split, stdenv
4+, test-framework, test-framework-hunit, time, wai, warp
5+}:
6+mkDerivation {
7+ pname = "HTTP";
8+ version = "4000.3.9";
9+ sha256 = "deadbeef";
10+ libraryHaskellDepends = [
11+ array base bytestring mtl network network-uri parsec time
12+ ];
13+ testHaskellDepends = [
14+ base bytestring case-insensitive conduit conduit-extra deepseq
15+ http-types httpd-shed HUnit mtl network network-uri pureMD5 split
16+ test-framework test-framework-hunit wai warp
17+ ];
18+ homepage = "https://github.com/haskell/HTTP";
19+ description = "A library for client-side HTTP";
20+ license = stdenv.lib.licenses.bsd3;
21+}
test/golden-test-cases/Hclip.cabalnew file+55
@@ -0,0 +1,55 @@
1+
2+name: Hclip
3+
4+-- The package version. See the Haskell package versioning policy (PVP)
5+-- for standards guiding when and how versions should be incremented.
6+-- http://www.haskell.org/haskellwiki/Package_versioning_policy
7+-- PVP summary: +-+------- breaking API changes
8+-- | | +----- non-breaking API additions
9+-- | | | +--- code changes with no API change
10+version: 3.0.0.4
11+
12+synopsis: A small cross-platform library for reading and modifying the system clipboard.
13+
14+homepage: https://github.com/jetho/Hclip
15+
16+license: BSD3
17+
18+license-file: LICENSE
19+
20+author: Jens Thomas
21+
22+maintainer: jetho@gmx.de
23+
24+category: System
25+
26+description:
27+ A small cross-platform library for reading and modifying the system clipboard.
28+ .
29+ Hclip works on Windows, Mac OS X and Linux (but see the requirements below!).
30+ .
31+ Requirements:
32+ .
33+ * Windows: No additional requirements.
34+ .
35+ * Mac OS X: Requires the pbcopy and pbpaste commands, which ship with Mac OS X.
36+ .
37+ * Linux: Requires xclip or xsel installed.
38+
39+build-type: Simple
40+
41+cabal-version: >=1.10
42+
43+
44+library
45+ exposed-modules: System.Hclip
46+ other-extensions: CPP, DeriveDataTypeable, GADTs
47+ default-language: Haskell2010
48+ build-depends: base >= 3 && < 5, process, mtl, strict
49+ if os(windows)
50+ build-depends: Win32
51+
52+source-repository head
53+ type: git
54+ location: git://github.com/jetho/Hclip.git
55+
test/golden-test-cases/Hclip.nix.goldennew file+10
@@ -0,0 +1,10 @@
1+{ mkDerivation, base, mtl, process, stdenv, strict }:
2+mkDerivation {
3+ pname = "Hclip";
4+ version = "3.0.0.4";
5+ sha256 = "deadbeef";
6+ libraryHaskellDepends = [ base mtl process strict ];
7+ homepage = "https://github.com/jetho/Hclip";
8+ description = "A small cross-platform library for reading and modifying the system clipboard";
9+ license = stdenv.lib.licenses.bsd3;
10+}
test/golden-test-cases/MissingH.cabalnew file+131
@@ -0,0 +1,131 @@
1+Name: MissingH
2+Version: 1.4.0.1
3+License: BSD3
4+Maintainer: John Goerzen <jgoerzen@complete.org>
5+Author: John Goerzen
6+Copyright: Copyright (c) 2004-2016 John Goerzen
7+license-file: LICENSE
8+extra-source-files: LICENSE,
9+ announcements/0.10.0.txt,
10+ announcements/0.8.0.txt,
11+ announcements/0.9.0.txt,
12+ testsrc/gzfiles/empty.gz,
13+ testsrc/gzfiles/t1.gz,
14+ testsrc/gzfiles/t1bad.gz,
15+ testsrc/gzfiles/t2.gz,
16+ testsrc/gzfiles/zeros.gz,
17+ testsrc/mime.types.test,
18+ 3rd-party-licenses/BSD,
19+ 3rd-party-licenses/LGPL-2.1,
20+ Makefile,
21+ TODO,
22+ examples/simplegrep.hs,
23+ examples/test2.hs,
24+ examples/test3.hs,
25+ pending/Gopher.hs,
26+ pending/Maildir.disabled,
27+ pending/Tar.newhs,
28+ pending/Tar/HeaderParser.newhs,
29+ tolgpl,
30+ winbuild.bat,
31+ wintest.bat
32+homepage: http://software.complete.org/missingh
33+Category: Unclassified
34+synopsis: Large utility library
35+Description: MissingH is a library of all sorts of utility functions for
36+ Haskell programmers. It is written in pure Haskell and thus should
37+ be extremely portable and easy to use.
38+Stability: Beta
39+Build-Type: Simple
40+Cabal-Version: >=1.8
41+
42+Library
43+ Hs-Source-Dirs: src
44+ Exposed-Modules:
45+ Data.String.Utils, System.IO.Utils, System.IO.Binary, Data.List.Utils,
46+ System.Daemon,
47+ Text.ParserCombinators.Parsec.Utils,
48+ Network.Email.Mailbox,
49+ Control.Concurrent.Thread.Utils,
50+ Network.Email.Sendmail,
51+ Data.CSV,
52+ System.Cmd.Utils,
53+ Data.BinPacking,
54+ Data.Progress.Tracker,
55+ Data.Progress.Meter,
56+ Data.Quantity,
57+ Data.Map.Utils, System.Path, System.Path.NameManip,
58+ System.Path.WildMatch, System.Path.Glob,
59+ System.Time.Utils,
60+ Network.Utils,
61+ Network.SocketServer,
62+ Data.Either.Utils,
63+ Data.Maybe.Utils,
64+ Data.Tuple.Utils,
65+ Data.Bits.Utils,
66+ Data.Hash.CRC32.GZip,
67+ Data.Hash.MD5, Data.Hash.MD5.Zord64_HARD,
68+ Data.Compression.Inflate,
69+ System.FileArchive.GZip,
70+ System.IO.HVFS,
71+ System.IO.HVFS.Combinators,
72+ System.IO.HVFS.InstanceHelpers,
73+ System.IO.HVFS.Utils,
74+ System.IO.HVIO, System.IO.StatCompat, System.IO.WindowsCompat,
75+ System.IO.PlafCompat, System.Posix.Consts,
76+ System.Debian, System.Debian.ControlParser,
77+ Data.MIME.Types,
78+ System.Console.GetOpt.Utils
79+
80+ Extensions: ExistentialQuantification, OverlappingInstances,
81+ UndecidableInstances, CPP, Rank2Types,
82+ MultiParamTypeClasses, FlexibleInstances, FlexibleContexts,
83+ ScopedTypeVariables
84+
85+ Build-Depends: network, parsec, base,
86+ mtl, HUnit, regex-compat,
87+ filepath,
88+ hslogger,
89+ base >= 4.5, base < 5, directory, random, process, old-time,
90+ containers, old-locale, array, time
91+ If ! os(windows)
92+ Build-Depends: unix
93+
94+test-suite runtests
95+ type: exitcode-stdio-1.0
96+
97+ Build-Depends: network, parsec, base,
98+ mtl, HUnit, regex-compat,
99+ errorcall-eq-instance,
100+ filepath,
101+ hslogger,
102+ base >= 4.5, base < 5, directory, random, process, old-time,
103+ containers, old-locale, array, time
104+ If ! os(windows)
105+ Build-Depends: unix
106+ Build-Depends: testpack, QuickCheck, HUnit
107+
108+ Main-Is: runtests.hs
109+ HS-Source-Dirs: testsrc, ., src
110+ Other-Modules: Bitstest,
111+ CRC32GZIPtest,
112+ Eithertest,
113+ GZiptest,
114+ Globtest,
115+ HVFStest,
116+ HVIOtest,
117+ IOtest,
118+ Listtest,
119+ MIMETypestest,
120+ Maptest,
121+ Pathtest,
122+ ProgressTrackertest,
123+ Str.CSVtest,
124+ Strtest,
125+ Tests,
126+ Timetest,
127+ WildMatchtest
128+ Extensions: ExistentialQuantification, OverlappingInstances,
129+ UndecidableInstances, CPP, Rank2Types,
130+ MultiParamTypeClasses, FlexibleInstances, FlexibleContexts,
131+ ScopedTypeVariables
test/golden-test-cases/MissingH.nix.goldennew file+22
@@ -0,0 +1,22 @@
1+{ mkDerivation, array, base, containers, directory
2+, errorcall-eq-instance, filepath, hslogger, HUnit, mtl, network
3+, old-locale, old-time, parsec, process, QuickCheck, random
4+, regex-compat, stdenv, testpack, time, unix
5+}:
6+mkDerivation {
7+ pname = "MissingH";
8+ version = "1.4.0.1";
9+ sha256 = "deadbeef";
10+ libraryHaskellDepends = [
11+ array base containers directory filepath hslogger HUnit mtl network
12+ old-locale old-time parsec process random regex-compat time unix
13+ ];
14+ testHaskellDepends = [
15+ array base containers directory errorcall-eq-instance filepath
16+ hslogger HUnit mtl network old-locale old-time parsec process
17+ QuickCheck random regex-compat testpack time unix
18+ ];
19+ homepage = "http://software.complete.org/missingh";
20+ description = "Large utility library";
21+ license = stdenv.lib.licenses.bsd3;
22+}
test/golden-test-cases/ObjectName.cabalnew file+34
@@ -0,0 +1,34 @@
1+name: ObjectName
2+version: 1.1.0.1
3+synopsis: Explicitly handled object names
4+description:
5+ This tiny package contains the class ObjectName, which corresponds to the
6+ general notion of explicitly handled identifiers for API objects, e.g. a
7+ texture object name in OpenGL or a buffer object name in OpenAL.
8+homepage: https://github.com/svenpanne/ObjectName
9+bug-reports: https://github.com/svenpanne/ObjectName/issues
10+copyright: Copyright (C) 2014-2015 Sven Panne
11+license: BSD3
12+license-file: LICENSE
13+author: Sven Panne
14+maintainer: Sven Panne <svenpanne@gmail.com>
15+category: Data
16+build-type: Simple
17+cabal-version: >=1.10
18+extra-source-files:
19+ README.md
20+
21+library
22+ exposed-modules:
23+ Data.ObjectName
24+ build-depends:
25+ base >= 4 && < 5,
26+ transformers >= 0.2 && < 0.6
27+ default-language: Haskell2010
28+ other-extensions: CPP
29+ hs-Source-Dirs: src
30+ ghc-options: -Wall
31+
32+source-repository head
33+ type: git
34+ location: https://github.com/haskell-opengl/ObjectName.git
test/golden-test-cases/ObjectName.nix.goldennew file+10
@@ -0,0 +1,10 @@
1+{ mkDerivation, base, stdenv, transformers }:
2+mkDerivation {
3+ pname = "ObjectName";
4+ version = "1.1.0.1";
5+ sha256 = "deadbeef";
6+ libraryHaskellDepends = [ base transformers ];
7+ homepage = "https://github.com/svenpanne/ObjectName";
8+ description = "Explicitly handled object names";
9+ license = stdenv.lib.licenses.bsd3;
10+}
test/golden-test-cases/Only.cabalnew file+32
@@ -0,0 +1,32 @@
1+name: Only
2+version: 0.1
3+synopsis: The 1-tuple type or single-value "collection"
4+license: BSD3
5+license-file: LICENSE
6+author: Herbert Valerio Riedel
7+maintainer: hvr@gnu.org
8+bug-reports: https://github.com/hvr/Only/issues
9+category: Data
10+build-type: Simple
11+cabal-version: >=1.10
12+description: This package provides the canonical anonymous 1-tuple type missing from Haskell for attaching typeclass instances.
13+
14+Source-Repository head
15+ Type: git
16+ Location: https://github.com/hvr/Only.git
17+
18+library
19+ hs-source-dirs: src
20+ exposed-modules: Data.Tuple.Only
21+
22+ default-language: Haskell2010
23+ other-extensions: DeriveGeneric
24+ , DeriveDataTypeable
25+ , DeriveFunctor
26+ , Safe
27+
28+ build-depends: base >= 4.5 && <5
29+ , deepseq >= 1.1 && <1.5
30+
31+ if impl(ghc == 7.4.*)
32+ build-depends: ghc-prim
test/golden-test-cases/Only.nix.goldennew file+9
@@ -0,0 +1,9 @@
1+{ mkDerivation, base, deepseq, stdenv }:
2+mkDerivation {
3+ pname = "Only";
4+ version = "0.1";
5+ sha256 = "deadbeef";
6+ libraryHaskellDepends = [ base deepseq ];
7+ description = "The 1-tuple type or single-value \"collection\"";
8+ license = stdenv.lib.licenses.bsd3;
9+}
test/golden-test-cases/QuasiText.cabalnew file+20
@@ -0,0 +1,20 @@
1+-- Initial QuasiText.cabal generated by cabal init. For further
2+-- documentation, see http://haskell.org/cabal/users-guide/
3+
4+name: QuasiText
5+version: 0.1.2.6
6+synopsis: A QuasiQuoter for Text.
7+description: A QuasiQuoter for interpolating values into Text strings.
8+homepage: https://github.com/mikeplus64/QuasiText
9+license: BSD3
10+license-file: LICENSE
11+author: Mike Ledger
12+maintainer: eleventynine@gmail.com
13+category: Text
14+build-type: Simple
15+cabal-version: >=1.8
16+
17+library
18+ exposed-modules: Text.QuasiText
19+ build-depends: base >= 4.5.0.0 && < 5.0.0.0, template-haskell, haskell-src-meta, attoparsec, text, th-lift-instances
20+ hs-source-dirs: src
test/golden-test-cases/QuasiText.nix.goldennew file+15
@@ -0,0 +1,15 @@
1+{ mkDerivation, attoparsec, base, haskell-src-meta, stdenv
2+, template-haskell, text, th-lift-instances
3+}:
4+mkDerivation {
5+ pname = "QuasiText";
6+ version = "0.1.2.6";
7+ sha256 = "deadbeef";
8+ libraryHaskellDepends = [
9+ attoparsec base haskell-src-meta template-haskell text
10+ th-lift-instances
11+ ];
12+ homepage = "https://github.com/mikeplus64/QuasiText";
13+ description = "A QuasiQuoter for Text";
14+ license = stdenv.lib.licenses.bsd3;
15+}
test/golden-test-cases/QuickCheck.cabalnew file+171
@@ -0,0 +1,171 @@
1+Name: QuickCheck
2+Version: 2.10.1
3+Cabal-Version: >= 1.8
4+Build-type: Simple
5+License: BSD3
6+License-file: LICENSE
7+Copyright: 2000-2017 Koen Claessen, 2006-2008 Björn Bringert, 2009-2017 Nick Smallbone
8+Author: Koen Claessen <koen@chalmers.se>
9+Maintainer: Nick Smallbone <nick@smallbone.se>; see also QuickCheck mailing list (https://groups.google.com/forum/#!forum/haskell-quickcheck)
10+Bug-reports: https://github.com/nick8325/quickcheck/issues
11+Tested-with: GHC == 7.0.4, GHC == 7.2.2, GHC >= 7.4
12+Homepage: https://github.com/nick8325/quickcheck
13+Category: Testing
14+Synopsis: Automatic testing of Haskell programs
15+Description:
16+ QuickCheck is a library for random testing of program properties.
17+ .
18+ The programmer provides a specification of the program, in the form of
19+ properties which functions should satisfy, and QuickCheck then tests that the
20+ properties hold in a large number of randomly generated cases.
21+ .
22+ Specifications are expressed in Haskell, using combinators defined in the
23+ QuickCheck library. QuickCheck provides combinators to define properties,
24+ observe the distribution of test data, and define test data generators.
25+ .
26+ The <http://www.cse.chalmers.se/~rjmh/QuickCheck/manual.html official QuickCheck manual>
27+ explains how to write generators and properties;
28+ it is out-of-date in some details but still full of useful advice.
29+ .
30+ A user of QuickCheck has written an unofficial, but detailed, tutorial which
31+ you can find at
32+ <https://begriffs.com/posts/2017-01-14-design-use-quickcheck.html>.
33+
34+extra-source-files:
35+ README
36+ changelog
37+ examples/Heap.hs
38+ examples/Heap_Program.hs
39+ examples/Heap_ProgramAlgebraic.hs
40+ examples/Lambda.hs
41+ examples/Merge.hs
42+ examples/Set.hs
43+ examples/Simple.hs
44+
45+source-repository head
46+ type: git
47+ location: https://github.com/nick8325/quickcheck
48+
49+source-repository this
50+ type: git
51+ location: https://github.com/nick8325/quickcheck
52+ tag: 2.10.1
53+
54+flag templateHaskell
55+ Description: Build Test.QuickCheck.All, which uses Template Haskell.
56+ Default: True
57+
58+library
59+ Build-depends: base >=4.3 && <5, random, containers
60+
61+ -- Modules that are always built.
62+ Exposed-Modules:
63+ Test.QuickCheck,
64+ Test.QuickCheck.Arbitrary,
65+ Test.QuickCheck.Gen,
66+ Test.QuickCheck.Gen.Unsafe,
67+ Test.QuickCheck.Monadic,
68+ Test.QuickCheck.Modifiers,
69+ Test.QuickCheck.Property,
70+ Test.QuickCheck.Test,
71+ Test.QuickCheck.Text,
72+ Test.QuickCheck.Poly,
73+ Test.QuickCheck.State,
74+ Test.QuickCheck.Random,
75+ Test.QuickCheck.Exception
76+
77+ -- GHC-specific modules.
78+ if impl(ghc)
79+ Exposed-Modules: Test.QuickCheck.Function
80+ Build-depends: transformers >= 0.3, deepseq
81+ else
82+ cpp-options: -DNO_TRANSFORMERS -DNO_DEEPSEQ
83+
84+ if impl(ghc) && flag(templateHaskell)
85+ Build-depends: template-haskell >= 2.4
86+ Other-Extensions: TemplateHaskell
87+ Exposed-Modules: Test.QuickCheck.All
88+ else
89+ cpp-options: -DNO_TEMPLATE_HASKELL
90+
91+ if !impl(ghc >= 7.2)
92+ cpp-options: -DNO_FOREIGN_C_USECONDS
93+
94+ -- The new generics appeared in GHC 7.2...
95+ if impl(ghc < 7.2)
96+ cpp-options: -DNO_GENERICS
97+ -- ...but in 7.2-7.4 it lives in the ghc-prim package.
98+ if impl(ghc >= 7.2) && impl(ghc < 7.6)
99+ Build-depends: ghc-prim
100+
101+ -- Safe Haskell appeared in GHC 7.2, but GHC.Generics isn't safe until 7.4.
102+ if impl (ghc < 7.4)
103+ cpp-options: -DNO_SAFE_HASKELL
104+
105+ -- Use tf-random on newer GHCs.
106+ if impl(ghc)
107+ Build-depends: tf-random >= 0.4
108+ else
109+ cpp-options: -DNO_TF_RANDOM
110+
111+ if !impl(ghc >= 7.6)
112+ cpp-options: -DNO_POLYKINDS
113+
114+ if !impl(ghc >= 8.0)
115+ cpp-options: -DNO_MONADFAIL
116+
117+ -- Switch off most optional features on non-GHC systems.
118+ if !impl(ghc)
119+ -- If your Haskell compiler can cope without some of these, please
120+ -- send a message to the QuickCheck mailing list!
121+ cpp-options: -DNO_TIMEOUT -DNO_NEWTYPE_DERIVING -DNO_GENERICS -DNO_TEMPLATE_HASKELL -DNO_SAFE_HASKELL
122+ if !impl(hugs) && !impl(uhc)
123+ cpp-options: -DNO_ST_MONAD -DNO_MULTI_PARAM_TYPE_CLASSES
124+
125+ -- LANGUAGE pragmas don't have any effect in Hugs.
126+ if impl(hugs)
127+ Extensions: CPP
128+
129+ if impl(uhc)
130+ -- Cabal under UHC needs pointing out all the dependencies of the
131+ -- random package.
132+ Build-depends: old-time, old-locale
133+ -- Plus some bits of the standard library are missing.
134+ cpp-options: -DNO_FIXED -DNO_EXCEPTIONS
135+
136+Test-Suite test-quickcheck
137+ type: exitcode-stdio-1.0
138+ hs-source-dirs:
139+ examples
140+ main-is: Heap.hs
141+ build-depends: base, QuickCheck
142+ if !flag(templateHaskell)
143+ Buildable: False
144+
145+Test-Suite test-quickcheck-gcoarbitrary
146+ type: exitcode-stdio-1.0
147+ hs-source-dirs: tests
148+ main-is: GCoArbitraryExample.hs
149+ build-depends: base, QuickCheck
150+ if !impl(ghc >= 7.2)
151+ buildable: False
152+ if impl(ghc >= 7.2) && impl(ghc < 7.6)
153+ build-depends: ghc-prim
154+
155+Test-Suite test-quickcheck-generators
156+ type: exitcode-stdio-1.0
157+ hs-source-dirs: tests
158+ main-is: Generators.hs
159+ build-depends: base, QuickCheck
160+ if !flag(templateHaskell)
161+ Buildable: False
162+
163+Test-Suite test-quickcheck-gshrink
164+ type: exitcode-stdio-1.0
165+ hs-source-dirs: tests
166+ main-is: GShrinkExample.hs
167+ build-depends: base, QuickCheck
168+ if !impl(ghc >= 7.2)
169+ buildable: False
170+ if impl(ghc >= 7.2) && impl(ghc < 7.6)
171+ build-depends: ghc-prim
test/golden-test-cases/QuickCheck.nix.goldennew file+16
@@ -0,0 +1,16 @@
1+{ mkDerivation, base, containers, deepseq, random, stdenv
2+, template-haskell, tf-random, transformers
3+}:
4+mkDerivation {
5+ pname = "QuickCheck";
6+ version = "2.10.1";
7+ sha256 = "deadbeef";
8+ libraryHaskellDepends = [
9+ base containers deepseq random template-haskell tf-random
10+ transformers
11+ ];
12+ testHaskellDepends = [ base ];
13+ homepage = "https://github.com/nick8325/quickcheck";
14+ description = "Automatic testing of Haskell programs";
15+ license = stdenv.lib.licenses.bsd3;
16+}
test/golden-test-cases/ReadArgs.cabalnew file+110
@@ -0,0 +1,110 @@
1+Name: ReadArgs
2+Version: 1.2.3
3+Synopsis: Simple command line argument parsing
4+
5+Description:
6+
7+ ReadArgs provides the @readArgs@ IO action, which lets you tell the compiler
8+ to parse the command line arguments to fit the type signature you give.
9+ .
10+ For example @(a :: Int, b :: String, c :: Float) <- readArgs@ would
11+ parse the first runtime argument as an @Int@, the second as a @String@ (no
12+ quotes required) and the third as a @Float@.
13+ .
14+ If the runtime arguments are incompatible with the type signature,
15+ then a simple usage statement is given of the types needed.
16+ .
17+ Continuing the previous example, if it was used in a
18+ program named @Example@, the error message for the above
19+ action would be:
20+ .
21+ @
22+ usage: Example Int String Float
23+ @
24+ .
25+ Any type that has both @Typeable@ and @Read@ instances
26+ can be used. @Char@, @String@, and @Text@ are handled specially so that
27+ command line arguments for both do not require quotes (as their
28+ @Read@ instances do). A special instance is provided for @FilePath@ so
29+ that no constructor or quotes are required.
30+ .
31+ @readArgs@ also supports optional arguments and variadic arguments.
32+ Optional arguments are specified using @Maybe@, and variadic arguments
33+ using a list. @(a :: Int, b :: Maybe String, c :: [Float]) <- readArgs@
34+ would successfully parse any of the following sets of command line arguments:
35+ .
36+ @
37+ Example 1
38+ Example 1 2 3 4
39+ Example 1 foo
40+ Example 1 foo 2 3 4
41+ @
42+ .
43+ But not
44+ .
45+ @
46+ Example
47+ Example foo
48+ Example 1.0
49+ @
50+ .
51+ Usage statements for optional and variadic arguments use command-line
52+ parlance:
53+ .
54+ @
55+ usage: Example Int [String] [Float..]
56+ @
57+ .
58+ Note that both optional and variadic parsers are greedy by default
59+ (so @Example 1 2 3 4@ was parsed as @(1, "2", [3.0,4.0])@. They
60+ may both be made non-greedy through use of the @NonGreedy@ constructor:
61+ .
62+ @
63+ ( a :: Int
64+ , NonGreedy b :: NonGreedy Maybe String
65+ , NonGreedy c :: NonGreedy [] Float
66+ ) <- readArgs
67+ @
68+
69+Homepage: http://github.com/rampion/ReadArgs
70+License: BSD3
71+License-file: LICENSE
72+Author: Noah Luck Easterly
73+Maintainer: noah.easterly@gmail.com
74+Category: Command Line
75+Build-type: Simple
76+Cabal-version: >=1.8
77+
78+Source-repository head
79+ type: git
80+ location: git://github.com/rampion/ReadArgs.git
81+
82+Library
83+ Exposed-modules: ReadArgs
84+
85+ Build-depends:
86+ base >= 4.3.1.0 && < 5,
87+ system-filepath >= 0.4.7 && < 0.5,
88+ text >= 0.11.1.13 && < 12
89+
90+Test-Suite ReadArgsSpec
91+ type:
92+ exitcode-stdio-1.0
93+
94+ Main-Is:
95+ ReadArgsSpec.hs
96+
97+ Build-depends:
98+ hspec >= 1.3 && < 3,
99+ base >= 4.3.1.0 && < 5,
100+ system-filepath >= 0.4.7 && < 0.5,
101+ text >= 0.11.1.13 && < 12
102+
103+Executable ReadArgsEx
104+ Main-Is:
105+ ReadArgsEx.hs
106+
107+ Build-depends:
108+ base >= 4.3.1.0 && < 5,
109+ system-filepath >= 0.4.7 && < 0.5,
110+ text >= 0.11.1.13 && < 12
test/golden-test-cases/ReadArgs.nix.goldennew file+14
@@ -0,0 +1,14 @@
1+{ mkDerivation, base, hspec, stdenv, system-filepath, text }:
2+mkDerivation {
3+ pname = "ReadArgs";
4+ version = "1.2.3";
5+ sha256 = "deadbeef";
6+ isLibrary = true;
7+ isExecutable = true;
8+ libraryHaskellDepends = [ base system-filepath text ];
9+ executableHaskellDepends = [ base system-filepath text ];
10+ testHaskellDepends = [ base hspec system-filepath text ];
11+ homepage = "http://github.com/rampion/ReadArgs";
12+ description = "Simple command line argument parsing";
13+ license = stdenv.lib.licenses.bsd3;
14+}
test/golden-test-cases/SHA.cabalnew file+130
@@ -0,0 +1,130 @@
1+name: SHA
2+category: Cryptography, Codec
3+version: 1.6.4.2
4+license: BSD3
5+license-file: LICENSE
6+author: Adam Wick <awick@galois.com>, Brian Lewis <brian@lorf.org>
7+maintainer: Adam Wick <awick@galois.com>,
8+ Raphael Javaux <raphaeljavaux@gmail.com>
9+stability: stable
10+build-type: Simple
11+cabal-version: >= 1.8
12+tested-with: GHC == 7.6.1
13+synopsis: Implementations of the SHA suite of message digest functions
14+description: This library implements the SHA suite of message digest functions,
15+ according to NIST FIPS 180-2 (with the SHA-224 addendum), as well
16+ as the SHA-based HMAC routines. The functions have been tested
17+ against most of the NIST and RFC test vectors for the various
18+ functions. While some attention has been paid to performance,
19+ these do not presently reach the speed of well-tuned libraries,
20+ like OpenSSL.
21+
22+Flag exe
23+ Description: Build a sha executables similar to 'md5sum'.
24+ Default: False
25+
26+Library
27+ hs-source-dirs: src
28+ build-depends: array > 0 && < 10000,
29+ base >= 4 && < 6,
30+ binary >= 0.7 && < 10000,
31+ bytestring > 0.8 && < 10000
32+ exposed-modules: Data.Digest.Pure.SHA
33+ GHC-Options: -Wall -fno-ignore-asserts -fno-warn-orphans
34+ -funbox-strict-fields -fwarn-tabs
35+ extensions: BangPatterns
36+ if impl(ghc >= 6.12) && impl(ghc < 7.7)
37+ Ghc-Options: -fregs-graph
38+
39+test-suite test-sha
40+ type: exitcode-stdio-1.0
41+ hs-source-dirs: src
42+ main-is: Test.hs
43+ ghc-options: -Wall -fhpc
44+ build-depends: array > 0 && < 10000,
45+ base > 4.3 && < 7,
46+ binary >= 0.7 && < 10000,
47+ bytestring > 0.8 && < 10000,
48+ QuickCheck >= 2.5 && < 3,
49+ test-framework >= 0.8.0.3 && < 10000,
50+ test-framework-quickcheck2 >= 0.3.0.2 && < 10000
51+ extensions: BangPatterns, MultiParamTypeClasses, DeriveDataTypeable
52+ GHC-Options: -O2 -Wall -fno-ignore-asserts -fno-warn-orphans
53+ -funbox-strict-fields -fwarn-tabs
54+ cpp-options: -DSHA_TEST
55+ if impl(ghc >= 6.12)
56+ Ghc-Options: -fregs-graph
57+
58+Executable sha1
59+ if !flag(exe)
60+ buildable: False
61+ hs-source-dirs: src-bin
62+ build-depends: base >= 4 && < 6,
63+ bytestring > 0.8 && < 10000,
64+ directory > 0.0 && < 10000,
65+ SHA > 1.6 && < 10000
66+ Main-Is: Main.hs
67+ extensions: CPP
68+ GHC-Options: -O2 -Wall -fno-ignore-asserts -fno-warn-orphans
69+ -funbox-strict-fields -fwarn-tabs
70+ cpp-options: -DALGORITHM=sha1
71+
72+Executable sha224
73+ if !flag(exe)
74+ buildable: False
75+ hs-source-dirs: src-bin
76+ build-depends: base >= 4 && < 6,
77+ bytestring > 0.8 && < 10000,
78+ directory > 0.0 && < 10000,
79+ SHA > 1.6 && < 10000
80+ Main-Is: Main.hs
81+ extensions: CPP
82+ GHC-Options: -O2 -Wall -fno-ignore-asserts -fno-warn-orphans
83+ -funbox-strict-fields -fwarn-tabs
84+ cpp-options: -DALGORITHM=sha224
85+
86+Executable sha256
87+ if !flag(exe)
88+ buildable: False
89+ hs-source-dirs: src-bin
90+ build-depends: base >= 4 && < 6,
91+ bytestring > 0.8 && < 10000,
92+ directory > 0.0 && < 10000,
93+ SHA > 1.6 && < 10000
94+ Main-Is: Main.hs
95+ extensions: CPP
96+ GHC-Options: -O2 -Wall -fno-ignore-asserts -fno-warn-orphans
97+ -funbox-strict-fields -fwarn-tabs
98+ cpp-options: -DALGORITHM=sha256
99+
100+Executable sha384
101+ if !flag(exe)
102+ buildable: False
103+ hs-source-dirs: src-bin
104+ build-depends: base >= 4 && < 6,
105+ bytestring > 0.8 && < 10000,
106+ directory > 0.0 && < 10000,
107+ SHA > 1.6 && < 10000
108+ Main-Is: Main.hs
109+ extensions: CPP
110+ GHC-Options: -O2 -Wall -fno-ignore-asserts -fno-warn-orphans
111+ -funbox-strict-fields -fwarn-tabs
112+ cpp-options: -DALGORITHM=sha384
113+
114+Executable sha512
115+ if !flag(exe)
116+ buildable: False
117+ hs-source-dirs: src-bin
118+ build-depends: base >= 4 && < 6,
119+ bytestring > 0.8 && < 10000,
120+ directory > 0.0 && < 10000,
121+ SHA > 1.6 && < 10000
122+ Main-Is: Main.hs
123+ extensions: CPP
124+ GHC-Options: -O2 -Wall -fno-ignore-asserts -fno-warn-orphans
125+ -funbox-strict-fields -fwarn-tabs
126+ cpp-options: -DALGORITHM=sha512
127+
128+source-repository head
129+ type: git
130+ location: git://github.com/GaloisInc/SHA.git
test/golden-test-cases/SHA.nix.goldennew file+17
@@ -0,0 +1,17 @@
1+{ mkDerivation, array, base, binary, bytestring, QuickCheck, stdenv
2+, test-framework, test-framework-quickcheck2
3+}:
4+mkDerivation {
5+ pname = "SHA";
6+ version = "1.6.4.2";
7+ sha256 = "deadbeef";
8+ isLibrary = true;
9+ isExecutable = true;
10+ libraryHaskellDepends = [ array base binary bytestring ];
11+ testHaskellDepends = [
12+ array base binary bytestring QuickCheck test-framework
13+ test-framework-quickcheck2
14+ ];
15+ description = "Implementations of the SHA suite of message digest functions";
16+ license = stdenv.lib.licenses.bsd3;
17+}
test/golden-test-cases/Strafunski-StrategyLib.cabalnew file+59
@@ -0,0 +1,59 @@
1+name: Strafunski-StrategyLib
2+version: 5.0.0.10
3+synopsis: Library for strategic programming
4+description: This is a version of the StrategyLib library originally shipped with Strafunski, Cabalized and updated to newer versions of GHC. A description of much of StrategyLib can be found in the paper "Design Patterns for Functional Strategic Programming."
5+license: BSD3
6+license-file: LICENSE
7+author: Ralf Laemmel, Joost Visser
8+maintainer: darmanithird@gmail.com,alan.zimm@gmail.com
9+category: Generics
10+build-type: Simple
11+cabal-version: >=1.8
12+
13+source-repository head
14+ type: git
15+ location: https://github.com/jkoppel/Strafunski-StrategyLib
16+
17+
18+library
19+
20+ Extensions:
21+ OverlappingInstances,
22+ FlexibleInstances,
23+ FlexibleContexts,
24+ UndecidableInstances,
25+ MultiParamTypeClasses,
26+ FunctionalDependencies,
27+ Rank2Types
28+
29+ exposed-modules:
30+ Control.Monad.Run,
31+ Data.Generics.Strafunski.StrategyLib.ChaseImports,
32+ Data.Generics.Strafunski.StrategyLib.ContainerTheme,
33+ Data.Generics.Strafunski.StrategyLib.EffectTheme,
34+ Data.Generics.Strafunski.StrategyLib.FixpointTheme,
35+ Data.Generics.Strafunski.StrategyLib.FlowTheme,
36+ Data.Generics.Strafunski.StrategyLib.KeyholeTheme,
37+ Data.Generics.Strafunski.StrategyLib.MetricsTheme,
38+ Data.Generics.Strafunski.StrategyLib.MonadicFunctions,
39+ Data.Generics.Strafunski.StrategyLib.MoreMonoids,
40+ Data.Generics.Strafunski.StrategyLib.NameTheme,
41+ Data.Generics.Strafunski.StrategyLib.OverloadingTheme,
42+ Data.Generics.Strafunski.StrategyLib.PathTheme,
43+ Data.Generics.Strafunski.StrategyLib.RefactoringTheme,
44+ Data.Generics.Strafunski.StrategyLib.StrategyInfix,
45+ Data.Generics.Strafunski.StrategyLib.StrategyLib,
46+ Data.Generics.Strafunski.StrategyLib.StrategyPrelude,
47+ Data.Generics.Strafunski.StrategyLib.TraversalTheme,
48+ Data.Generics.Strafunski.StrategyLib.Models.Deriving.StrategyPrimitives,
49+ Data.Generics.Strafunski.StrategyLib.Models.Deriving.TermRep
50+
51+-- other-modules:
52+
53+ build-depends:
54+ base > 4.4 && < 4.10,
55+ mtl > 2.2,
56+ syb > 0.3 && < 4.1,
57+ directory > 1.1 && < 1.4,
58+ transformers >= 0.2
59+
test/golden-test-cases/Strafunski-StrategyLib.nix.goldennew file+9
@@ -0,0 +1,9 @@
1+{ mkDerivation, base, directory, mtl, stdenv, syb, transformers }:
2+mkDerivation {
3+ pname = "Strafunski-StrategyLib";
4+ version = "5.0.0.10";
5+ sha256 = "deadbeef";
6+ libraryHaskellDepends = [ base directory mtl syb transformers ];
7+ description = "Library for strategic programming";
8+ license = stdenv.lib.licenses.bsd3;
9+}
test/golden-test-cases/accelerate-fftw.cabalnew file+41
@@ -0,0 +1,41 @@
1+Name: accelerate-fftw
2+Version: 1.0
3+License: BSD3
4+License-File: LICENSE
5+Author: Henning Thielemann <haskell@henning-thielemann.de>
6+Maintainer: Henning Thielemann <haskell@henning-thielemann.de>
7+Homepage: http://hub.darcs.net/thielema/accelerate-fftw/
8+Category: Math
9+Synopsis: Accelerate frontend to the FFTW library (Fourier transform)
10+Description:
11+ An interface to the Fastest Fourier Transform in the West (FFTW)
12+ for the @accelerate@ framework.
13+Tested-With: GHC==7.8.3
14+Cabal-Version: >=1.14
15+Build-Type: Simple
16+
17+Source-Repository this
18+ Tag: 1.0
19+ Type: darcs
20+ Location: http://hub.darcs.net/thielema/accelerate-fftw/
21+
22+Source-Repository head
23+ Type: darcs
24+ Location: http://hub.darcs.net/thielema/accelerate-fftw/
25+
26+Library
27+ Build-Depends:
28+ fft >=0.1.7 && <0.2,
29+ carray >=0.1.5 && <0.2,
30+ storable-complex >=0.2.1 && <0.3,
31+ accelerate-io >=1.0 && <1.1,
32+ accelerate >=1.0 && <1.2,
33+ base >=4.5 && <4.11
34+
35+ GHC-Options: -Wall -fwarn-missing-import-lists
36+ Hs-Source-Dirs: src
37+ Default-Language: Haskell98
38+ Exposed-Modules:
39+ Data.Array.Accelerate.FFTW.Manifest
40+ Other-Modules:
41+ Data.Array.Accelerate.CArray.Conversion
test/golden-test-cases/accelerate-fftw.nix.goldennew file+14
@@ -0,0 +1,14 @@
1+{ mkDerivation, accelerate, accelerate-io, base, carray, fft
2+, stdenv, storable-complex
3+}:
4+mkDerivation {
5+ pname = "accelerate-fftw";
6+ version = "1.0";
7+ sha256 = "deadbeef";
8+ libraryHaskellDepends = [
9+ accelerate accelerate-io base carray fft storable-complex
10+ ];
11+ homepage = "http://hub.darcs.net/thielema/accelerate-fftw/";
12+ description = "Accelerate frontend to the FFTW library (Fourier transform)";
13+ license = stdenv.lib.licenses.bsd3;
14+}
test/golden-test-cases/accelerate.cabalnew file+412
@@ -0,0 +1,412 @@
1+Name: accelerate
2+Version: 1.1.1.0
3+Cabal-version: >= 1.8
4+Tested-with: GHC >= 7.8
5+Build-type: Simple
6+
7+Synopsis: An embedded language for accelerated array processing
8+
9+Description:
10+ @Data.Array.Accelerate@ defines an embedded array language for computations
11+ for high-performance computing in Haskell. Computations on multi-dimensional,
12+ regular arrays are expressed in the form of parameterised collective
13+ operations, such as maps, reductions, and permutations. These computations may
14+ then be online compiled and executed on a range of architectures.
15+ .
16+ [/A simple example/]
17+ .
18+ As a simple example, consider the computation of a dot product of two vectors
19+ of floating point numbers:
20+ .
21+ > dotp :: Acc (Vector Float) -> Acc (Vector Float) -> Acc (Scalar Float)
22+ > dotp xs ys = fold (+) 0 (zipWith (*) xs ys)
23+ .
24+ Except for the type, this code is almost the same as the corresponding Haskell
25+ code on lists of floats. The types indicate that the computation may be
26+ online-compiled for performance - for example, using
27+ @Data.Array.Accelerate.LLVM.PTX@ it may be on-the-fly off-loaded to the GPU.
28+ .
29+ [/Additional components/]
30+ .
31+ The following supported add-ons are available as separate packages. Install
32+ them from Hackage with @cabal install \<package\>@
33+ .
34+ * @accelerate-llvm-native@: Backend supporting parallel execution on
35+ multicore CPUs.
36+ .
37+ * @accelerate-llvm-ptx@: Backend supporting parallel execution on
38+ CUDA-capable NVIDIA GPUs. Requires a GPU with compute capability 2.0 or
39+ greater. See the following table for supported GPUs:
40+ <http://en.wikipedia.org/wiki/CUDA#Supported_GPUs>
41+ .
42+ * @accelerate-examples@: Computational kernels and applications showcasing
43+ the use of Accelerate as well as a regression test suite, supporting
44+ function and performance testing.
45+ .
46+ * @accelerate-io@: Fast conversions between Accelerate arrays and other
47+ array formats (including vector and repa).
48+ .
49+ * @accelerate-fft@: Discrete Fourier transforms, with FFI bindings to
50+ optimised implementations.
51+ .
52+ * @accelerate-bignum@: Fixed-width large integer arithmetic.
53+ .
54+ * @colour-accelerate@: Colour representations in Accelerate (RGB, sRGB, HSV,
55+ and HSL).
56+ .
57+ * @gloss-accelerate@: Generate gloss pictures from Accelerate.
58+ .
59+ * @gloss-raster-accelerate@: Parallel rendering of raster images and
60+ animations.
61+ .
62+ * @lens-accelerate@: Lens operators for Accelerate types.
63+ .
64+ * @linear-accelerate@: Linear vector spaces in Accelerate.
65+ .
66+ * @mwc-random-accelerate@: Generate Accelerate arrays filled with high
67+ quality pseudorandom numbers.
68+ .
69+ [/Examples and documentation/]
70+ .
71+ Haddock documentation is included in the package
72+ .
73+ The @accelerate-examples@ package demonstrates a range of computational
74+ kernels and several complete applications, including:
75+ .
76+ * An implementation of the Canny edge detection algorithm
77+ .
78+ * An interactive Mandelbrot set generator
79+ .
80+ * A particle-based simulation of stable fluid flows
81+ .
82+ * An /n/-body simulation of gravitational attraction between solid particles
83+ .
84+ * An implementation of the PageRank algorithm
85+ .
86+ * A simple interactive ray tracer
87+ .
88+ * A particle based simulation of stable fluid flows
89+ .
90+ * A cellular automata simulation
91+ .
92+ * A \"password recovery\" tool, for dictionary lookup of MD5 hashes
93+ .
94+ @lulesh-accelerate@ is an implementation of the Livermore Unstructured
95+ Lagrangian Explicit Shock Hydrodynamics (LULESH) mini-app. LULESH represents a
96+ typical hydrodynamics code such as ALE3D, but is highly simplified and
97+ hard-coded to solve the Sedov blast problem on an unstructured hexahedron
98+ mesh.
99+ .
100+ [/Mailing list and contacts/]
101+ .
102+ * Mailing list: <accelerate-haskell@googlegroups.com> (discussion of both
103+ use and development welcome).
104+ .
105+ * Sign up for the mailing list here:
106+ <http://groups.google.com/group/accelerate-haskell>
107+ .
108+ * Bug reports and issue tracking:
109+ <https://github.com/AccelerateHS/accelerate/issues>
110+ .
111+
112+License: BSD3
113+License-file: LICENSE
114+Author: Manuel M T Chakravarty,
115+ Robert Clifton-Everest,
116+ Gabriele Keller,
117+ Ben Lever,
118+ Trevor L. McDonell,
119+ Ryan Newtown,
120+ Sean Seefried
121+Maintainer: Trevor L. McDonell <tmcdonell@cse.unsw.edu.au>
122+Homepage: https://github.com/AccelerateHS/accelerate/
123+Bug-reports: https://github.com/AccelerateHS/accelerate/issues
124+
125+Category: Compilers/Interpreters, Concurrency, Data, Parallelism
126+Stability: Experimental
127+
128+Extra-source-files:
129+ README.md
130+ CHANGELOG.md
131+
132+Flag debug
133+ Default: False
134+ Description:
135+ Enable debug tracing messages. The following options are read from the
136+ environment variable @ACCELERATE_FLAGS@, and via the command-line as:
137+ .
138+ > ./program +ACC ... -ACC
139+ .
140+ Note that a backend may not implement (or be applicable to) all options.
141+ .
142+ The following flags control phases of the compiler. The are enabled with
143+ @-f\<flag\>@ and can be reveresed with @-fno-\<flag\>@:
144+ .
145+ * @acc-sharing@: Enable sharing recovery of array expressions (True).
146+ .
147+ * @exp-sharing@: Enable sharing recovery of scalar expressions (True).
148+ .
149+ * @fusion@: Enable array fusion (True).
150+ .
151+ * @simplify@: Enable program simplification phase (True).
152+ .
153+ * @flush-cache@: Clear any persistent caches on program startup (False).
154+ .
155+ * @force-recomp@: Force recompilation of array programs (False).
156+ .
157+ * @fast-math@: Allow algebraically equivalent transformations which may
158+ change floating point results (e.g., reassociate) (True).
159+ .
160+ The following options control debug message output, and are enabled with
161+ @-d\<flag\>@.
162+ .
163+ * @verbose@: Be extra chatty.
164+ .
165+ * @dump-phases@: Print timing information about each phase of the compiler.
166+ Enable GC stats (@+RTS -t@ or otherwise) for memory usage information.
167+ .
168+ * @dump-sharing@: Print information related to sharing recovery.
169+ .
170+ * @dump-simpl-stats@: Print statistics related to fusion & simplification.
171+ .
172+ * @dump-simpl-iterations@: Print a summary after each simplifier iteration.
173+ .
174+ * @dump-vectorisation@: Print information related to the vectoriser.
175+ .
176+ * @dump-dot@: Generate a representation of the program graph in Graphviz
177+ DOT format.
178+ .
179+ * @dump-simpl-dot@: Generate a more compact representation of the program
180+ graph in Graphviz DOT format. In particular, scalar expressions are
181+ elided.
182+ .
183+ * @dump-gc@: Print information related to the Accelerate garbage
184+ collector.
185+ .
186+ * @dump-gc-stats@: Print aggregate garbage collection information at the
187+ end of program execution.
188+ .
189+ * @dubug-cc@: Include debug symbols in the generated and compiled kernels.
190+ .
191+ * @dump-cc@: Print information related to kernel code
192+ generation/compilation. Print the generated code if @verbose@.
193+ .
194+ * @dump-ld@: Print information related to runtime linking.
195+ .
196+ * @dump-asm@: Print information related to kernel assembly. Print the
197+ assembled code if @verbose@.
198+ .
199+ * @dump-exec@: Print information related to program execution.
200+ .
201+ * @dump-sched@: Print information related to execution scheduling.
202+ .
203+
204+Flag ekg
205+ Default: False
206+ Description:
207+ Enable hooks for monitoring the running application using EKG. Implies
208+ @debug@ mode. In order to view the metrics, your application will need to
209+ call @Data.Array.Accelerate.Debug.beginMonitoring@ before running any
210+ Accelerate computations. This will launch the server on the local machine at
211+ port 8000.
212+ .
213+ Alternatively, if you wish to configure the EKG monitoring server you can
214+ initialise it like so:
215+ .
216+ > import Data.Array.Accelerate.Debug
217+ >
218+ > import System.Metrics
219+ > import System.Remote.Monitoring
220+ >
221+ > main :: IO ()
222+ > main = do
223+ > store <- initAccMetrics
224+ > registerGcMetrics store -- optional
225+ >
226+ > server <- forkServerWith store "localhost" 8000
227+ >
228+ > ...
229+ .
230+ Note that, as with any program utilising EKG, in order to collect Haskell GC
231+ statistics, you must either run the program with:
232+ .
233+ > +RTS -T -RTS
234+ .
235+ or compile it with:
236+ .
237+ > -with-rtsopts=-T
238+ .
239+
240+Flag bounds-checks
241+ Description: Enable bounds checking
242+ Default: True
243+
244+Flag unsafe-checks
245+ Description: Enable bounds checking in unsafe operations
246+ Default: False
247+
248+Flag internal-checks
249+ Description: Enable internal consistency checks
250+ Default: False
251+
252+Library
253+ Build-depends:
254+ base >= 4.7 && < 4.11
255+ , base-orphans >= 0.3
256+ , containers >= 0.3
257+ , deepseq >= 1.3
258+ , directory >= 1.0
259+ , exceptions >= 0.6
260+ , fclabels >= 2.0
261+ , filepath >= 1.0
262+ , ghc-prim
263+ , hashable >= 1.1
264+ , hashtables >= 1.0
265+ , mtl >= 2.0
266+ , ansi-wl-pprint >= 0.6
267+ , template-haskell
268+ , time >= 1.4
269+ , transformers >= 0.3
270+ , unique
271+ , unordered-containers >= 0.2
272+
273+ Exposed-modules:
274+ -- The core language and reference implementation
275+ Data.Array.Accelerate
276+ Data.Array.Accelerate.Interpreter
277+
278+ -- Prelude-like
279+ Data.Array.Accelerate.Data.Bits
280+ Data.Array.Accelerate.Data.Complex
281+ Data.Array.Accelerate.Data.Fold
282+ Data.Array.Accelerate.Data.Monoid
283+
284+ -- For backend development
285+ Data.Array.Accelerate.AST
286+ Data.Array.Accelerate.Analysis.Hash
287+ Data.Array.Accelerate.Analysis.Match
288+ Data.Array.Accelerate.Analysis.Shape
289+ Data.Array.Accelerate.Analysis.Stencil
290+ Data.Array.Accelerate.Analysis.Type
291+ Data.Array.Accelerate.Array.Data
292+ Data.Array.Accelerate.Array.Remote
293+ Data.Array.Accelerate.Array.Remote.Class
294+ Data.Array.Accelerate.Array.Remote.LRU
295+ Data.Array.Accelerate.Array.Remote.Table
296+ Data.Array.Accelerate.Array.Representation
297+ Data.Array.Accelerate.Array.Sugar
298+ Data.Array.Accelerate.Array.Unique
299+ Data.Array.Accelerate.Async
300+ Data.Array.Accelerate.Debug
301+ Data.Array.Accelerate.Error
302+ Data.Array.Accelerate.FullList
303+ Data.Array.Accelerate.Lifetime
304+ Data.Array.Accelerate.Pretty
305+ Data.Array.Accelerate.Product
306+ Data.Array.Accelerate.Smart
307+ Data.Array.Accelerate.Trafo
308+ Data.Array.Accelerate.Type
309+
310+ Other-modules:
311+ Data.Atomic
312+ Data.Array.Accelerate.Analysis.Hash.TH
313+ Data.Array.Accelerate.Array.Lifted
314+ Data.Array.Accelerate.Array.Remote.Nursery
315+ Data.Array.Accelerate.Classes
316+ Data.Array.Accelerate.Classes.Bounded
317+ Data.Array.Accelerate.Classes.Enum
318+ Data.Array.Accelerate.Classes.Eq
319+ Data.Array.Accelerate.Classes.Floating
320+ Data.Array.Accelerate.Classes.Fractional
321+ Data.Array.Accelerate.Classes.FromIntegral
322+ Data.Array.Accelerate.Classes.Integral
323+ Data.Array.Accelerate.Classes.Num
324+ Data.Array.Accelerate.Classes.Ord
325+ Data.Array.Accelerate.Classes.Real
326+ Data.Array.Accelerate.Classes.RealFloat
327+ Data.Array.Accelerate.Classes.RealFrac
328+ Data.Array.Accelerate.Classes.ToFloating
329+ Data.Array.Accelerate.Debug.Flags
330+ Data.Array.Accelerate.Debug.Monitoring
331+ Data.Array.Accelerate.Debug.Stats
332+ Data.Array.Accelerate.Debug.Timed
333+ Data.Array.Accelerate.Debug.Trace
334+ Data.Array.Accelerate.Language
335+ Data.Array.Accelerate.Lift
336+ Data.Array.Accelerate.Prelude
337+ Data.Array.Accelerate.Pretty.Graphviz
338+ Data.Array.Accelerate.Pretty.Graphviz.Monad
339+ Data.Array.Accelerate.Pretty.Graphviz.Type
340+ Data.Array.Accelerate.Pretty.Print
341+ Data.Array.Accelerate.Trafo.Algebra
342+ Data.Array.Accelerate.Trafo.Base
343+ Data.Array.Accelerate.Trafo.Fusion
344+ Data.Array.Accelerate.Trafo.Rewrite
345+ Data.Array.Accelerate.Trafo.Sharing
346+ Data.Array.Accelerate.Trafo.Shrink
347+ Data.Array.Accelerate.Trafo.Simplify
348+ Data.Array.Accelerate.Trafo.Substitution
349+ -- Data.Array.Accelerate.Trafo.Vectorise
350+
351+ c-sources: cbits/atomic.c
352+
353+ if flag(debug) || flag(ekg)
354+ cpp-options: -DACCELERATE_DEBUG
355+
356+ if flag(ekg)
357+ cpp-options: -DACCELERATE_MONITORING
358+ build-depends:
359+ async >= 2.0
360+ , ekg >= 0.1
361+ , ekg-core >= 0.1
362+ , text >= 1.0
363+ , time >= 1.4
364+
365+ if flag(bounds-checks)
366+ cpp-options: -DACCELERATE_BOUNDS_CHECKS
367+
368+ if flag(unsafe-checks)
369+ cpp-options: -DACCELERATE_UNSAFE_CHECKS
370+
371+ if flag(internal-checks)
372+ cpp-options: -DACCELERATE_INTERNAL_CHECKS
373+
374+ if os(windows)
375+ cpp-options: -DWIN32
376+ build-depends: Win32
377+ else
378+ cpp-options: -DUNIX
379+ build-depends: unix
380+
381+ ghc-options: -O2 -Wall -funbox-strict-fields -fno-warn-name-shadowing
382+ ghc-prof-options: -caf-all -auto-all
383+
384+ if impl(ghc >= 7.0)
385+ ghc-options: -fspec-constr-count=25
386+
387+ if impl(ghc == 7.*)
388+ ghc-options: -fcontext-stack=35
389+
390+ if impl(ghc >= 8.0)
391+ ghc-options: -freduction-depth=35
392+
393+ if impl(ghc < 7.10)
394+ build-depends:
395+ th-lift-instances >= 0.1
396+
397+ -- Don't add the extensions list here. Instead, place individual LANGUAGE
398+ -- pragmas in the files that require a specific extension. This means the
399+ -- project loads in GHCi, and avoids extension clashes.
400+ --
401+ -- Extensions:
402+
403+source-repository head
404+ Type: git
405+ Location: git://github.com/AccelerateHS/accelerate.git
406+
407+source-repository this
408+ Type: git
409+ Tag: 1.1.1.0
410+ Location: git://github.com/AccelerateHS/accelerate.git
411+
412+-- vim: nospell
test/golden-test-cases/accelerate.nix.goldennew file+18
@@ -0,0 +1,18 @@
1+{ mkDerivation, ansi-wl-pprint, base, base-orphans, containers
2+, deepseq, directory, exceptions, fclabels, filepath, ghc-prim
3+, hashable, hashtables, mtl, stdenv, template-haskell, time
4+, transformers, unique, unix, unordered-containers
5+}:
6+mkDerivation {
7+ pname = "accelerate";
8+ version = "1.1.1.0";
9+ sha256 = "deadbeef";
10+ libraryHaskellDepends = [
11+ ansi-wl-pprint base base-orphans containers deepseq directory
12+ exceptions fclabels filepath ghc-prim hashable hashtables mtl
13+ template-haskell time transformers unique unix unordered-containers
14+ ];
15+ homepage = "https://github.com/AccelerateHS/accelerate/";
16+ description = "An embedded language for accelerated array processing";
17+ license = stdenv.lib.licenses.bsd3;
18+}
test/golden-test-cases/active.cabalnew file+44
@@ -0,0 +1,44 @@
1+name: active
2+version: 0.2.0.13
3+synopsis: Abstractions for animation
4+description: "Active" abstraction for animated things with finite start and end times.
5+license: BSD3
6+license-file: LICENSE
7+author: Brent Yorgey
8+maintainer: byorgey@gmail.com
9+copyright: (c) 2011-2015 Brent Yorgey
10+category: Data
11+build-type: Simple
12+cabal-version: >=1.10
13+extra-source-files: CHANGES, README.markdown, diagrams/*.svg
14+extra-doc-files: diagrams/*.svg
15+tested-with: GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.2, GHC == 8.0.1
16+bug-reports: https://github.com/diagrams/active/issues
17+source-repository head
18+ type: git
19+ location: https://github.com/diagrams/active.git
20+
21+library
22+ exposed-modules: Data.Active
23+ build-depends: base >= 4.0 && < 4.11,
24+ vector >= 0.10,
25+ semigroups >= 0.1 && < 0.19,
26+ semigroupoids >= 1.2 && < 5.3,
27+ lens >= 4.0 && < 4.16,
28+ linear >= 1.14 && < 1.21
29+ hs-source-dirs: src
30+ default-language: Haskell2010
31+
32+test-suite active-tests
33+ type: exitcode-stdio-1.0
34+ main-is: active-tests.hs
35+ build-depends: base >= 4.0 && < 4.10,
36+ vector >= 0.10,
37+ semigroups >= 0.1 && < 0.19,
38+ semigroupoids >= 1.2 && < 5.3,
39+ lens >= 4.0 && < 4.16,
40+ linear >= 1.14 && < 1.21,
41+ QuickCheck >= 2.9 && < 2.10
42+ other-modules: Data.Active
43+ hs-source-dirs: src, test
44+ default-language: Haskell2010
test/golden-test-cases/active.nix.goldennew file+16
@@ -0,0 +1,16 @@
1+{ mkDerivation, base, lens, linear, QuickCheck, semigroupoids
2+, semigroups, stdenv, vector
3+}:
4+mkDerivation {
5+ pname = "active";
6+ version = "0.2.0.13";
7+ sha256 = "deadbeef";
8+ libraryHaskellDepends = [
9+ base lens linear semigroupoids semigroups vector
10+ ];
11+ testHaskellDepends = [
12+ base lens linear QuickCheck semigroupoids semigroups vector
13+ ];
14+ description = "Abstractions for animation";
15+ license = stdenv.lib.licenses.bsd3;
16+}
test/golden-test-cases/adjunctions.cabalnew file+72
@@ -0,0 +1,72 @@
1+name: adjunctions
2+category: Data Structures, Adjunctions
3+version: 4.3
4+license: BSD3
5+cabal-version: >= 1.6
6+license-file: LICENSE
7+author: Edward A. Kmett
8+maintainer: Edward A. Kmett <ekmett@gmail.com>
9+stability: provisional
10+homepage: http://github.com/ekmett/adjunctions/
11+bug-reports: http://github.com/ekmett/adjunctions/issues
12+copyright: Copyright (C) 2011-2014 Edward A. Kmett
13+synopsis: Adjunctions and representable functors
14+description: Adjunctions and representable functors
15+build-type: Simple
16+extra-source-files:
17+ .ghci
18+ .gitignore
19+ .travis.yml
20+ .vim.custom
21+ travis/cabal-apt-install
22+ travis/config
23+ HLint.hs
24+ CHANGELOG.markdown
25+ README.markdown
26+
27+source-repository head
28+ type: git
29+ location: git://github.com/ekmett/adjunctions.git
30+
31+library
32+ hs-source-dirs: src
33+
34+ other-extensions:
35+ CPP
36+ FunctionalDependencies
37+ FlexibleContexts
38+ MultiParamTypeClasses
39+ Rank2Types
40+ UndecidableInstances
41+
42+ build-depends:
43+ array >= 0.3.0.2 && < 0.7,
44+ base >= 4 && < 5,
45+ comonad >= 4 && < 6,
46+ containers >= 0.3 && < 0.6,
47+ contravariant >= 1 && < 2,
48+ distributive >= 0.4 && < 1,
49+ free >= 4 && < 5,
50+ mtl >= 2.0.1 && < 2.3,
51+ profunctors >= 4 && < 6,
52+ tagged >= 0.7 && < 1,
53+ semigroupoids >= 4 && < 6,
54+ semigroups >= 0.11 && < 1,
55+ transformers >= 0.2 && < 0.6,
56+ transformers-compat >= 0.3 && < 1,
57+ void >= 0.5.5.1 && < 1
58+
59+ exposed-modules:
60+ Control.Comonad.Representable.Store
61+ Control.Comonad.Trans.Adjoint
62+ Control.Monad.Representable.Reader
63+ Control.Monad.Representable.State
64+ Control.Monad.Trans.Adjoint
65+ Control.Monad.Trans.Contravariant.Adjoint
66+ Control.Monad.Trans.Conts
67+ Data.Functor.Adjunction
68+ Data.Functor.Contravariant.Adjunction
69+ Data.Functor.Contravariant.Rep
70+ Data.Functor.Rep
71+
72+ ghc-options: -Wall
test/golden-test-cases/adjunctions.nix.goldennew file+17
@@ -0,0 +1,17 @@
1+{ mkDerivation, array, base, comonad, containers, contravariant
2+, distributive, free, mtl, profunctors, semigroupoids, semigroups
3+, stdenv, tagged, transformers, transformers-compat, void
4+}:
5+mkDerivation {
6+ pname = "adjunctions";
7+ version = "4.3";
8+ sha256 = "deadbeef";
9+ libraryHaskellDepends = [
10+ array base comonad containers contravariant distributive free mtl
11+ profunctors semigroupoids semigroups tagged transformers
12+ transformers-compat void
13+ ];
14+ homepage = "http://github.com/ekmett/adjunctions/";
15+ description = "Adjunctions and representable functors";
16+ license = stdenv.lib.licenses.bsd3;
17+}
test/golden-test-cases/aeson-diff.cabalnew file+118
@@ -0,0 +1,118 @@
1+name: aeson-diff
2+version: 1.1.0.4
3+synopsis: Extract and apply patches to JSON documents.
4+description:
5+ .
6+ This is a small library for working with changes to JSON documents. It
7+ includes a library and two command-line executables in the style of the
8+ diff(1) and patch(1) commands available on many systems.
9+ .
10+homepage: https://github.com/thsutton/aeson-diff
11+license: BSD3
12+license-file: LICENSE
13+author: Thomas Sutton
14+maintainer: me@thomas-sutton.id.au
15+copyright: (c) 2015 Thomas Sutton and others.
16+category: JSON, Web, Algorithms
17+build-type: Simple
18+cabal-version: >=1.10
19+extra-source-files: README.md
20+ , CHANGELOG.md
21+ , stack.yaml
22+ , test/data/rfc6902/*.json
23+ , test/data/rfc6902/*.txt
24+ , test/data/cases/*.json
25+ , test/data/cases/*.txt
26+
27+source-repository HEAD
28+ type: git
29+ location: https://github.com/thsutton/aeson-diff
30+
31+library
32+ default-language: Haskell2010
33+ hs-source-dirs: lib
34+ exposed-modules: Data.Aeson.Diff
35+ , Data.Aeson.Patch
36+ , Data.Aeson.Pointer
37+ build-depends: base >=4.5 && <4.11
38+ , aeson
39+ , bytestring >= 0.10
40+ , edit-distance-vector
41+ , hashable
42+ , mtl
43+ , scientific
44+ , text
45+ , unordered-containers
46+ , vector
47+
48+executable json-diff
49+ default-language: Haskell2010
50+ hs-source-dirs: src
51+ main-is: diff.hs
52+ build-depends: base
53+ , aeson
54+ , aeson-diff
55+ , bytestring
56+ , optparse-applicative
57+ , text
58+
59+executable json-patch
60+ default-language: Haskell2010
61+ hs-source-dirs: src
62+ main-is: patch.hs
63+ build-depends: base
64+ , aeson
65+ , aeson-diff
66+ , bytestring
67+ , optparse-applicative
68+
69+test-suite properties
70+ default-language: Haskell2010
71+ type: exitcode-stdio-1.0
72+ hs-source-dirs: test
73+ main-is: properties.hs
74+ build-depends: base
75+ , QuickCheck
76+ , aeson
77+ , aeson-diff
78+ , bytestring
79+ , quickcheck-instances
80+ , text
81+ , unordered-containers
82+ , vector
83+
84+test-suite examples
85+ default-language: Haskell2010
86+ type: exitcode-stdio-1.0
87+ hs-source-dirs: test
88+ main-is: examples.hs
89+ build-depends: base
90+ , Glob
91+ , QuickCheck
92+ , aeson
93+ , aeson-diff
94+ , bytestring
95+ , directory
96+ , filepath
97+ , quickcheck-instances
98+ , text
99+ , unordered-containers
100+ , vector
101+
102+test-suite doctests
103+ default-language: Haskell2010
104+ hs-source-dirs: test
105+ type: exitcode-stdio-1.0
106+ ghc-options: -threaded
107+ main-is: doctests.hs
108+ build-depends: base
109+ , QuickCheck
110+ , doctest >= 0.9
111+
112+test-suite hlint-check
113+ default-language: Haskell2010
114+ type: exitcode-stdio-1.0
115+ hs-source-dirs: test
116+ main-is: hlint-check.hs
117+ build-depends: base
118+ , hlint
test/golden-test-cases/aeson-diff.nix.goldennew file+26
@@ -0,0 +1,26 @@
1+{ mkDerivation, aeson, base, bytestring, directory, doctest
2+, edit-distance-vector, filepath, Glob, hashable, hlint, mtl
3+, optparse-applicative, QuickCheck, quickcheck-instances
4+, scientific, stdenv, text, unordered-containers, vector
5+}:
6+mkDerivation {
7+ pname = "aeson-diff";
8+ version = "1.1.0.4";
9+ sha256 = "deadbeef";
10+ isLibrary = true;
11+ isExecutable = true;
12+ libraryHaskellDepends = [
13+ aeson base bytestring edit-distance-vector hashable mtl scientific
14+ text unordered-containers vector
15+ ];
16+ executableHaskellDepends = [
17+ aeson base bytestring optparse-applicative text
18+ ];
19+ testHaskellDepends = [
20+ aeson base bytestring directory doctest filepath Glob hlint
21+ QuickCheck quickcheck-instances text unordered-containers vector
22+ ];
23+ homepage = "https://github.com/thsutton/aeson-diff";
24+ description = "Extract and apply patches to JSON documents";
25+ license = stdenv.lib.licenses.bsd3;
26+}
test/golden-test-cases/aeson-pretty.cabalnew file+74
@@ -0,0 +1,74 @@
1+name: aeson-pretty
2+version: 0.8.5
3+license: BSD3
4+license-file: LICENSE
5+category: Text, Web, JSON, Pretty Printer
6+copyright: Copyright 2011 Falko Peters
7+author: Falko Peters <falko.peters@gmail.com>
8+maintainer: Falko Peters <falko.peters@gmail.com>
9+stability: experimental
10+cabal-version: >= 1.8
11+homepage: http://github.com/informatikr/aeson-pretty
12+bug-reports: http://github.com/informatikr/aeson-pretty/issues
13+build-type: Simple
14+synopsis: JSON pretty-printing library and command-line tool.
15+description:
16+ A JSON pretty-printing library compatible with aeson as well as
17+ a command-line tool to improve readabilty of streams of JSON data.
18+ .
19+ The /library/ provides the function "encodePretty". It is a drop-in
20+ replacement for aeson's "encode" function, producing JSON-ByteStrings for
21+ human readers.
22+ .
23+ The /command-line tool/ reads JSON from stdin and writes prettified JSON
24+ to stdout. It also offers a complementary "compact"-mode, essentially the
25+ opposite of pretty-printing. If you specify @-flib-only@ like this
26+ .
27+ > cabal install -flib-only aeson-pretty
28+ .
29+ the command-line tool will NOT be installed.
30+
31+extra-source-files:
32+ README.markdown
33+
34+flag lib-only
35+ description: Only build/install the library, NOT the command-line tool.
36+ default: False
37+
38+library
39+ exposed-modules:
40+ Data.Aeson.Encode.Pretty
41+
42+ build-depends:
43+ aeson >= 0.7,
44+ base >= 4.5,
45+ base-compat >= 0.9 && < 0.10,
46+ bytestring >= 0.9,
47+ scientific >= 0.3,
48+ vector >= 0.9,
49+ text >= 0.11,
50+ unordered-containers >= 0.1.3.0
51+
52+ ghc-options: -Wall
53+
54+executable aeson-pretty
55+ hs-source-dirs: cli-tool
56+ main-is: Main.hs
57+
58+ if flag(lib-only)
59+ buildable: False
60+ else
61+ build-depends:
62+ aeson >= 0.6,
63+ aeson-pretty,
64+ attoparsec >= 0.10,
65+ base == 4.*,
66+ bytestring >= 0.9,
67+ cmdargs >= 0.7
68+
69+ ghc-options: -Wall
70+ ghc-prof-options: -auto-all
71+
72+source-repository head
73+ type: git
74+ location: http://github.com/informatikr/aeson-pretty
test/golden-test-cases/aeson-pretty.nix.goldennew file+20
@@ -0,0 +1,20 @@
1+{ mkDerivation, aeson, attoparsec, base, base-compat, bytestring
2+, cmdargs, scientific, stdenv, text, unordered-containers, vector
3+}:
4+mkDerivation {
5+ pname = "aeson-pretty";
6+ version = "0.8.5";
7+ sha256 = "deadbeef";
8+ isLibrary = true;
9+ isExecutable = true;
10+ libraryHaskellDepends = [
11+ aeson base base-compat bytestring scientific text
12+ unordered-containers vector
13+ ];
14+ executableHaskellDepends = [
15+ aeson attoparsec base bytestring cmdargs
16+ ];
17+ homepage = "http://github.com/informatikr/aeson-pretty";
18+ description = "JSON pretty-printing library and command-line tool";
19+ license = stdenv.lib.licenses.bsd3;
20+}
test/golden-test-cases/algebraic-graphs.cabalnew file+142
@@ -0,0 +1,142 @@
1+name: algebraic-graphs
2+version: 0.0.5
3+synopsis: A library for algebraic graph construction and transformation
4+license: MIT
5+license-file: LICENSE
6+author: Andrey Mokhov <andrey.mokhov@gmail.com>, github: @snowleopard
7+maintainer: Andrey Mokhov <andrey.mokhov@gmail.com>, github: @snowleopard
8+copyright: Andrey Mokhov, 2016-2017
9+homepage: https://github.com/snowleopard/alga
10+category: Algebra, Algorithms, Data Structures, Graphs
11+build-type: Simple
12+cabal-version: >=1.18
13+tested-with: GHC==8.0.2
14+stability: experimental
15+description:
16+ <https://github.com/snowleopard/alga Alga> is a library for algebraic construction and
17+ manipulation of graphs in Haskell. See <https://github.com/snowleopard/alga-paper this paper>
18+ for the motivation behind the library, the underlying theory and implementation details.
19+ .
20+ The top-level module
21+ <http://hackage.haskell.org/package/algebraic-graphs/docs/Algebra-Graph.html Algebra.Graph>
22+ defines the core data type
23+ <http://hackage.haskell.org/package/algebraic-graphs/docs/Algebra-Graph.html#t:Graph Graph>,
24+ which is a deep embedding of four graph construction primitives /empty/,
25+ /vertex/, /overlay/ and /connect/. More conventional graph representations can be found in
26+ <http://hackage.haskell.org/package/algebraic-graphs/docs/Algebra-Graph-AdjacencyMap.html Algebra.Graph.AdjacencyMap>
27+ and
28+ <http://hackage.haskell.org/package/algebraic-graphs/docs/Algebra-Graph-Relation.html Algebra.Graph.Relation>.
29+ .
30+ The type classes defined in
31+ <http://hackage.haskell.org/package/algebraic-graphs/docs/Algebra-Graph-Class.html Algebra.Graph.Class>
32+ and
33+ <http://hackage.haskell.org/package/algebraic-graphs/docs/Algebra-Graph-HigherKinded-Class.html Algebra.Graph.HigherKinded.Class>
34+ can be used for polymorphic graph construction and manipulation. Also see
35+ <http://hackage.haskell.org/package/algebraic-graphs/docs/Algebra-Graph-Fold.html Algebra.Graph.Fold>
36+ that defines the Boehm-Berarducci encoding of algebraic graphs and provides additional
37+ flexibility for polymorphic graph manipulation.
38+ .
39+ This is an experimental library and the API will be unstable until version 1.0.0. Please
40+ consider contributing to the on-going
41+ <https://github.com/snowleopard/alga/issues discussions on the library API>.
42+
43+extra-doc-files:
44+ CHANGES.md
45+ README.md
46+
47+source-repository head
48+ type: git
49+ location: https://github.com/snowleopard/alga.git
50+
51+library
52+ hs-source-dirs: src
53+ exposed-modules: Algebra.Graph,
54+ Algebra.Graph.AdjacencyMap,
55+ Algebra.Graph.AdjacencyMap.Internal,
56+ Algebra.Graph.Class,
57+ Algebra.Graph.Export,
58+ Algebra.Graph.Export.Dot,
59+ Algebra.Graph.Fold,
60+ Algebra.Graph.HigherKinded.Class,
61+ Algebra.Graph.IntAdjacencyMap,
62+ Algebra.Graph.IntAdjacencyMap.Internal,
63+ Algebra.Graph.Relation,
64+ Algebra.Graph.Relation.Internal,
65+ Algebra.Graph.Relation.InternalDerived,
66+ Algebra.Graph.Relation.Preorder,
67+ Algebra.Graph.Relation.Reflexive,
68+ Algebra.Graph.Relation.Symmetric,
69+ Algebra.Graph.Relation.Transitive
70+ build-depends: array >= 0.5 && < 0.8,
71+ base >= 4.9 && < 5,
72+ containers >= 0.5 && < 0.8
73+ default-language: Haskell2010
74+ default-extensions: FlexibleContexts
75+ GeneralizedNewtypeDeriving
76+ ScopedTypeVariables
77+ TupleSections
78+ TypeFamilies
79+ other-extensions: DeriveFoldable
80+ DeriveFunctor
81+ DeriveTraversable
82+ OverloadedStrings
83+ RecordWildCards
84+ GHC-options: -Wall
85+ -Wcompat
86+ -Wincomplete-record-updates
87+ -Wincomplete-uni-patterns
88+ -Wredundant-constraints
89+
90+test-suite test-alga
91+ hs-source-dirs: test
92+ type: exitcode-stdio-1.0
93+ main-is: Main.hs
94+ other-modules: Algebra.Graph.Test,
95+ Algebra.Graph.Test.API,
96+ Algebra.Graph.Test.AdjacencyMap,
97+ Algebra.Graph.Test.Arbitrary,
98+ Algebra.Graph.Test.Export,
99+ Algebra.Graph.Test.Fold,
100+ Algebra.Graph.Test.Generic,
101+ Algebra.Graph.Test.Graph,
102+ Algebra.Graph.Test.IntAdjacencyMap,
103+ Algebra.Graph.Test.Relation
104+ build-depends: algebraic-graphs,
105+ base >= 4.9,
106+ containers >= 0.5,
107+ extra >= 1.5,
108+ QuickCheck >= 2.9
109+ default-language: Haskell2010
110+ GHC-options: -O2
111+ -Wall
112+ -Wcompat
113+ -Wincomplete-record-updates
114+ -Wincomplete-uni-patterns
115+ -Wredundant-constraints
116+ default-extensions: FlexibleContexts
117+ GeneralizedNewtypeDeriving
118+ TypeFamilies
119+ ScopedTypeVariables
120+ other-extensions: ConstrainedClassMethods
121+ ConstraintKinds
122+ RankNTypes
123+ ViewPatterns
124+
125+benchmark benchmark-alga
126+ hs-source-dirs: bench
127+ type: exitcode-stdio-1.0
128+ main-is: Bench.hs
129+ build-depends: algebraic-graphs,
130+ base >= 4.9,
131+ containers >= 0.5,
132+ criterion >= 1.1
133+ default-language: Haskell2010
134+ GHC-options: -O2
135+ -Wall
136+ -Wcompat
137+ -Wincomplete-record-updates
138+ -Wincomplete-uni-patterns
139+ -Wredundant-constraints
140+ default-extensions: FlexibleContexts
141+ TypeFamilies
142+ ScopedTypeVariables
test/golden-test-cases/algebraic-graphs.nix.goldennew file+14
@@ -0,0 +1,14 @@
1+{ mkDerivation, array, base, containers, criterion, extra
2+, QuickCheck, stdenv
3+}:
4+mkDerivation {
5+ pname = "algebraic-graphs";
6+ version = "0.0.5";
7+ sha256 = "deadbeef";
8+ libraryHaskellDepends = [ array base containers ];
9+ testHaskellDepends = [ base containers extra QuickCheck ];
10+ benchmarkHaskellDepends = [ base containers criterion ];
11+ homepage = "https://github.com/snowleopard/alga";
12+ description = "A library for algebraic graph construction and transformation";
13+ license = stdenv.lib.licenses.mit;
14+}
test/golden-test-cases/amazonka-cloudtrail.cabalnew file+99
@@ -0,0 +1,99 @@
1+name: amazonka-cloudtrail
2+version: 1.5.0
3+synopsis: Amazon CloudTrail SDK.
4+homepage: https://github.com/brendanhay/amazonka
5+bug-reports: https://github.com/brendanhay/amazonka/issues
6+license: MPL-2.0
7+license-file: LICENSE
8+author: Brendan Hay
9+maintainer: Brendan Hay <brendan.g.hay+amazonka@gmail.com>
10+copyright: Copyright (c) 2013-2017 Brendan Hay
11+category: Network, AWS, Cloud, Distributed Computing
12+build-type: Simple
13+cabal-version: >= 1.10
14+extra-source-files: README.md fixture/*.yaml fixture/*.proto src/.gitkeep
15+description:
16+ The types from this library are intended to be used with
17+ <http://hackage.haskell.org/package/amazonka amazonka>, which provides
18+ mechanisms for specifying AuthN/AuthZ information, sending requests,
19+ and receiving responses.
20+ .
21+ Lenses are used for constructing and manipulating types,
22+ due to the depth of nesting of AWS types and transparency regarding
23+ de/serialisation into more palatable Haskell values.
24+ The provided lenses should be compatible with any of the major lens libraries
25+ such as <http://hackage.haskell.org/package/lens lens> or
26+ <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
27+ .
28+ See "Network.AWS.CloudTrail" or <https://aws.amazon.com/documentation/ the AWS documentation>
29+ to get started.
30+
31+source-repository head
32+ type: git
33+ location: git://github.com/brendanhay/amazonka.git
34+ subdir: amazonka-cloudtrail
35+
36+library
37+ default-language: Haskell2010
38+ hs-source-dirs: src gen
39+
40+ ghc-options:
41+ -Wall
42+ -fwarn-incomplete-uni-patterns
43+ -fwarn-incomplete-record-updates
44+ -funbox-strict-fields
45+
46+ exposed-modules:
47+ Network.AWS.CloudTrail
48+ , Network.AWS.CloudTrail.AddTags
49+ , Network.AWS.CloudTrail.CreateTrail
50+ , Network.AWS.CloudTrail.DeleteTrail
51+ , Network.AWS.CloudTrail.DescribeTrails
52+ , Network.AWS.CloudTrail.GetEventSelectors
53+ , Network.AWS.CloudTrail.GetTrailStatus
54+ , Network.AWS.CloudTrail.ListPublicKeys
55+ , Network.AWS.CloudTrail.ListTags
56+ , Network.AWS.CloudTrail.LookupEvents
57+ , Network.AWS.CloudTrail.PutEventSelectors
58+ , Network.AWS.CloudTrail.RemoveTags
59+ , Network.AWS.CloudTrail.StartLogging
60+ , Network.AWS.CloudTrail.StopLogging
61+ , Network.AWS.CloudTrail.Types
62+ , Network.AWS.CloudTrail.UpdateTrail
63+ , Network.AWS.CloudTrail.Waiters
64+
65+ other-modules:
66+ Network.AWS.CloudTrail.Types.Product
67+ , Network.AWS.CloudTrail.Types.Sum
68+
69+ build-depends:
70+ amazonka-core == 1.5.0.*
71+ , base >= 4.7 && < 5
72+
73+test-suite amazonka-cloudtrail-test
74+ type: exitcode-stdio-1.0
75+ default-language: Haskell2010
76+ hs-source-dirs: test
77+ main-is: Main.hs
78+
79+ ghc-options: -Wall -threaded
80+
81+ -- This section is encoded by the template and any modules added by
82+ -- hand outside these namespaces will not correctly be added to the
83+ -- distribution package.
84+ other-modules:
85+ Test.AWS.CloudTrail
86+ , Test.AWS.Gen.CloudTrail
87+ , Test.AWS.CloudTrail.Internal
88+
89+ build-depends:
90+ amazonka-core == 1.5.0.*
91+ , amazonka-test == 1.5.0.*
92+ , amazonka-cloudtrail
93+ , base
94+ , bytestring
95+ , tasty
96+ , tasty-hunit
97+ , text
98+ , time
99+ , unordered-containers
test/golden-test-cases/amazonka-cloudtrail.nix.goldennew file+16
@@ -0,0 +1,16 @@
1+{ mkDerivation, amazonka-core, amazonka-test, base, bytestring
2+, stdenv, tasty, tasty-hunit, text, time, unordered-containers
3+}:
4+mkDerivation {
5+ pname = "amazonka-cloudtrail";
6+ version = "1.5.0";
7+ sha256 = "deadbeef";
8+ libraryHaskellDepends = [ amazonka-core base ];
9+ testHaskellDepends = [
10+ amazonka-core amazonka-test base bytestring tasty tasty-hunit text
11+ time unordered-containers
12+ ];
13+ homepage = "https://github.com/brendanhay/amazonka";
14+ description = "Amazon CloudTrail SDK";
15+ license = stdenv.lib.licenses.mpl20;
16+}
test/golden-test-cases/amazonka-cloudwatch-logs.cabalnew file+118
@@ -0,0 +1,118 @@
1+name: amazonka-cloudwatch-logs
2+version: 1.5.0
3+synopsis: Amazon CloudWatch Logs SDK.
4+homepage: https://github.com/brendanhay/amazonka
5+bug-reports: https://github.com/brendanhay/amazonka/issues
6+license: MPL-2.0
7+license-file: LICENSE
8+author: Brendan Hay
9+maintainer: Brendan Hay <brendan.g.hay+amazonka@gmail.com>
10+copyright: Copyright (c) 2013-2017 Brendan Hay
11+category: Network, AWS, Cloud, Distributed Computing
12+build-type: Simple
13+cabal-version: >= 1.10
14+extra-source-files: README.md fixture/*.yaml fixture/*.proto src/.gitkeep
15+description:
16+ The types from this library are intended to be used with
17+ <http://hackage.haskell.org/package/amazonka amazonka>, which provides
18+ mechanisms for specifying AuthN/AuthZ information, sending requests,
19+ and receiving responses.
20+ .
21+ Lenses are used for constructing and manipulating types,
22+ due to the depth of nesting of AWS types and transparency regarding
23+ de/serialisation into more palatable Haskell values.
24+ The provided lenses should be compatible with any of the major lens libraries
25+ such as <http://hackage.haskell.org/package/lens lens> or
26+ <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
27+ .
28+ See "Network.AWS.CloudWatchLogs" or <https://aws.amazon.com/documentation/ the AWS documentation>
29+ to get started.
30+
31+source-repository head
32+ type: git
33+ location: git://github.com/brendanhay/amazonka.git
34+ subdir: amazonka-cloudwatch-logs
35+
36+library
37+ default-language: Haskell2010
38+ hs-source-dirs: src gen
39+
40+ ghc-options:
41+ -Wall
42+ -fwarn-incomplete-uni-patterns
43+ -fwarn-incomplete-record-updates
44+ -funbox-strict-fields
45+
46+ exposed-modules:
47+ Network.AWS.CloudWatchLogs
48+ , Network.AWS.CloudWatchLogs.AssociateKMSKey
49+ , Network.AWS.CloudWatchLogs.CancelExportTask
50+ , Network.AWS.CloudWatchLogs.CreateExportTask
51+ , Network.AWS.CloudWatchLogs.CreateLogGroup
52+ , Network.AWS.CloudWatchLogs.CreateLogStream
53+ , Network.AWS.CloudWatchLogs.DeleteDestination
54+ , Network.AWS.CloudWatchLogs.DeleteLogGroup
55+ , Network.AWS.CloudWatchLogs.DeleteLogStream
56+ , Network.AWS.CloudWatchLogs.DeleteMetricFilter
57+ , Network.AWS.CloudWatchLogs.DeleteResourcePolicy
58+ , Network.AWS.CloudWatchLogs.DeleteRetentionPolicy
59+ , Network.AWS.CloudWatchLogs.DeleteSubscriptionFilter
60+ , Network.AWS.CloudWatchLogs.DescribeDestinations
61+ , Network.AWS.CloudWatchLogs.DescribeExportTasks
62+ , Network.AWS.CloudWatchLogs.DescribeLogGroups
63+ , Network.AWS.CloudWatchLogs.DescribeLogStreams
64+ , Network.AWS.CloudWatchLogs.DescribeMetricFilters
65+ , Network.AWS.CloudWatchLogs.DescribeResourcePolicies
66+ , Network.AWS.CloudWatchLogs.DescribeSubscriptionFilters
67+ , Network.AWS.CloudWatchLogs.DisassociateKMSKey
68+ , Network.AWS.CloudWatchLogs.FilterLogEvents
69+ , Network.AWS.CloudWatchLogs.GetLogEvents
70+ , Network.AWS.CloudWatchLogs.ListTagsLogGroup
71+ , Network.AWS.CloudWatchLogs.PutDestination
72+ , Network.AWS.CloudWatchLogs.PutDestinationPolicy
73+ , Network.AWS.CloudWatchLogs.PutLogEvents
74+ , Network.AWS.CloudWatchLogs.PutMetricFilter
75+ , Network.AWS.CloudWatchLogs.PutResourcePolicy
76+ , Network.AWS.CloudWatchLogs.PutRetentionPolicy
77+ , Network.AWS.CloudWatchLogs.PutSubscriptionFilter
78+ , Network.AWS.CloudWatchLogs.TagLogGroup
79+ , Network.AWS.CloudWatchLogs.TestMetricFilter
80+ , Network.AWS.CloudWatchLogs.Types
81+ , Network.AWS.CloudWatchLogs.UntagLogGroup
82+ , Network.AWS.CloudWatchLogs.Waiters
83+
84+ other-modules:
85+ Network.AWS.CloudWatchLogs.Types.Product
86+ , Network.AWS.CloudWatchLogs.Types.Sum
87+
88+ build-depends:
89+ amazonka-core == 1.5.0.*
90+ , base >= 4.7 && < 5
91+
92+test-suite amazonka-cloudwatch-logs-test
93+ type: exitcode-stdio-1.0
94+ default-language: Haskell2010
95+ hs-source-dirs: test
96+ main-is: Main.hs
97+
98+ ghc-options: -Wall -threaded
99+
100+ -- This section is encoded by the template and any modules added by
101+ -- hand outside these namespaces will not correctly be added to the
102+ -- distribution package.
103+ other-modules:
104+ Test.AWS.CloudWatchLogs
105+ , Test.AWS.Gen.CloudWatchLogs
106+ , Test.AWS.CloudWatchLogs.Internal
107+
108+ build-depends:
109+ amazonka-core == 1.5.0.*
110+ , amazonka-test == 1.5.0.*
111+ , amazonka-cloudwatch-logs
112+ , base
113+ , bytestring
114+ , tasty
115+ , tasty-hunit
116+ , text
117+ , time
118+ , unordered-containers
test/golden-test-cases/amazonka-cloudwatch-logs.nix.goldennew file+16
@@ -0,0 +1,16 @@
1+{ mkDerivation, amazonka-core, amazonka-test, base, bytestring
2+, stdenv, tasty, tasty-hunit, text, time, unordered-containers
3+}:
4+mkDerivation {
5+ pname = "amazonka-cloudwatch-logs";
6+ version = "1.5.0";
7+ sha256 = "deadbeef";
8+ libraryHaskellDepends = [ amazonka-core base ];
9+ testHaskellDepends = [
10+ amazonka-core amazonka-test base bytestring tasty tasty-hunit text
11+ time unordered-containers
12+ ];
13+ homepage = "https://github.com/brendanhay/amazonka";
14+ description = "Amazon CloudWatch Logs SDK";
15+ license = stdenv.lib.licenses.mpl20;
16+}
test/golden-test-cases/amazonka-codedeploy.cabalnew file+123
@@ -0,0 +1,123 @@
1+name: amazonka-codedeploy
2+version: 1.5.0
3+synopsis: Amazon CodeDeploy SDK.
4+homepage: https://github.com/brendanhay/amazonka
5+bug-reports: https://github.com/brendanhay/amazonka/issues
6+license: MPL-2.0
7+license-file: LICENSE
8+author: Brendan Hay
9+maintainer: Brendan Hay <brendan.g.hay+amazonka@gmail.com>
10+copyright: Copyright (c) 2013-2017 Brendan Hay
11+category: Network, AWS, Cloud, Distributed Computing
12+build-type: Simple
13+cabal-version: >= 1.10
14+extra-source-files: README.md fixture/*.yaml fixture/*.proto src/.gitkeep
15+description:
16+ The types from this library are intended to be used with
17+ <http://hackage.haskell.org/package/amazonka amazonka>, which provides
18+ mechanisms for specifying AuthN/AuthZ information, sending requests,
19+ and receiving responses.
20+ .
21+ Lenses are used for constructing and manipulating types,
22+ due to the depth of nesting of AWS types and transparency regarding
23+ de/serialisation into more palatable Haskell values.
24+ The provided lenses should be compatible with any of the major lens libraries
25+ such as <http://hackage.haskell.org/package/lens lens> or
26+ <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
27+ .
28+ See "Network.AWS.CodeDeploy" or <https://aws.amazon.com/documentation/ the AWS documentation>
29+ to get started.
30+
31+source-repository head
32+ type: git
33+ location: git://github.com/brendanhay/amazonka.git
34+ subdir: amazonka-codedeploy
35+
36+library
37+ default-language: Haskell2010
38+ hs-source-dirs: src gen
39+
40+ ghc-options:
41+ -Wall
42+ -fwarn-incomplete-uni-patterns
43+ -fwarn-incomplete-record-updates
44+ -funbox-strict-fields
45+
46+ exposed-modules:
47+ Network.AWS.CodeDeploy
48+ , Network.AWS.CodeDeploy.AddTagsToOnPremisesInstances
49+ , Network.AWS.CodeDeploy.BatchGetApplicationRevisions
50+ , Network.AWS.CodeDeploy.BatchGetApplications
51+ , Network.AWS.CodeDeploy.BatchGetDeploymentGroups
52+ , Network.AWS.CodeDeploy.BatchGetDeploymentInstances
53+ , Network.AWS.CodeDeploy.BatchGetDeployments
54+ , Network.AWS.CodeDeploy.BatchGetOnPremisesInstances
55+ , Network.AWS.CodeDeploy.ContinueDeployment
56+ , Network.AWS.CodeDeploy.CreateApplication
57+ , Network.AWS.CodeDeploy.CreateDeployment
58+ , Network.AWS.CodeDeploy.CreateDeploymentConfig
59+ , Network.AWS.CodeDeploy.CreateDeploymentGroup
60+ , Network.AWS.CodeDeploy.DeleteApplication
61+ , Network.AWS.CodeDeploy.DeleteDeploymentConfig
62+ , Network.AWS.CodeDeploy.DeleteDeploymentGroup
63+ , Network.AWS.CodeDeploy.DeregisterOnPremisesInstance
64+ , Network.AWS.CodeDeploy.GetApplication
65+ , Network.AWS.CodeDeploy.GetApplicationRevision
66+ , Network.AWS.CodeDeploy.GetDeployment
67+ , Network.AWS.CodeDeploy.GetDeploymentConfig
68+ , Network.AWS.CodeDeploy.GetDeploymentGroup
69+ , Network.AWS.CodeDeploy.GetDeploymentInstance
70+ , Network.AWS.CodeDeploy.GetOnPremisesInstance
71+ , Network.AWS.CodeDeploy.ListApplicationRevisions
72+ , Network.AWS.CodeDeploy.ListApplications
73+ , Network.AWS.CodeDeploy.ListDeploymentConfigs
74+ , Network.AWS.CodeDeploy.ListDeploymentGroups
75+ , Network.AWS.CodeDeploy.ListDeploymentInstances
76+ , Network.AWS.CodeDeploy.ListDeployments
77+ , Network.AWS.CodeDeploy.ListGitHubAccountTokenNames
78+ , Network.AWS.CodeDeploy.ListOnPremisesInstances
79+ , Network.AWS.CodeDeploy.RegisterApplicationRevision
80+ , Network.AWS.CodeDeploy.RegisterOnPremisesInstance
81+ , Network.AWS.CodeDeploy.RemoveTagsFromOnPremisesInstances
82+ , Network.AWS.CodeDeploy.SkipWaitTimeForInstanceTermination
83+ , Network.AWS.CodeDeploy.StopDeployment
84+ , Network.AWS.CodeDeploy.Types
85+ , Network.AWS.CodeDeploy.UpdateApplication
86+ , Network.AWS.CodeDeploy.UpdateDeploymentGroup
87+ , Network.AWS.CodeDeploy.Waiters
88+
89+ other-modules:
90+ Network.AWS.CodeDeploy.Types.Product
91+ , Network.AWS.CodeDeploy.Types.Sum
92+
93+ build-depends:
94+ amazonka-core == 1.5.0.*
95+ , base >= 4.7 && < 5
96+
97+test-suite amazonka-codedeploy-test
98+ type: exitcode-stdio-1.0
99+ default-language: Haskell2010
100+ hs-source-dirs: test
101+ main-is: Main.hs
102+
103+ ghc-options: -Wall -threaded
104+
105+ -- This section is encoded by the template and any modules added by
106+ -- hand outside these namespaces will not correctly be added to the
107+ -- distribution package.
108+ other-modules:
109+ Test.AWS.CodeDeploy
110+ , Test.AWS.Gen.CodeDeploy
111+ , Test.AWS.CodeDeploy.Internal
112+
113+ build-depends:
114+ amazonka-core == 1.5.0.*
115+ , amazonka-test == 1.5.0.*
116+ , amazonka-codedeploy
117+ , base
118+ , bytestring
119+ , tasty
120+ , tasty-hunit
121+ , text
122+ , time
123+ , unordered-containers
test/golden-test-cases/amazonka-codedeploy.nix.goldennew file+16
@@ -0,0 +1,16 @@
1+{ mkDerivation, amazonka-core, amazonka-test, base, bytestring
2+, stdenv, tasty, tasty-hunit, text, time, unordered-containers
3+}:
4+mkDerivation {
5+ pname = "amazonka-codedeploy";
6+ version = "1.5.0";
7+ sha256 = "deadbeef";
8+ libraryHaskellDepends = [ amazonka-core base ];
9+ testHaskellDepends = [
10+ amazonka-core amazonka-test base bytestring tasty tasty-hunit text
11+ time unordered-containers
12+ ];
13+ homepage = "https://github.com/brendanhay/amazonka";
14+ description = "Amazon CodeDeploy SDK";
15+ license = stdenv.lib.licenses.mpl20;
16+}
test/golden-test-cases/amazonka-cognito-idp.cabalnew file+168
@@ -0,0 +1,168 @@
1+name: amazonka-cognito-idp
2+version: 1.5.0
3+synopsis: Amazon Cognito Identity Provider SDK.
4+homepage: https://github.com/brendanhay/amazonka
5+bug-reports: https://github.com/brendanhay/amazonka/issues
6+license: MPL-2.0
7+license-file: LICENSE
8+author: Brendan Hay
9+maintainer: Brendan Hay <brendan.g.hay+amazonka@gmail.com>
10+copyright: Copyright (c) 2013-2017 Brendan Hay
11+category: Network, AWS, Cloud, Distributed Computing
12+build-type: Simple
13+cabal-version: >= 1.10
14+extra-source-files: README.md fixture/*.yaml fixture/*.proto src/.gitkeep
15+description:
16+ The types from this library are intended to be used with
17+ <http://hackage.haskell.org/package/amazonka amazonka>, which provides
18+ mechanisms for specifying AuthN/AuthZ information, sending requests,
19+ and receiving responses.
20+ .
21+ Lenses are used for constructing and manipulating types,
22+ due to the depth of nesting of AWS types and transparency regarding
23+ de/serialisation into more palatable Haskell values.
24+ The provided lenses should be compatible with any of the major lens libraries
25+ such as <http://hackage.haskell.org/package/lens lens> or
26+ <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
27+ .
28+ See "Network.AWS.CognitoIdentityProvider" or <https://aws.amazon.com/documentation/ the AWS documentation>
29+ to get started.
30+
31+source-repository head
32+ type: git
33+ location: git://github.com/brendanhay/amazonka.git
34+ subdir: amazonka-cognito-idp
35+
36+library
37+ default-language: Haskell2010
38+ hs-source-dirs: src gen
39+
40+ ghc-options:
41+ -Wall
42+ -fwarn-incomplete-uni-patterns
43+ -fwarn-incomplete-record-updates
44+ -funbox-strict-fields
45+
46+ exposed-modules:
47+ Network.AWS.CognitoIdentityProvider
48+ , Network.AWS.CognitoIdentityProvider.AddCustomAttributes
49+ , Network.AWS.CognitoIdentityProvider.AdminAddUserToGroup
50+ , Network.AWS.CognitoIdentityProvider.AdminConfirmSignUp
51+ , Network.AWS.CognitoIdentityProvider.AdminCreateUser
52+ , Network.AWS.CognitoIdentityProvider.AdminDeleteUser
53+ , Network.AWS.CognitoIdentityProvider.AdminDeleteUserAttributes
54+ , Network.AWS.CognitoIdentityProvider.AdminDisableProviderForUser
55+ , Network.AWS.CognitoIdentityProvider.AdminDisableUser
56+ , Network.AWS.CognitoIdentityProvider.AdminEnableUser
57+ , Network.AWS.CognitoIdentityProvider.AdminForgetDevice
58+ , Network.AWS.CognitoIdentityProvider.AdminGetDevice
59+ , Network.AWS.CognitoIdentityProvider.AdminGetUser
60+ , Network.AWS.CognitoIdentityProvider.AdminInitiateAuth
61+ , Network.AWS.CognitoIdentityProvider.AdminLinkProviderForUser
62+ , Network.AWS.CognitoIdentityProvider.AdminListDevices
63+ , Network.AWS.CognitoIdentityProvider.AdminListGroupsForUser
64+ , Network.AWS.CognitoIdentityProvider.AdminRemoveUserFromGroup
65+ , Network.AWS.CognitoIdentityProvider.AdminResetUserPassword
66+ , Network.AWS.CognitoIdentityProvider.AdminRespondToAuthChallenge
67+ , Network.AWS.CognitoIdentityProvider.AdminSetUserSettings
68+ , Network.AWS.CognitoIdentityProvider.AdminUpdateDeviceStatus
69+ , Network.AWS.CognitoIdentityProvider.AdminUpdateUserAttributes
70+ , Network.AWS.CognitoIdentityProvider.AdminUserGlobalSignOut
71+ , Network.AWS.CognitoIdentityProvider.ChangePassword
72+ , Network.AWS.CognitoIdentityProvider.ConfirmDevice
73+ , Network.AWS.CognitoIdentityProvider.ConfirmForgotPassword
74+ , Network.AWS.CognitoIdentityProvider.ConfirmSignUp
75+ , Network.AWS.CognitoIdentityProvider.CreateGroup
76+ , Network.AWS.CognitoIdentityProvider.CreateIdentityProvider
77+ , Network.AWS.CognitoIdentityProvider.CreateResourceServer
78+ , Network.AWS.CognitoIdentityProvider.CreateUserImportJob
79+ , Network.AWS.CognitoIdentityProvider.CreateUserPool
80+ , Network.AWS.CognitoIdentityProvider.CreateUserPoolClient
81+ , Network.AWS.CognitoIdentityProvider.CreateUserPoolDomain
82+ , Network.AWS.CognitoIdentityProvider.DeleteGroup
83+ , Network.AWS.CognitoIdentityProvider.DeleteIdentityProvider
84+ , Network.AWS.CognitoIdentityProvider.DeleteResourceServer
85+ , Network.AWS.CognitoIdentityProvider.DeleteUser
86+ , Network.AWS.CognitoIdentityProvider.DeleteUserAttributes
87+ , Network.AWS.CognitoIdentityProvider.DeleteUserPool
88+ , Network.AWS.CognitoIdentityProvider.DeleteUserPoolClient
89+ , Network.AWS.CognitoIdentityProvider.DeleteUserPoolDomain
90+ , Network.AWS.CognitoIdentityProvider.DescribeIdentityProvider
91+ , Network.AWS.CognitoIdentityProvider.DescribeResourceServer
92+ , Network.AWS.CognitoIdentityProvider.DescribeUserImportJob
93+ , Network.AWS.CognitoIdentityProvider.DescribeUserPool
94+ , Network.AWS.CognitoIdentityProvider.DescribeUserPoolClient
95+ , Network.AWS.CognitoIdentityProvider.DescribeUserPoolDomain
96+ , Network.AWS.CognitoIdentityProvider.ForgetDevice
97+ , Network.AWS.CognitoIdentityProvider.ForgotPassword
98+ , Network.AWS.CognitoIdentityProvider.GetCSVHeader
99+ , Network.AWS.CognitoIdentityProvider.GetDevice
100+ , Network.AWS.CognitoIdentityProvider.GetGroup
101+ , Network.AWS.CognitoIdentityProvider.GetIdentityProviderByIdentifier
102+ , Network.AWS.CognitoIdentityProvider.GetUICustomization
103+ , Network.AWS.CognitoIdentityProvider.GetUser
104+ , Network.AWS.CognitoIdentityProvider.GetUserAttributeVerificationCode
105+ , Network.AWS.CognitoIdentityProvider.GlobalSignOut
106+ , Network.AWS.CognitoIdentityProvider.InitiateAuth
107+ , Network.AWS.CognitoIdentityProvider.ListDevices
108+ , Network.AWS.CognitoIdentityProvider.ListGroups
109+ , Network.AWS.CognitoIdentityProvider.ListIdentityProviders
110+ , Network.AWS.CognitoIdentityProvider.ListResourceServers
111+ , Network.AWS.CognitoIdentityProvider.ListUserImportJobs
112+ , Network.AWS.CognitoIdentityProvider.ListUserPoolClients
113+ , Network.AWS.CognitoIdentityProvider.ListUserPools
114+ , Network.AWS.CognitoIdentityProvider.ListUsers
115+ , Network.AWS.CognitoIdentityProvider.ListUsersInGroup
116+ , Network.AWS.CognitoIdentityProvider.ResendConfirmationCode
117+ , Network.AWS.CognitoIdentityProvider.RespondToAuthChallenge
118+ , Network.AWS.CognitoIdentityProvider.SetUICustomization
119+ , Network.AWS.CognitoIdentityProvider.SetUserSettings
120+ , Network.AWS.CognitoIdentityProvider.SignUp
121+ , Network.AWS.CognitoIdentityProvider.StartUserImportJob
122+ , Network.AWS.CognitoIdentityProvider.StopUserImportJob
123+ , Network.AWS.CognitoIdentityProvider.Types
124+ , Network.AWS.CognitoIdentityProvider.UpdateDeviceStatus
125+ , Network.AWS.CognitoIdentityProvider.UpdateGroup
126+ , Network.AWS.CognitoIdentityProvider.UpdateIdentityProvider
127+ , Network.AWS.CognitoIdentityProvider.UpdateResourceServer
128+ , Network.AWS.CognitoIdentityProvider.UpdateUserAttributes
129+ , Network.AWS.CognitoIdentityProvider.UpdateUserPool
130+ , Network.AWS.CognitoIdentityProvider.UpdateUserPoolClient
131+ , Network.AWS.CognitoIdentityProvider.VerifyUserAttribute
132+ , Network.AWS.CognitoIdentityProvider.Waiters
133+
134+ other-modules:
135+ Network.AWS.CognitoIdentityProvider.Types.Product
136+ , Network.AWS.CognitoIdentityProvider.Types.Sum
137+
138+ build-depends:
139+ amazonka-core == 1.5.0.*
140+ , base >= 4.7 && < 5
141+
142+test-suite amazonka-cognito-idp-test
143+ type: exitcode-stdio-1.0
144+ default-language: Haskell2010
145+ hs-source-dirs: test
146+ main-is: Main.hs
147+
148+ ghc-options: -Wall -threaded
149+
150+ -- This section is encoded by the template and any modules added by
151+ -- hand outside these namespaces will not correctly be added to the
152+ -- distribution package.
153+ other-modules:
154+ Test.AWS.CognitoIdentityProvider
155+ , Test.AWS.Gen.CognitoIdentityProvider
156+ , Test.AWS.CognitoIdentityProvider.Internal
157+
158+ build-depends:
159+ amazonka-core == 1.5.0.*
160+ , amazonka-test == 1.5.0.*
161+ , amazonka-cognito-idp
162+ , base
163+ , bytestring
164+ , tasty
165+ , tasty-hunit
166+ , text
167+ , time
168+ , unordered-containers
test/golden-test-cases/amazonka-cognito-idp.nix.goldennew file+16
@@ -0,0 +1,16 @@
1+{ mkDerivation, amazonka-core, amazonka-test, base, bytestring
2+, stdenv, tasty, tasty-hunit, text, time, unordered-containers
3+}:
4+mkDerivation {
5+ pname = "amazonka-cognito-idp";
6+ version = "1.5.0";
7+ sha256 = "deadbeef";
8+ libraryHaskellDepends = [ amazonka-core base ];
9+ testHaskellDepends = [
10+ amazonka-core amazonka-test base bytestring tasty tasty-hunit text
11+ time unordered-containers
12+ ];
13+ homepage = "https://github.com/brendanhay/amazonka";
14+ description = "Amazon Cognito Identity Provider SDK";
15+ license = stdenv.lib.licenses.mpl20;
16+}
test/golden-test-cases/amazonka-ecs.cabalnew file+116
@@ -0,0 +1,116 @@
1+name: amazonka-ecs
2+version: 1.5.0
3+synopsis: Amazon EC2 Container Service SDK.
4+homepage: https://github.com/brendanhay/amazonka
5+bug-reports: https://github.com/brendanhay/amazonka/issues
6+license: MPL-2.0
7+license-file: LICENSE
8+author: Brendan Hay
9+maintainer: Brendan Hay <brendan.g.hay+amazonka@gmail.com>
10+copyright: Copyright (c) 2013-2017 Brendan Hay
11+category: Network, AWS, Cloud, Distributed Computing
12+build-type: Simple
13+cabal-version: >= 1.10
14+extra-source-files: README.md fixture/*.yaml fixture/*.proto src/.gitkeep
15+description:
16+ The types from this library are intended to be used with
17+ <http://hackage.haskell.org/package/amazonka amazonka>, which provides
18+ mechanisms for specifying AuthN/AuthZ information, sending requests,
19+ and receiving responses.
20+ .
21+ Lenses are used for constructing and manipulating types,
22+ due to the depth of nesting of AWS types and transparency regarding
23+ de/serialisation into more palatable Haskell values.
24+ The provided lenses should be compatible with any of the major lens libraries
25+ such as <http://hackage.haskell.org/package/lens lens> or
26+ <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
27+ .
28+ See "Network.AWS.ECS" or <https://aws.amazon.com/documentation/ the AWS documentation>
29+ to get started.
30+
31+source-repository head
32+ type: git
33+ location: git://github.com/brendanhay/amazonka.git
34+ subdir: amazonka-ecs
35+
36+library
37+ default-language: Haskell2010
38+ hs-source-dirs: src gen
39+
40+ ghc-options:
41+ -Wall
42+ -fwarn-incomplete-uni-patterns
43+ -fwarn-incomplete-record-updates
44+ -funbox-strict-fields
45+
46+ exposed-modules:
47+ Network.AWS.ECS
48+ , Network.AWS.ECS.CreateCluster
49+ , Network.AWS.ECS.CreateService
50+ , Network.AWS.ECS.DeleteAttributes
51+ , Network.AWS.ECS.DeleteCluster
52+ , Network.AWS.ECS.DeleteService
53+ , Network.AWS.ECS.DeregisterContainerInstance
54+ , Network.AWS.ECS.DeregisterTaskDefinition
55+ , Network.AWS.ECS.DescribeClusters
56+ , Network.AWS.ECS.DescribeContainerInstances
57+ , Network.AWS.ECS.DescribeServices
58+ , Network.AWS.ECS.DescribeTaskDefinition
59+ , Network.AWS.ECS.DescribeTasks
60+ , Network.AWS.ECS.DiscoverPollEndpoint
61+ , Network.AWS.ECS.ListAttributes
62+ , Network.AWS.ECS.ListClusters
63+ , Network.AWS.ECS.ListContainerInstances
64+ , Network.AWS.ECS.ListServices
65+ , Network.AWS.ECS.ListTaskDefinitionFamilies
66+ , Network.AWS.ECS.ListTaskDefinitions
67+ , Network.AWS.ECS.ListTasks
68+ , Network.AWS.ECS.PutAttributes
69+ , Network.AWS.ECS.RegisterContainerInstance
70+ , Network.AWS.ECS.RegisterTaskDefinition
71+ , Network.AWS.ECS.RunTask
72+ , Network.AWS.ECS.StartTask
73+ , Network.AWS.ECS.StopTask
74+ , Network.AWS.ECS.SubmitContainerStateChange
75+ , Network.AWS.ECS.SubmitTaskStateChange
76+ , Network.AWS.ECS.Types
77+ , Network.AWS.ECS.UpdateContainerAgent
78+ , Network.AWS.ECS.UpdateContainerInstancesState
79+ , Network.AWS.ECS.UpdateService
80+ , Network.AWS.ECS.Waiters
81+
82+ other-modules:
83+ Network.AWS.ECS.Types.Product
84+ , Network.AWS.ECS.Types.Sum
85+
86+ build-depends:
87+ amazonka-core == 1.5.0.*
88+ , base >= 4.7 && < 5
89+
90+test-suite amazonka-ecs-test
91+ type: exitcode-stdio-1.0
92+ default-language: Haskell2010
93+ hs-source-dirs: test
94+ main-is: Main.hs
95+
96+ ghc-options: -Wall -threaded
97+
98+ -- This section is encoded by the template and any modules added by
99+ -- hand outside these namespaces will not correctly be added to the
100+ -- distribution package.
101+ other-modules:
102+ Test.AWS.ECS
103+ , Test.AWS.Gen.ECS
104+ , Test.AWS.ECS.Internal
105+
106+ build-depends:
107+ amazonka-core == 1.5.0.*
108+ , amazonka-test == 1.5.0.*
109+ , amazonka-ecs
110+ , base
111+ , bytestring
112+ , tasty
113+ , tasty-hunit
114+ , text
115+ , time
116+ , unordered-containers
test/golden-test-cases/amazonka-ecs.nix.goldennew file+16
@@ -0,0 +1,16 @@
1+{ mkDerivation, amazonka-core, amazonka-test, base, bytestring
2+, stdenv, tasty, tasty-hunit, text, time, unordered-containers
3+}:
4+mkDerivation {
5+ pname = "amazonka-ecs";
6+ version = "1.5.0";
7+ sha256 = "deadbeef";
8+ libraryHaskellDepends = [ amazonka-core base ];
9+ testHaskellDepends = [
10+ amazonka-core amazonka-test base bytestring tasty tasty-hunit text
11+ time unordered-containers
12+ ];
13+ homepage = "https://github.com/brendanhay/amazonka";
14+ description = "Amazon EC2 Container Service SDK";
15+ license = stdenv.lib.licenses.mpl20;
16+}
test/golden-test-cases/amazonka-kms.cabalnew file+120
@@ -0,0 +1,120 @@
1+name: amazonka-kms
2+version: 1.5.0
3+synopsis: Amazon Key Management Service SDK.
4+homepage: https://github.com/brendanhay/amazonka
5+bug-reports: https://github.com/brendanhay/amazonka/issues
6+license: MPL-2.0
7+license-file: LICENSE
8+author: Brendan Hay
9+maintainer: Brendan Hay <brendan.g.hay+amazonka@gmail.com>
10+copyright: Copyright (c) 2013-2017 Brendan Hay
11+category: Network, AWS, Cloud, Distributed Computing
12+build-type: Simple
13+cabal-version: >= 1.10
14+extra-source-files: README.md fixture/*.yaml fixture/*.proto src/.gitkeep
15+description:
16+ The types from this library are intended to be used with
17+ <http://hackage.haskell.org/package/amazonka amazonka>, which provides
18+ mechanisms for specifying AuthN/AuthZ information, sending requests,
19+ and receiving responses.
20+ .
21+ Lenses are used for constructing and manipulating types,
22+ due to the depth of nesting of AWS types and transparency regarding
23+ de/serialisation into more palatable Haskell values.
24+ The provided lenses should be compatible with any of the major lens libraries
25+ such as <http://hackage.haskell.org/package/lens lens> or
26+ <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
27+ .
28+ See "Network.AWS.KMS" or <https://aws.amazon.com/documentation/ the AWS documentation>
29+ to get started.
30+
31+source-repository head
32+ type: git
33+ location: git://github.com/brendanhay/amazonka.git
34+ subdir: amazonka-kms
35+
36+library
37+ default-language: Haskell2010
38+ hs-source-dirs: src gen
39+
40+ ghc-options:
41+ -Wall
42+ -fwarn-incomplete-uni-patterns
43+ -fwarn-incomplete-record-updates
44+ -funbox-strict-fields
45+
46+ exposed-modules:
47+ Network.AWS.KMS
48+ , Network.AWS.KMS.CancelKeyDeletion
49+ , Network.AWS.KMS.CreateAlias
50+ , Network.AWS.KMS.CreateGrant
51+ , Network.AWS.KMS.CreateKey
52+ , Network.AWS.KMS.Decrypt
53+ , Network.AWS.KMS.DeleteAlias
54+ , Network.AWS.KMS.DeleteImportedKeyMaterial
55+ , Network.AWS.KMS.DescribeKey
56+ , Network.AWS.KMS.DisableKey
57+ , Network.AWS.KMS.DisableKeyRotation
58+ , Network.AWS.KMS.EnableKey
59+ , Network.AWS.KMS.EnableKeyRotation
60+ , Network.AWS.KMS.Encrypt
61+ , Network.AWS.KMS.GenerateDataKey
62+ , Network.AWS.KMS.GenerateDataKeyWithoutPlaintext
63+ , Network.AWS.KMS.GenerateRandom
64+ , Network.AWS.KMS.GetKeyPolicy
65+ , Network.AWS.KMS.GetKeyRotationStatus
66+ , Network.AWS.KMS.GetParametersForImport
67+ , Network.AWS.KMS.ImportKeyMaterial
68+ , Network.AWS.KMS.ListAliases
69+ , Network.AWS.KMS.ListGrants
70+ , Network.AWS.KMS.ListKeyPolicies
71+ , Network.AWS.KMS.ListKeys
72+ , Network.AWS.KMS.ListResourceTags
73+ , Network.AWS.KMS.ListRetirableGrants
74+ , Network.AWS.KMS.PutKeyPolicy
75+ , Network.AWS.KMS.ReEncrypt
76+ , Network.AWS.KMS.RetireGrant
77+ , Network.AWS.KMS.RevokeGrant
78+ , Network.AWS.KMS.ScheduleKeyDeletion
79+ , Network.AWS.KMS.TagResource
80+ , Network.AWS.KMS.Types
81+ , Network.AWS.KMS.UntagResource
82+ , Network.AWS.KMS.UpdateAlias
83+ , Network.AWS.KMS.UpdateKeyDescription
84+ , Network.AWS.KMS.Waiters
85+
86+ other-modules:
87+ Network.AWS.KMS.Types.Product
88+ , Network.AWS.KMS.Types.Sum
89+
90+ build-depends:
91+ amazonka-core == 1.5.0.*
92+ , base >= 4.7 && < 5
93+
94+test-suite amazonka-kms-test
95+ type: exitcode-stdio-1.0
96+ default-language: Haskell2010
97+ hs-source-dirs: test
98+ main-is: Main.hs
99+
100+ ghc-options: -Wall -threaded
101+
102+ -- This section is encoded by the template and any modules added by
103+ -- hand outside these namespaces will not correctly be added to the
104+ -- distribution package.
105+ other-modules:
106+ Test.AWS.KMS
107+ , Test.AWS.Gen.KMS
108+ , Test.AWS.KMS.Internal
109+
110+ build-depends:
111+ amazonka-core == 1.5.0.*
112+ , amazonka-test == 1.5.0.*
113+ , amazonka-kms
114+ , base
115+ , bytestring
116+ , tasty
117+ , tasty-hunit
118+ , text
119+ , time
120+ , unordered-containers
test/golden-test-cases/amazonka-kms.nix.goldennew file+16
@@ -0,0 +1,16 @@
1+{ mkDerivation, amazonka-core, amazonka-test, base, bytestring
2+, stdenv, tasty, tasty-hunit, text, time, unordered-containers
3+}:
4+mkDerivation {
5+ pname = "amazonka-kms";
6+ version = "1.5.0";
7+ sha256 = "deadbeef";
8+ libraryHaskellDepends = [ amazonka-core base ];
9+ testHaskellDepends = [
10+ amazonka-core amazonka-test base bytestring tasty tasty-hunit text
11+ time unordered-containers
12+ ];
13+ homepage = "https://github.com/brendanhay/amazonka";
14+ description = "Amazon Key Management Service SDK";
15+ license = stdenv.lib.licenses.mpl20;
16+}
test/golden-test-cases/amazonka-lightsail.cabalnew file+133
@@ -0,0 +1,133 @@
1+name: amazonka-lightsail
2+version: 1.5.0
3+synopsis: Amazon Lightsail SDK.
4+homepage: https://github.com/brendanhay/amazonka
5+bug-reports: https://github.com/brendanhay/amazonka/issues
6+license: MPL-2.0
7+license-file: LICENSE
8+author: Brendan Hay
9+maintainer: Brendan Hay <brendan.g.hay+amazonka@gmail.com>
10+copyright: Copyright (c) 2013-2017 Brendan Hay
11+category: Network, AWS, Cloud, Distributed Computing
12+build-type: Simple
13+cabal-version: >= 1.10
14+extra-source-files: README.md fixture/*.yaml fixture/*.proto src/.gitkeep
15+description:
16+ The types from this library are intended to be used with
17+ <http://hackage.haskell.org/package/amazonka amazonka>, which provides
18+ mechanisms for specifying AuthN/AuthZ information, sending requests,
19+ and receiving responses.
20+ .
21+ Lenses are used for constructing and manipulating types,
22+ due to the depth of nesting of AWS types and transparency regarding
23+ de/serialisation into more palatable Haskell values.
24+ The provided lenses should be compatible with any of the major lens libraries
25+ such as <http://hackage.haskell.org/package/lens lens> or
26+ <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
27+ .
28+ See "Network.AWS.Lightsail" or <https://aws.amazon.com/documentation/ the AWS documentation>
29+ to get started.
30+
31+source-repository head
32+ type: git
33+ location: git://github.com/brendanhay/amazonka.git
34+ subdir: amazonka-lightsail
35+
36+library
37+ default-language: Haskell2010
38+ hs-source-dirs: src gen
39+
40+ ghc-options:
41+ -Wall
42+ -fwarn-incomplete-uni-patterns
43+ -fwarn-incomplete-record-updates
44+ -funbox-strict-fields
45+
46+ exposed-modules:
47+ Network.AWS.Lightsail
48+ , Network.AWS.Lightsail.AllocateStaticIP
49+ , Network.AWS.Lightsail.AttachStaticIP
50+ , Network.AWS.Lightsail.CloseInstancePublicPorts
51+ , Network.AWS.Lightsail.CreateDomain
52+ , Network.AWS.Lightsail.CreateDomainEntry
53+ , Network.AWS.Lightsail.CreateInstanceSnapshot
54+ , Network.AWS.Lightsail.CreateInstances
55+ , Network.AWS.Lightsail.CreateInstancesFromSnapshot
56+ , Network.AWS.Lightsail.CreateKeyPair
57+ , Network.AWS.Lightsail.DeleteDomain
58+ , Network.AWS.Lightsail.DeleteDomainEntry
59+ , Network.AWS.Lightsail.DeleteInstance
60+ , Network.AWS.Lightsail.DeleteInstanceSnapshot
61+ , Network.AWS.Lightsail.DeleteKeyPair
62+ , Network.AWS.Lightsail.DetachStaticIP
63+ , Network.AWS.Lightsail.DownloadDefaultKeyPair
64+ , Network.AWS.Lightsail.GetActiveNames
65+ , Network.AWS.Lightsail.GetBlueprints
66+ , Network.AWS.Lightsail.GetBundles
67+ , Network.AWS.Lightsail.GetDomain
68+ , Network.AWS.Lightsail.GetDomains
69+ , Network.AWS.Lightsail.GetInstance
70+ , Network.AWS.Lightsail.GetInstanceAccessDetails
71+ , Network.AWS.Lightsail.GetInstanceMetricData
72+ , Network.AWS.Lightsail.GetInstancePortStates
73+ , Network.AWS.Lightsail.GetInstanceSnapshot
74+ , Network.AWS.Lightsail.GetInstanceSnapshots
75+ , Network.AWS.Lightsail.GetInstanceState
76+ , Network.AWS.Lightsail.GetInstances
77+ , Network.AWS.Lightsail.GetKeyPair
78+ , Network.AWS.Lightsail.GetKeyPairs
79+ , Network.AWS.Lightsail.GetOperation
80+ , Network.AWS.Lightsail.GetOperations
81+ , Network.AWS.Lightsail.GetOperationsForResource
82+ , Network.AWS.Lightsail.GetRegions
83+ , Network.AWS.Lightsail.GetStaticIP
84+ , Network.AWS.Lightsail.GetStaticIPs
85+ , Network.AWS.Lightsail.ImportKeyPair
86+ , Network.AWS.Lightsail.IsVPCPeered
87+ , Network.AWS.Lightsail.OpenInstancePublicPorts
88+ , Network.AWS.Lightsail.PeerVPC
89+ , Network.AWS.Lightsail.PutInstancePublicPorts
90+ , Network.AWS.Lightsail.RebootInstance
91+ , Network.AWS.Lightsail.ReleaseStaticIP
92+ , Network.AWS.Lightsail.StartInstance
93+ , Network.AWS.Lightsail.StopInstance
94+ , Network.AWS.Lightsail.Types
95+ , Network.AWS.Lightsail.UnpeerVPC
96+ , Network.AWS.Lightsail.UpdateDomainEntry
97+ , Network.AWS.Lightsail.Waiters
98+
99+ other-modules:
100+ Network.AWS.Lightsail.Types.Product
101+ , Network.AWS.Lightsail.Types.Sum
102+
103+ build-depends:
104+ amazonka-core == 1.5.0.*
105+ , base >= 4.7 && < 5
106+
107+test-suite amazonka-lightsail-test
108+ type: exitcode-stdio-1.0
109+ default-language: Haskell2010
110+ hs-source-dirs: test
111+ main-is: Main.hs
112+
113+ ghc-options: -Wall -threaded
114+
115+ -- This section is encoded by the template and any modules added by
116+ -- hand outside these namespaces will not correctly be added to the
117+ -- distribution package.
118+ other-modules:
119+ Test.AWS.Lightsail
120+ , Test.AWS.Gen.Lightsail
121+ , Test.AWS.Lightsail.Internal
122+
123+ build-depends:
124+ amazonka-core == 1.5.0.*
125+ , amazonka-test == 1.5.0.*
126+ , amazonka-lightsail
127+ , base
128+ , bytestring
129+ , tasty
130+ , tasty-hunit
131+ , text
132+ , time
133+ , unordered-containers
test/golden-test-cases/amazonka-lightsail.nix.goldennew file+16
@@ -0,0 +1,16 @@
1+{ mkDerivation, amazonka-core, amazonka-test, base, bytestring
2+, stdenv, tasty, tasty-hunit, text, time, unordered-containers
3+}:
4+mkDerivation {
5+ pname = "amazonka-lightsail";
6+ version = "1.5.0";
7+ sha256 = "deadbeef";
8+ libraryHaskellDepends = [ amazonka-core base ];
9+ testHaskellDepends = [
10+ amazonka-core amazonka-test base bytestring tasty tasty-hunit text
11+ time unordered-containers
12+ ];
13+ homepage = "https://github.com/brendanhay/amazonka";
14+ description = "Amazon Lightsail SDK";
15+ license = stdenv.lib.licenses.mpl20;
16+}
test/golden-test-cases/amazonka-route53-domains.cabalnew file+109
@@ -0,0 +1,109 @@
1+name: amazonka-route53-domains
2+version: 1.5.0
3+synopsis: Amazon Route 53 Domains SDK.
4+homepage: https://github.com/brendanhay/amazonka
5+bug-reports: https://github.com/brendanhay/amazonka/issues
6+license: MPL-2.0
7+license-file: LICENSE
8+author: Brendan Hay
9+maintainer: Brendan Hay <brendan.g.hay+amazonka@gmail.com>
10+copyright: Copyright (c) 2013-2017 Brendan Hay
11+category: Network, AWS, Cloud, Distributed Computing
12+build-type: Simple
13+cabal-version: >= 1.10
14+extra-source-files: README.md fixture/*.yaml fixture/*.proto src/.gitkeep
15+description:
16+ The types from this library are intended to be used with
17+ <http://hackage.haskell.org/package/amazonka amazonka>, which provides
18+ mechanisms for specifying AuthN/AuthZ information, sending requests,
19+ and receiving responses.
20+ .
21+ Lenses are used for constructing and manipulating types,
22+ due to the depth of nesting of AWS types and transparency regarding
23+ de/serialisation into more palatable Haskell values.
24+ The provided lenses should be compatible with any of the major lens libraries
25+ such as <http://hackage.haskell.org/package/lens lens> or
26+ <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
27+ .
28+ See "Network.AWS.Route53Domains" or <https://aws.amazon.com/documentation/ the AWS documentation>
29+ to get started.
30+
31+source-repository head
32+ type: git
33+ location: git://github.com/brendanhay/amazonka.git
34+ subdir: amazonka-route53-domains
35+
36+library
37+ default-language: Haskell2010
38+ hs-source-dirs: src gen
39+
40+ ghc-options:
41+ -Wall
42+ -fwarn-incomplete-uni-patterns
43+ -fwarn-incomplete-record-updates
44+ -funbox-strict-fields
45+
46+ exposed-modules:
47+ Network.AWS.Route53Domains
48+ , Network.AWS.Route53Domains.CheckDomainAvailability
49+ , Network.AWS.Route53Domains.CheckDomainTransferability
50+ , Network.AWS.Route53Domains.DeleteTagsForDomain
51+ , Network.AWS.Route53Domains.DisableDomainAutoRenew
52+ , Network.AWS.Route53Domains.DisableDomainTransferLock
53+ , Network.AWS.Route53Domains.EnableDomainAutoRenew
54+ , Network.AWS.Route53Domains.EnableDomainTransferLock
55+ , Network.AWS.Route53Domains.GetContactReachabilityStatus
56+ , Network.AWS.Route53Domains.GetDomainDetail
57+ , Network.AWS.Route53Domains.GetDomainSuggestions
58+ , Network.AWS.Route53Domains.GetOperationDetail
59+ , Network.AWS.Route53Domains.ListDomains
60+ , Network.AWS.Route53Domains.ListOperations
61+ , Network.AWS.Route53Domains.ListTagsForDomain
62+ , Network.AWS.Route53Domains.RegisterDomain
63+ , Network.AWS.Route53Domains.RenewDomain
64+ , Network.AWS.Route53Domains.ResendContactReachabilityEmail
65+ , Network.AWS.Route53Domains.RetrieveDomainAuthCode
66+ , Network.AWS.Route53Domains.TransferDomain
67+ , Network.AWS.Route53Domains.Types
68+ , Network.AWS.Route53Domains.UpdateDomainContact
69+ , Network.AWS.Route53Domains.UpdateDomainContactPrivacy
70+ , Network.AWS.Route53Domains.UpdateDomainNameservers
71+ , Network.AWS.Route53Domains.UpdateTagsForDomain
72+ , Network.AWS.Route53Domains.ViewBilling
73+ , Network.AWS.Route53Domains.Waiters
74+
75+ other-modules:
76+ Network.AWS.Route53Domains.Types.Product
77+ , Network.AWS.Route53Domains.Types.Sum
78+
79+ build-depends:
80+ amazonka-core == 1.5.0.*
81+ , base >= 4.7 && < 5
82+
83+test-suite amazonka-route53-domains-test
84+ type: exitcode-stdio-1.0
85+ default-language: Haskell2010
86+ hs-source-dirs: test
87+ main-is: Main.hs
88+
89+ ghc-options: -Wall -threaded
90+
91+ -- This section is encoded by the template and any modules added by
92+ -- hand outside these namespaces will not correctly be added to the
93+ -- distribution package.
94+ other-modules:
95+ Test.AWS.Route53Domains
96+ , Test.AWS.Gen.Route53Domains
97+ , Test.AWS.Route53Domains.Internal
98+
99+ build-depends:
100+ amazonka-core == 1.5.0.*
101+ , amazonka-test == 1.5.0.*
102+ , amazonka-route53-domains
103+ , base
104+ , bytestring
105+ , tasty
106+ , tasty-hunit
107+ , text
108+ , time
109+ , unordered-containers
test/golden-test-cases/amazonka-route53-domains.nix.goldennew file+16
@@ -0,0 +1,16 @@
1+{ mkDerivation, amazonka-core, amazonka-test, base, bytestring
2+, stdenv, tasty, tasty-hunit, text, time, unordered-containers
3+}:
4+mkDerivation {
5+ pname = "amazonka-route53-domains";
6+ version = "1.5.0";
7+ sha256 = "deadbeef";
8+ libraryHaskellDepends = [ amazonka-core base ];
9+ testHaskellDepends = [
10+ amazonka-core amazonka-test base bytestring tasty tasty-hunit text
11+ time unordered-containers
12+ ];
13+ homepage = "https://github.com/brendanhay/amazonka";
14+ description = "Amazon Route 53 Domains SDK";
15+ license = stdenv.lib.licenses.mpl20;
16+}
test/golden-test-cases/amazonka-waf.cabalnew file+144
@@ -0,0 +1,144 @@
1+name: amazonka-waf
2+version: 1.5.0
3+synopsis: Amazon WAF SDK.
4+homepage: https://github.com/brendanhay/amazonka
5+bug-reports: https://github.com/brendanhay/amazonka/issues
6+license: MPL-2.0
7+license-file: LICENSE
8+author: Brendan Hay
9+maintainer: Brendan Hay <brendan.g.hay+amazonka@gmail.com>
10+copyright: Copyright (c) 2013-2017 Brendan Hay
11+category: Network, AWS, Cloud, Distributed Computing
12+build-type: Simple
13+cabal-version: >= 1.10
14+extra-source-files: README.md fixture/*.yaml fixture/*.proto src/.gitkeep
15+description:
16+ The types from this library are intended to be used with
17+ <http://hackage.haskell.org/package/amazonka amazonka>, which provides
18+ mechanisms for specifying AuthN/AuthZ information, sending requests,
19+ and receiving responses.
20+ .
21+ Lenses are used for constructing and manipulating types,
22+ due to the depth of nesting of AWS types and transparency regarding
23+ de/serialisation into more palatable Haskell values.
24+ The provided lenses should be compatible with any of the major lens libraries
25+ such as <http://hackage.haskell.org/package/lens lens> or
26+ <http://hackage.haskell.org/package/lens-family-core lens-family-core>.
27+ .
28+ See "Network.AWS.WAF" or <https://aws.amazon.com/documentation/ the AWS documentation>
29+ to get started.
30+
31+source-repository head
32+ type: git
33+ location: git://github.com/brendanhay/amazonka.git
34+ subdir: amazonka-waf
35+
36+library
37+ default-language: Haskell2010
38+ hs-source-dirs: src gen
39+
40+ ghc-options:
41+ -Wall
42+ -fwarn-incomplete-uni-patterns
43+ -fwarn-incomplete-record-updates
44+ -funbox-strict-fields
45+
46+ exposed-modules:
47+ Network.AWS.WAF
48+ , Network.AWS.WAF.CreateByteMatchSet
49+ , Network.AWS.WAF.CreateGeoMatchSet
50+ , Network.AWS.WAF.CreateIPSet
51+ , Network.AWS.WAF.CreateRateBasedRule
52+ , Network.AWS.WAF.CreateRegexMatchSet
53+ , Network.AWS.WAF.CreateRegexPatternSet
54+ , Network.AWS.WAF.CreateRule
55+ , Network.AWS.WAF.CreateSizeConstraintSet
56+ , Network.AWS.WAF.CreateSqlInjectionMatchSet
57+ , Network.AWS.WAF.CreateWebACL
58+ , Network.AWS.WAF.CreateXSSMatchSet
59+ , Network.AWS.WAF.DeleteByteMatchSet
60+ , Network.AWS.WAF.DeleteGeoMatchSet
61+ , Network.AWS.WAF.DeleteIPSet
62+ , Network.AWS.WAF.DeleteRateBasedRule
63+ , Network.AWS.WAF.DeleteRegexMatchSet
64+ , Network.AWS.WAF.DeleteRegexPatternSet
65+ , Network.AWS.WAF.DeleteRule
66+ , Network.AWS.WAF.DeleteSizeConstraintSet
67+ , Network.AWS.WAF.DeleteSqlInjectionMatchSet
68+ , Network.AWS.WAF.DeleteWebACL
69+ , Network.AWS.WAF.DeleteXSSMatchSet
70+ , Network.AWS.WAF.GetByteMatchSet
71+ , Network.AWS.WAF.GetChangeToken
72+ , Network.AWS.WAF.GetChangeTokenStatus
73+ , Network.AWS.WAF.GetGeoMatchSet
74+ , Network.AWS.WAF.GetIPSet
75+ , Network.AWS.WAF.GetRateBasedRule
76+ , Network.AWS.WAF.GetRateBasedRuleManagedKeys
77+ , Network.AWS.WAF.GetRegexMatchSet
78+ , Network.AWS.WAF.GetRegexPatternSet
79+ , Network.AWS.WAF.GetRule
80+ , Network.AWS.WAF.GetSampledRequests
81+ , Network.AWS.WAF.GetSizeConstraintSet
82+ , Network.AWS.WAF.GetSqlInjectionMatchSet
83+ , Network.AWS.WAF.GetWebACL
84+ , Network.AWS.WAF.GetXSSMatchSet
85+ , Network.AWS.WAF.ListByteMatchSets
86+ , Network.AWS.WAF.ListGeoMatchSets
87+ , Network.AWS.WAF.ListIPSets
88+ , Network.AWS.WAF.ListRateBasedRules
89+ , Network.AWS.WAF.ListRegexMatchSets
90+ , Network.AWS.WAF.ListRegexPatternSets
91+ , Network.AWS.WAF.ListRules
92+ , Network.AWS.WAF.ListSizeConstraintSets
93+ , Network.AWS.WAF.ListSqlInjectionMatchSets
94+ , Network.AWS.WAF.ListWebACLs
95+ , Network.AWS.WAF.ListXSSMatchSets
96+ , Network.AWS.WAF.Types
97+ , Network.AWS.WAF.UpdateByteMatchSet
98+ , Network.AWS.WAF.UpdateGeoMatchSet
99+ , Network.AWS.WAF.UpdateIPSet
100+ , Network.AWS.WAF.UpdateRateBasedRule
101+ , Network.AWS.WAF.UpdateRegexMatchSet
102+ , Network.AWS.WAF.UpdateRegexPatternSet
103+ , Network.AWS.WAF.UpdateRule
104+ , Network.AWS.WAF.UpdateSizeConstraintSet
105+ , Network.AWS.WAF.UpdateSqlInjectionMatchSet
106+ , Network.AWS.WAF.UpdateWebACL
107+ , Network.AWS.WAF.UpdateXSSMatchSet
108+ , Network.AWS.WAF.Waiters
109+
110+ other-modules:
111+ Network.AWS.WAF.Types.Product
112+ , Network.AWS.WAF.Types.Sum
113+
114+ build-depends:
115+ amazonka-core == 1.5.0.*
116+ , base >= 4.7 && < 5
117+
118+test-suite amazonka-waf-test
119+ type: exitcode-stdio-1.0
120+ default-language: Haskell2010
121+ hs-source-dirs: test
122+ main-is: Main.hs
123+
124+ ghc-options: -Wall -threaded
125+
126+ -- This section is encoded by the template and any modules added by
127+ -- hand outside these namespaces will not correctly be added to the
128+ -- distribution package.
129+ other-modules:
130+ Test.AWS.WAF
131+ , Test.AWS.Gen.WAF
132+ , Test.AWS.WAF.Internal
133+
134+ build-depends:
135+ amazonka-core == 1.5.0.*
136+ , amazonka-test == 1.5.0.*
137+ , amazonka-waf
138+ , base
139+ , bytestring
140+ , tasty
141+ , tasty-hunit
142+ , text
143+ , time
144+ , unordered-containers
test/golden-test-cases/amazonka-waf.nix.goldennew file+16
@@ -0,0 +1,16 @@
1+{ mkDerivation, amazonka-core, amazonka-test, base, bytestring
2+, stdenv, tasty, tasty-hunit, text, time, unordered-containers
3+}:
4+mkDerivation {
5+ pname = "amazonka-waf";
6+ version = "1.5.0";
7+ sha256 = "deadbeef";
8+ libraryHaskellDepends = [ amazonka-core base ];
9+ testHaskellDepends = [
10+ amazonka-core amazonka-test base bytestring tasty tasty-hunit text
11+ time unordered-containers
12+ ];
13+ homepage = "https://github.com/brendanhay/amazonka";
14+ description = "Amazon WAF SDK";
15+ license = stdenv.lib.licenses.mpl20;
16+}
test/golden-test-cases/api-field-json-th.cabalnew file+40
@@ -0,0 +1,40 @@
1+name: api-field-json-th
2+version: 0.1.0.2
3+synopsis: option of aeson's deriveJSON
4+description: Utils for using aeson's deriveJSON with lens's makeFields
5+homepage: https://github.com/nakaji-dayo/api-field-json-th
6+license: BSD3
7+license-file: LICENSE
8+author: Daishi Nakajima
9+maintainer: nakaji.dayo@gmail.com
10+copyright: 2016 Daishi Nakajima
11+category: Utils
12+build-type: Simple
13+-- extra-source-files:
14+cabal-version: >=1.10
15+
16+library
17+ exposed-modules: Data.Aeson.APIFieldJsonTH
18+ build-depends: base >= 4.7 && < 5
19+ , text
20+ , aeson
21+ , lens
22+ , split
23+ , template-haskell
24+ default-language: Haskell2010
25+
26+test-suite api-field-json-th-test
27+ type: exitcode-stdio-1.0
28+ hs-source-dirs: test
29+ main-is: Spec.hs
30+ build-depends: base
31+ , api-field-json-th
32+ , HUnit
33+ , aeson
34+ , lens
35+ ghc-options: -threaded -rtsopts -with-rtsopts=-N
36+ default-language: Haskell2010
37+
38+source-repository head
39+ type: git
40+ location: https://github.com/nakaji-dayo/api-field-json-th
test/golden-test-cases/api-field-json-th.nix.goldennew file+15
@@ -0,0 +1,15 @@
1+{ mkDerivation, aeson, base, HUnit, lens, split, stdenv
2+, template-haskell, text
3+}:
4+mkDerivation {
5+ pname = "api-field-json-th";
6+ version = "0.1.0.2";
7+ sha256 = "deadbeef";
8+ libraryHaskellDepends = [
9+ aeson base lens split template-haskell text
10+ ];
11+ testHaskellDepends = [ aeson base HUnit lens ];
12+ homepage = "https://github.com/nakaji-dayo/api-field-json-th";
13+ description = "option of aeson's deriveJSON";
14+ license = stdenv.lib.licenses.bsd3;
15+}
test/golden-test-cases/app-settings.cabalnew file+138
@@ -0,0 +1,138 @@
1+-- Initial app-settings.cabal generated by cabal init. For further
2+-- documentation, see http://haskell.org/cabal/users-guide/
3+
4+name: app-settings
5+version: 0.2.0.11
6+synopsis: A library to manage application settings (INI file-like)
7+description:
8+ A library to deal with application settings.
9+ .
10+ This library deals with read-write application settings.
11+ You will have to specify the settings that your application
12+ uses, their name, types and default values.
13+ .
14+ Setting types must implement the 'Read' and 'Show' typeclasses.
15+ .
16+ The settings are saved in a file in an INI-like key-value format
17+ (without sections).
18+ .
19+ Reading and updating settings is done in pure code, the IO
20+ monad is only used to load settings and save them to disk.
21+ It is advised for the user to create a module in your project
22+ holding settings handling.
23+ .
24+ You can then declare settings:
25+ .
26+ > fontSize :: Setting Double
27+ > fontSize = Setting "fontSize" 14
28+ >
29+ > dateFormat :: Setting String
30+ > dateFormat = Setting "dateFormat" "%x"
31+ >
32+ > backgroundColor :: Setting (Int, Int, Int)
33+ > backgroundColor = Setting "backcolor" (255, 0, 0)
34+ .
35+ Optionally you can declare the list of all your settings,
36+ in that case the application will also save the default
37+ values in the configuration file, but commented out:
38+ .
39+ > fontSize=16
40+ > # dateFormat="%x"
41+ > # backcolor=(255,0,0)
42+ .
43+ If you do not specify the list of settings, only the
44+ first line would be present in the configuration file.
45+ .
46+ With an ordinary setting, one row in the configuration file
47+ means one setting. That setting may of course be a list
48+ for instance. This setup works very well for shorter lists
49+ like [1,2,3], however if you have a list of more complex
50+ items, you will get very long lines and a configuration
51+ file very difficult to edit by hand.
52+ .
53+ For these special cases there is also the 'ListSetting'
54+ constructor:
55+ .
56+ > testList :: Setting [String]
57+ > testList = ListSetting "testList" ["list1", "list2", "list3"]
58+ .
59+ Now the configuration file looks like that:
60+ .
61+ > testList_1="list1"
62+ > testList_2="list2"
63+ > testList_3="list3"
64+ .
65+ Which is much more handy for big lists. An empty list is represented
66+ like so:
67+ .
68+ > testList=
69+ .
70+ There is also another technique that you can use if you have too long
71+ lines: you can put line breaks in the setting values if you start the
72+ following lines with a leading space, like so:
73+ .
74+ > testList=["list1",
75+ > "list2", "list3"]
76+ .
77+ In that case don't use the ListSetting option. Any character after the
78+ the leading space in the next lines will go in the setting value. Note
79+ that the library will automatically wrap setting values longer than 80
80+ characters when saving.
81+ .
82+ Once we declared the settings, we can read the configuration
83+ from disk (and your settings module should export your wrapper
84+ around the function offered by this library):
85+ .
86+ > readResult <- try $ readSettings (AutoFromAppName "test")
87+ > case readResult of
88+ > Right (conf, GetSetting getSetting) -> do
89+ > let textSize = getSetting fontSize
90+ > saveSettings emptyDefaultConfig (AutoFromAppName "test") conf
91+ > Left (x :: SomeException) -> error "Error reading the config file!"
92+ .
93+ 'AutoFromAppName' specifies where to save the configuration file.
94+ And we've already covered the getSetting in this snippet, see
95+ the 'readSettings' documentation for further information.
96+ .
97+ You can also look at the tests of the library on the github project for sample use.
98+
99+homepage: https://github.com/emmanueltouzery/app-settings
100+license: BSD3
101+license-file: LICENSE
102+author: Emmanuel Touzery
103+maintainer: etouzery@gmail.com
104+-- copyright:
105+category: Configuration
106+build-type: Simple
107+extra-source-files: tests/*.conf tests/*.config tests/*.txt
108+cabal-version: >=1.10
109+
110+library
111+ exposed-modules: Data.AppSettings
112+ other-modules: Data.Serialization,
113+ Data.AppSettingsInternal
114+ -- other-extensions:
115+ build-depends: base >=4.6 && <5,
116+ mtl >= 2.1 && <2.3,
117+ containers == 0.5.*,
118+ directory >= 1.2 && < 1.4,
119+ text >= 0.10,
120+ parsec == 3.1.*
121+ -- hs-source-dirs:
122+ default-language: Haskell2010
123+ Ghc-Options: -Wall
124+
125+test-suite tests
126+ type: exitcode-stdio-1.0
127+ hs-source-dirs: ., tests
128+ main-is: Tests.hs
129+ default-language: Haskell2010
130+ build-depends: base,
131+ hspec,
132+ HUnit >= 1.2 && <1.7,
133+ mtl >= 2.1 && <2.3,
134+ containers == 0.5.*,
135+ directory >= 1.2 && < 1.4,
136+ text >= 0.10,
137+ parsec == 3.1.*
138+ Ghc-Options: -Wall
test/golden-test-cases/app-settings.nix.goldennew file+17
@@ -0,0 +1,17 @@
1+{ mkDerivation, base, containers, directory, hspec, HUnit, mtl
2+, parsec, stdenv, text
3+}:
4+mkDerivation {
5+ pname = "app-settings";
6+ version = "0.2.0.11";
7+ sha256 = "deadbeef";
8+ libraryHaskellDepends = [
9+ base containers directory mtl parsec text
10+ ];
11+ testHaskellDepends = [
12+ base containers directory hspec HUnit mtl parsec text
13+ ];
14+ homepage = "https://github.com/emmanueltouzery/app-settings";
15+ description = "A library to manage application settings (INI file-like)";
16+ license = stdenv.lib.licenses.bsd3;
17+}
test/golden-test-cases/apply-refact.cabalnew file+96
@@ -0,0 +1,96 @@
1+-- Initial hlint-refactor.cabal generated by cabal init. For further
2+-- documentation, see http://haskell.org/cabal/users-guide/
3+
4+name: apply-refact
5+version: 0.4.1.0
6+synopsis: Perform refactorings specified by the refact library.
7+description: Perform refactorings specified by the refact library. It is primarily used with HLint's --refactor flag.
8+license: BSD3
9+license-file: LICENSE
10+author: Matthew Pickering
11+maintainer: matthewtpickering@gmail.com
12+-- copyright:
13+category: Development
14+build-type: Simple
15+extra-source-files: CHANGELOG
16+ , README.md
17+ , tests/examples/*.hs
18+ , tests/examples/*.hs.refact
19+ , tests/examples/*.hs.expected
20+cabal-version: >=1.10
21+tested-with: GHC == 8.0.1
22+
23+
24+source-repository head
25+ type: git
26+ location: https://github.com/mpickering/apply-refact.git
27+
28+library
29+ exposed-modules: Refact.Utils
30+ , Refact.Apply
31+ , Refact.Fixity
32+ GHC-Options: -Wall
33+ build-depends: base >=4.8 && <4.11
34+ , refact >= 0.2
35+ , ghc-exactprint >= 0.5.3.1
36+ , ghc >= 8.2.0 && < 8.3
37+ , containers
38+ , syb
39+ , mtl
40+ , process
41+ , transformers
42+ , temporary
43+ , filemanip
44+ , unix-compat
45+ , directory
46+ hs-source-dirs: src
47+ default-language: Haskell2010
48+
49+executable refactor
50+ main-is: Main.hs
51+ hs-source-dirs: src
52+ default-language: Haskell2010
53+ ghc-options: -Wall -fno-warn-unused-do-bind
54+ build-depends: base >= 4.8 && < 4.11
55+ , refact >= 0.2
56+ , ghc-exactprint >= 0.5.3.1
57+ , ghc >= 8.2.0 && < 8.3
58+ , containers
59+ , syb
60+ , mtl
61+ , process
62+ , directory
63+ , optparse-applicative >= 0.13
64+ , filemanip
65+ , unix-compat
66+ , filepath
67+ , temporary
68+ , transformers
69+
70+Test-Suite test
71+ type: exitcode-stdio-1.0
72+ hs-source-dirs: tests, src
73+ main-is: Test.hs
74+ GHC-Options: -threaded -main-is Test
75+ Default-language: Haskell2010
76+ if impl (ghc < 7.10)
77+ buildable: False
78+ Build-depends: tasty
79+ , tasty-golden
80+ , tasty-expected-failure
81+ , base < 5
82+ , refact >= 0.2
83+ , ghc-exactprint >= 0.5.3.1
84+ , ghc >= 8.2.0 && < 8.3
85+ , containers
86+ , syb
87+ , mtl
88+ , process
89+ , directory
90+ , optparse-applicative
91+ , filemanip
92+ , unix-compat
93+ , filepath
94+ , silently
95+ , temporary
96+ , transformers
test/golden-test-cases/apply-refact.nix.goldennew file+29
@@ -0,0 +1,29 @@
1+{ mkDerivation, base, containers, directory, filemanip, filepath
2+, ghc, ghc-exactprint, mtl, optparse-applicative, process, refact
3+, silently, stdenv, syb, tasty, tasty-expected-failure
4+, tasty-golden, temporary, transformers, unix-compat
5+}:
6+mkDerivation {
7+ pname = "apply-refact";
8+ version = "0.4.1.0";
9+ sha256 = "deadbeef";
10+ isLibrary = true;
11+ isExecutable = true;
12+ libraryHaskellDepends = [
13+ base containers directory filemanip ghc ghc-exactprint mtl process
14+ refact syb temporary transformers unix-compat
15+ ];
16+ executableHaskellDepends = [
17+ base containers directory filemanip filepath ghc ghc-exactprint mtl
18+ optparse-applicative process refact syb temporary transformers
19+ unix-compat
20+ ];
21+ testHaskellDepends = [
22+ base containers directory filemanip filepath ghc ghc-exactprint mtl
23+ optparse-applicative process refact silently syb tasty
24+ tasty-expected-failure tasty-golden temporary transformers
25+ unix-compat
26+ ];
27+ description = "Perform refactorings specified by the refact library";
28+ license = stdenv.lib.licenses.bsd3;
29+}
test/golden-test-cases/async.cabalnew file+64
@@ -0,0 +1,64 @@
1+name: async
2+version: 2.1.1.1
3+-- don't forget to update ./changelog.md!
4+synopsis: Run IO operations asynchronously and wait for their results
5+
6+description:
7+ This package provides a higher-level interface over
8+ threads, in which an @Async a@ is a concurrent
9+ thread that will eventually deliver a value of
10+ type @a@. The package provides ways to create
11+ @Async@ computations, wait for their results, and
12+ cancel them.
13+ .
14+ Using @Async@ is safer than using threads in two
15+ ways:
16+ .
17+ * When waiting for a thread to return a result,
18+ if the thread dies with an exception then the
19+ caller must either re-throw the exception
20+ ('wait') or handle it ('waitCatch'); the
21+ exception cannot be ignored.
22+ .
23+ * The API makes it possible to build a tree of
24+ threads that are automatically killed when
25+ their parent dies (see 'withAsync').
26+
27+license: BSD3
28+license-file: LICENSE
29+author: Simon Marlow
30+maintainer: Simon Marlow <marlowsd@gmail.com>
31+copyright: (c) Simon Marlow 2012
32+category: Concurrency
33+build-type: Simple
34+cabal-version: >=1.10
35+homepage: https://github.com/simonmar/async
36+bug-reports: https://github.com/simonmar/async/issues
37+tested-with: GHC==7.11.*, GHC==7.10.3, GHC==7.8.4, GHC==7.6.3, GHC==7.4.2, GHC==7.2.2, GHC==7.0.4
38+
39+extra-source-files:
40+ changelog.md
41+ bench/race.hs
42+
43+source-repository head
44+ type: git
45+ location: https://github.com/simonmar/async.git
46+
47+library
48+ default-language: Haskell2010
49+ other-extensions: CPP, MagicHash, RankNTypes, UnboxedTuples
50+ if impl(ghc>=7.1)
51+ other-extensions: Trustworthy
52+ exposed-modules: Control.Concurrent.Async
53+ build-depends: base >= 4.3 && < 4.11, stm >= 2.2 && < 2.5
54+
55+test-suite test-async
56+ default-language: Haskell2010
57+ type: exitcode-stdio-1.0
58+ hs-source-dirs: test
59+ main-is: test-async.hs
60+ build-depends: base >= 4.3 && < 4.11,
61+ async,
62+ test-framework,
63+ test-framework-hunit,
64+ HUnit
test/golden-test-cases/async.nix.goldennew file+15
@@ -0,0 +1,15 @@
1+{ mkDerivation, base, HUnit, stdenv, stm, test-framework
2+, test-framework-hunit
3+}:
4+mkDerivation {
5+ pname = "async";
6+ version = "2.1.1.1";
7+ sha256 = "deadbeef";
8+ libraryHaskellDepends = [ base stm ];
9+ testHaskellDepends = [
10+ base HUnit test-framework test-framework-hunit
11+ ];
12+ homepage = "https://github.com/simonmar/async";
13+ description = "Run IO operations asynchronously and wait for their results";
14+ license = stdenv.lib.licenses.bsd3;
15+}
test/golden-test-cases/attoparsec-expr.cabalnew file+28
@@ -0,0 +1,28 @@
1+name: attoparsec-expr
2+version: 0.1.1.2
3+description: Port of parsec's expression parser to attoparsec.
4+synopsis: Port of parsec's expression parser to attoparsec.
5+category: Text, Parsing
6+license: BSD3
7+license-file: LICENSE
8+author: Daan Leijen, Paolo Martini
9+maintainer: Silk <code@silk.co>
10+build-type: Simple
11+cabal-version: >= 1.6
12+
13+extra-source-files:
14+ CHANGELOG.md
15+ LICENSE
16+ README.md
17+
18+source-repository head
19+ type: git
20+ location: https://github.com/silkapp/attoparsec-expr
21+
22+library
23+ ghc-options: -Wall
24+ hs-source-dirs: src
25+ exposed-modules: Data.Attoparsec.Expr
26+ Build-Depends:
27+ base == 4.*
28+ , attoparsec >= 0.10 && < 0.14
test/golden-test-cases/attoparsec-expr.nix.goldennew file+9
@@ -0,0 +1,9 @@
1+{ mkDerivation, attoparsec, base, stdenv }:
2+mkDerivation {
3+ pname = "attoparsec-expr";
4+ version = "0.1.1.2";
5+ sha256 = "deadbeef";
6+ libraryHaskellDepends = [ attoparsec base ];
7+ description = "Port of parsec's expression parser to attoparsec";
8+ license = stdenv.lib.licenses.bsd3;
9+}
test/golden-test-cases/attoparsec-time.cabalnew file+84
@@ -0,0 +1,84 @@
1+name:
2+ attoparsec-time
3+version:
4+ 1
5+synopsis:
6+ Attoparsec parsers of time
7+description:
8+ A collection of Attoparsec parsers for the \"time\" library
9+category:
10+ Attoparsec, Parsers, Time
11+homepage:
12+ https://github.com/nikita-volkov/attoparsec-time
13+bug-reports:
14+ https://github.com/nikita-volkov/attoparsec-time/issues
15+author:
16+ Nikita Volkov <nikita.y.volkov@mail.ru>
17+maintainer:
18+ Nikita Volkov <nikita.y.volkov@mail.ru>
19+copyright:
20+ (c) 2017, Nikita Volkov
21+license:
22+ MIT
23+license-file:
24+ LICENSE
25+build-type:
26+ Custom
27+cabal-version:
28+ >=1.10
29+
30+source-repository head
31+ type:
32+ git
33+ location:
34+ git://github.com/nikita-volkov/attoparsec-time.git
35+
36+custom-setup
37+ setup-depends:
38+ base, Cabal, cabal-doctest >=1.0.2 && <1.1
39+
40+library
41+ hs-source-dirs:
42+ library
43+ default-extensions:
44+ Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeFamilies, TypeOperators, UnboxedTuples
45+ default-language:
46+ Haskell2010
47+ exposed-modules:
48+ Attoparsec.Time.ByteString
49+ Attoparsec.Time.Text
50+ other-modules:
51+ Attoparsec.Time.Prelude
52+ Attoparsec.Time.Validation
53+ Attoparsec.Time.Pure
54+ build-depends:
55+ --
56+ attoparsec >=0.13 && <0.15,
57+ --
58+ time >=1.4 && <2,
59+ scientific ==0.3.*,
60+ text >=1 && <2,
61+ bytestring ==0.10.*,
62+ --
63+ base-prelude <2,
64+ base >=4.7 && <5
65+
66+test-suite doctests
67+ type:
68+ exitcode-stdio-1.0
69+ hs-source-dirs:
70+ doctests
71+ main-is:
72+ Main.hs
73+ ghc-options:
74+ -threaded
75+ "-with-rtsopts=-N"
76+ -funbox-strict-fields
77+ default-language:
78+ Haskell2010
79+ build-depends:
80+ doctest ==0.13.*,
81+ directory >=1.2 && <2,
82+ filepath >=1.4 && <2,
83+ base-prelude <2,
84+ base <5
test/golden-test-cases/attoparsec-time.nix.goldennew file+19
@@ -0,0 +1,19 @@
1+{ mkDerivation, attoparsec, base, base-prelude, bytestring, Cabal
2+, cabal-doctest, directory, doctest, filepath, scientific, stdenv
3+, text, time
4+}:
5+mkDerivation {
6+ pname = "attoparsec-time";
7+ version = "1";
8+ sha256 = "deadbeef";
9+ setupHaskellDepends = [ base Cabal cabal-doctest ];
10+ libraryHaskellDepends = [
11+ attoparsec base base-prelude bytestring scientific text time
12+ ];
13+ testHaskellDepends = [
14+ base base-prelude directory doctest filepath
15+ ];
16+ homepage = "https://github.com/nikita-volkov/attoparsec-time";
17+ description = "Attoparsec parsers of time";
18+ license = stdenv.lib.licenses.mit;
19+}
test/golden-test-cases/avers-server.cabalnew file+55
@@ -0,0 +1,55 @@
1+name: avers-server
2+version: 0.1.0
3+synopsis: Server implementation of the Avers API
4+description: Server implementation of the Avers API
5+homepage: http://github.com/wereHamster/avers-server
6+license: MIT
7+license-file: LICENSE
8+author: Tomas Carnecky
9+maintainer: tomas.carnecky@gmail.com
10+copyright: 2016 Tomas Carnecky
11+category: Avers
12+build-type: Simple
13+cabal-version: >=1.10
14+
15+source-repository head
16+ type: git
17+ location: https://github.com/wereHamster/avers
18+
19+library
20+ default-language: Haskell2010
21+ hs-source-dirs: src
22+ ghc-options: -Wall
23+
24+ exposed-modules:
25+ Avers.Server
26+
27+ other-modules:
28+ Avers.Server.Authorization
29+ , Avers.Server.Instances
30+
31+ build-depends:
32+ base >= 4.7 && < 5
33+ , aeson
34+ , avers
35+ , avers-api
36+ , base64-bytestring
37+ , bytestring
38+ , bytestring-conversion
39+ , containers
40+ , cookie
41+ , cryptonite
42+ , http-types
43+ , memory
44+ , mtl
45+ , resource-pool
46+ , rethinkdb-client-driver
47+ , servant
48+ , servant-server
49+ , stm
50+ , text
51+ , time
52+ , transformers
53+ , wai
54+ , wai-websockets
55+ , websockets
test/golden-test-cases/avers-server.nix.goldennew file+21
@@ -0,0 +1,21 @@
1+{ mkDerivation, aeson, avers, avers-api, base, base64-bytestring
2+, bytestring, bytestring-conversion, containers, cookie, cryptonite
3+, http-types, memory, mtl, resource-pool, rethinkdb-client-driver
4+, servant, servant-server, stdenv, stm, text, time, transformers
5+, wai, wai-websockets, websockets
6+}:
7+mkDerivation {
8+ pname = "avers-server";
9+ version = "0.1.0";
10+ sha256 = "deadbeef";
11+ libraryHaskellDepends = [
12+ aeson avers avers-api base base64-bytestring bytestring
13+ bytestring-conversion containers cookie cryptonite http-types
14+ memory mtl resource-pool rethinkdb-client-driver servant
15+ servant-server stm text time transformers wai wai-websockets
16+ websockets
17+ ];
18+ homepage = "http://github.com/wereHamster/avers-server";
19+ description = "Server implementation of the Avers API";
20+ license = stdenv.lib.licenses.mit;
21+}
test/golden-test-cases/aws.cabalnew file+430
@@ -0,0 +1,430 @@
1+Name: aws
2+Version: 0.18
3+Synopsis: Amazon Web Services (AWS) for Haskell
4+Description: Bindings for Amazon Web Services (AWS), with the aim of supporting all AWS services. To see a high level overview of the library, see the README at <https://github.com/aristidb/aws/blob/master/README.md>.
5+Homepage: http://github.com/aristidb/aws
6+License: BSD3
7+License-file: LICENSE
8+Author: Aristid Breitkreuz, contributors see README
9+Maintainer: aristidb@gmail.com
10+Copyright: See contributors list in README and LICENSE file
11+Category: Network, Web, AWS, Cloud, Distributed Computing
12+Build-type: Simple
13+
14+Extra-source-files: README.md
15+ CHANGELOG.md
16+
17+Cabal-version: >=1.10
18+
19+Source-repository this
20+ type: git
21+ location: https://github.com/aristidb/aws.git
22+ tag: 0.18
23+
24+Source-repository head
25+ type: git
26+ location: https://github.com/aristidb/aws.git
27+
28+Flag Examples
29+ Description: Build the examples.
30+ Default: False
31+
32+Library
33+ Exposed-modules:
34+ Aws
35+ Aws.Aws
36+ Aws.Core
37+ Aws.DynamoDb
38+ Aws.DynamoDb.Commands
39+ Aws.DynamoDb.Commands.BatchGetItem
40+ Aws.DynamoDb.Commands.BatchWriteItem
41+ Aws.DynamoDb.Commands.DeleteItem
42+ Aws.DynamoDb.Commands.GetItem
43+ Aws.DynamoDb.Commands.PutItem
44+ Aws.DynamoDb.Commands.Query
45+ Aws.DynamoDb.Commands.Scan
46+ Aws.DynamoDb.Commands.Table
47+ Aws.DynamoDb.Commands.UpdateItem
48+ Aws.DynamoDb.Core
49+ Aws.Ec2.InstanceMetadata
50+ Aws.Iam
51+ Aws.Iam.Commands
52+ Aws.Iam.Commands.CreateAccessKey
53+ Aws.Iam.Commands.CreateUser
54+ Aws.Iam.Commands.DeleteAccessKey
55+ Aws.Iam.Commands.DeleteUser
56+ Aws.Iam.Commands.DeleteUserPolicy
57+ Aws.Iam.Commands.GetUser
58+ Aws.Iam.Commands.GetUserPolicy
59+ Aws.Iam.Commands.ListAccessKeys
60+ Aws.Iam.Commands.ListMfaDevices
61+ Aws.Iam.Commands.ListUserPolicies
62+ Aws.Iam.Commands.ListUsers
63+ Aws.Iam.Commands.PutUserPolicy
64+ Aws.Iam.Commands.UpdateAccessKey
65+ Aws.Iam.Commands.UpdateUser
66+ Aws.Iam.Core
67+ Aws.Iam.Internal
68+ Aws.Network
69+ Aws.S3
70+ Aws.S3.Commands
71+ Aws.S3.Commands.CopyObject
72+ Aws.S3.Commands.DeleteBucket
73+ Aws.S3.Commands.DeleteObject
74+ Aws.S3.Commands.DeleteObjectVersion
75+ Aws.S3.Commands.DeleteObjects
76+ Aws.S3.Commands.GetBucket
77+ Aws.S3.Commands.GetBucketLocation
78+ Aws.S3.Commands.GetBucketObjectVersions
79+ Aws.S3.Commands.GetObject
80+ Aws.S3.Commands.GetService
81+ Aws.S3.Commands.HeadObject
82+ Aws.S3.Commands.PutBucket
83+ Aws.S3.Commands.PutObject
84+ Aws.S3.Commands.Multipart
85+ Aws.S3.Core
86+ Aws.Ses
87+ Aws.Ses.Commands
88+ Aws.Ses.Commands.DeleteIdentity
89+ Aws.Ses.Commands.GetIdentityDkimAttributes
90+ Aws.Ses.Commands.GetIdentityNotificationAttributes
91+ Aws.Ses.Commands.GetIdentityVerificationAttributes
92+ Aws.Ses.Commands.ListIdentities
93+ Aws.Ses.Commands.SendRawEmail
94+ Aws.Ses.Commands.SetIdentityDkimEnabled
95+ Aws.Ses.Commands.SetIdentityFeedbackForwardingEnabled
96+ Aws.Ses.Commands.SetIdentityNotificationTopic
97+ Aws.Ses.Commands.VerifyDomainDkim
98+ Aws.Ses.Commands.VerifyDomainIdentity
99+ Aws.Ses.Commands.VerifyEmailIdentity
100+ Aws.Ses.Core
101+ Aws.SimpleDb
102+ Aws.SimpleDb.Commands
103+ Aws.SimpleDb.Commands.Attributes
104+ Aws.SimpleDb.Commands.Domain
105+ Aws.SimpleDb.Commands.Select
106+ Aws.SimpleDb.Core
107+ Aws.Sqs
108+ Aws.Sqs.Commands
109+ Aws.Sqs.Commands.Message
110+ Aws.Sqs.Commands.Permission
111+ Aws.Sqs.Commands.Queue
112+ Aws.Sqs.Commands.QueueAttributes
113+ Aws.Sqs.Core
114+
115+ Build-depends:
116+ aeson >= 0.6,
117+ attoparsec >= 0.11 && < 0.14,
118+ base >= 4.6 && < 5,
119+ base16-bytestring == 0.1.*,
120+ base64-bytestring == 1.0.*,
121+ blaze-builder >= 0.2.1.4 && < 0.5,
122+ byteable == 0.1.*,
123+ bytestring >= 0.9 && < 0.11,
124+ case-insensitive >= 0.2 && < 1.3,
125+ cereal >= 0.3 && < 0.6,
126+ conduit >= 1.1 && < 1.3,
127+ conduit-extra >= 1.1 && < 1.3,
128+ containers >= 0.4,
129+ cryptonite >= 0.11,
130+ data-default >= 0.5.3 && < 0.8,
131+ directory >= 1.0 && < 2.0,
132+ filepath >= 1.1 && < 1.5,
133+ http-conduit >= 2.1 && < 2.3,
134+ http-types >= 0.7 && < 1.0,
135+ lifted-base >= 0.1 && < 0.3,
136+ memory,
137+ monad-control >= 0.3,
138+ mtl == 2.*,
139+ network == 2.*,
140+ old-locale == 1.*,
141+ resourcet >= 1.1 && < 1.2,
142+ safe >= 0.3 && < 0.4,
143+ scientific >= 0.3,
144+ tagged >= 0.7 && < 0.9,
145+ text >= 0.11,
146+ time >= 1.4.0 && < 2.0,
147+ transformers >= 0.2.2 && < 0.6,
148+ unordered-containers >= 0.2,
149+ utf8-string >= 0.3 && < 1.1,
150+ vector >= 0.10,
151+ xml-conduit >= 1.2 && <2.0
152+
153+ if !impl(ghc >= 7.6)
154+ Build-depends: ghc-prim
155+
156+ GHC-Options: -Wall
157+
158+ Default-Language: Haskell2010
159+ Default-Extensions:
160+ RecordWildCards,
161+ TypeFamilies,
162+ MultiParamTypeClasses,
163+ FlexibleContexts,
164+ FlexibleInstances,
165+ FunctionalDependencies,
166+ DeriveFunctor,
167+ DeriveDataTypeable,
168+ OverloadedStrings,
169+ TupleSections,
170+ ScopedTypeVariables,
171+ EmptyDataDecls,
172+ Rank2Types
173+
174+Executable GetObject
175+ Main-is: GetObject.hs
176+ Hs-source-dirs: Examples
177+
178+ if !flag(Examples)
179+ Buildable: False
180+ else
181+ Buildable: True
182+ Build-depends:
183+ base == 4.*,
184+ aws,
185+ http-conduit,
186+ conduit,
187+ conduit-extra
188+
189+ Default-Language: Haskell2010
190+
191+Executable GetObjectGoogle
192+ Main-is: GetObjectGoogle.hs
193+ Hs-source-dirs: Examples
194+
195+ if !flag(Examples)
196+ Buildable: False
197+ else
198+ Buildable: True
199+ Build-depends:
200+ base == 4.*,
201+ aws,
202+ http-conduit,
203+ conduit,
204+ conduit-extra
205+
206+ Default-Language: Haskell2010
207+
208+Executable MultipartUpload
209+ Main-is: MultipartUpload.hs
210+ Hs-source-dirs: Examples
211+
212+ if !flag(Examples)
213+ Buildable: False
214+ else
215+ Buildable: True
216+ Build-depends:
217+ base == 4.*,
218+ aws,
219+ http-conduit,
220+ conduit,
221+ conduit-extra,
222+ text,
223+ resourcet
224+
225+ Default-Language: Haskell2010
226+
227+Executable MultipartTransfer
228+ Main-is: MultipartTransfer.hs
229+ Hs-source-dirs: Examples
230+
231+ if !flag(Examples)
232+ Buildable: False
233+ else
234+ Buildable: True
235+ Build-depends:
236+ base == 4.*,
237+ aws,
238+ http-conduit,
239+ conduit,
240+ conduit-extra,
241+ text
242+
243+ Default-Language: Haskell2010
244+
245+Executable NukeBucket
246+ Main-is: NukeBucket.hs
247+ Hs-source-dirs: Examples
248+
249+ if !flag(Examples)
250+ Buildable: False
251+ else
252+ Buildable: True
253+ Build-depends:
254+ base == 4.*,
255+ aws,
256+ http-conduit,
257+ conduit,
258+ conduit-extra,
259+ text >=0.1,
260+ transformers
261+
262+ Default-Language: Haskell2010
263+
264+Executable PutBucketNearLine
265+ Main-is: PutBucketNearLine.hs
266+ Hs-source-dirs: Examples
267+
268+ if !flag(Examples)
269+ Buildable: False
270+ else
271+ Buildable: True
272+ Build-depends:
273+ base == 4.*,
274+ aws,
275+ http-conduit,
276+ conduit,
277+ conduit-extra,
278+ text >=0.1,
279+ transformers
280+
281+ Default-Language: Haskell2010
282+
283+Executable SimpleDb
284+ Main-is: SimpleDb.hs
285+ Hs-source-dirs: Examples
286+
287+ if !flag(Examples)
288+ Buildable: False
289+ else
290+ Buildable: True
291+ Build-depends:
292+ base == 4.*,
293+ aws,
294+ text >=0.11
295+
296+ Default-Language: Haskell2010
297+
298+Executable DynamoDb
299+ Main-is: DynamoDb.hs
300+ Hs-source-dirs: Examples
301+
302+ if !flag(Examples)
303+ Buildable: False
304+ else
305+ Buildable: True
306+ Build-depends:
307+ aws,
308+ base == 4.*,
309+ data-default,
310+ exceptions,
311+ http-conduit,
312+ text,
313+ conduit
314+
315+ Default-Language: Haskell2010
316+
317+
318+Executable Sqs
319+ Main-is: Sqs.hs
320+ Hs-source-dirs: Examples
321+
322+ if !flag(Examples)
323+ Buildable: False
324+ else
325+ Buildable: True
326+ Build-depends:
327+ base == 4.*,
328+ aws,
329+ errors >= 2.0,
330+ text >=0.11,
331+ transformers >= 0.3
332+
333+ Default-Language: Haskell2010
334+
335+test-suite sqs-tests
336+ type: exitcode-stdio-1.0
337+ default-language: Haskell2010
338+ hs-source-dirs: tests
339+ main-is: Sqs/Main.hs
340+
341+ other-modules:
342+ Utils
343+
344+ build-depends:
345+ QuickCheck >= 2.7,
346+ aeson >= 0.7,
347+ aws,
348+ base == 4.*,
349+ bytestring >= 0.10,
350+ errors >= 2.0,
351+ http-client >= 0.3 && < 0.6,
352+ lifted-base >= 0.2,
353+ monad-control >= 0.3,
354+ mtl >= 2.1,
355+ quickcheck-instances >= 0.3,
356+ resourcet >= 1.1,
357+ tagged >= 0.7,
358+ tasty >= 0.8,
359+ tasty-quickcheck >= 0.8,
360+ text >= 1.1,
361+ time,
362+ transformers >= 0.3,
363+ transformers-base >= 0.4
364+
365+ ghc-options: -Wall -threaded
366+
367+test-suite dynamodb-tests
368+ type: exitcode-stdio-1.0
369+ default-language: Haskell2010
370+ hs-source-dirs: tests
371+ main-is: DynamoDb/Main.hs
372+
373+ other-modules:
374+ Utils
375+ DynamoDb.Utils
376+
377+ build-depends:
378+ QuickCheck >= 2.7,
379+ aeson >= 0.7,
380+ aws,
381+ base == 4.*,
382+ bytestring >= 0.10,
383+ errors >= 2.0,
384+ http-client >= 0.3,
385+ lifted-base >= 0.2,
386+ monad-control >= 0.3,
387+ mtl >= 2.1,
388+ quickcheck-instances >= 0.3,
389+ resourcet >= 1.1,
390+ tagged >= 0.7,
391+ tasty >= 0.8,
392+ tasty-quickcheck >= 0.8,
393+ text >= 1.1,
394+ time,
395+ transformers >= 0.3,
396+ transformers-base >= 0.4
397+
398+
399+test-suite s3-tests
400+ type: exitcode-stdio-1.0
401+ default-language: Haskell2010
402+ hs-source-dirs: tests
403+ main-is: S3/Main.hs
404+
405+ other-modules:
406+ Utils
407+
408+ build-depends:
409+ aws,
410+ base == 4.*,
411+ QuickCheck >= 2.7,
412+ aeson >= 0.7,
413+ bytestring,
414+ conduit-combinators,
415+ errors >= 2.0,
416+ lifted-base >= 0.2,
417+ monad-control >= 0.3,
418+ mtl >= 2.1,
419+ http-client < 0.6,
420+ http-client-tls < 0.5,
421+ http-types,
422+ resourcet,
423+ tasty >= 0.8,
424+ tasty-hunit >= 0.8,
425+ tasty-quickcheck >= 0.8,
426+ text,
427+ time,
428+ tagged >= 0.7,
429+ transformers >= 0.3,
430+ transformers-base >= 0.4
test/golden-test-cases/aws.nix.goldennew file+35
@@ -0,0 +1,35 @@
1+{ mkDerivation, aeson, attoparsec, base, base16-bytestring
2+, base64-bytestring, blaze-builder, byteable, bytestring
3+, case-insensitive, cereal, conduit, conduit-combinators
4+, conduit-extra, containers, cryptonite, data-default, directory
5+, errors, filepath, http-client, http-client-tls, http-conduit
6+, http-types, lifted-base, memory, monad-control, mtl, network
7+, old-locale, QuickCheck, quickcheck-instances, resourcet, safe
8+, scientific, stdenv, tagged, tasty, tasty-hunit, tasty-quickcheck
9+, text, time, transformers, transformers-base, unordered-containers
10+, utf8-string, vector, xml-conduit
11+}:
12+mkDerivation {
13+ pname = "aws";
14+ version = "0.18";
15+ sha256 = "deadbeef";
16+ isLibrary = true;
17+ isExecutable = true;
18+ libraryHaskellDepends = [
19+ aeson attoparsec base base16-bytestring base64-bytestring
20+ blaze-builder byteable bytestring case-insensitive cereal conduit
21+ conduit-extra containers cryptonite data-default directory filepath
22+ http-conduit http-types lifted-base memory monad-control mtl
23+ network old-locale resourcet safe scientific tagged text time
24+ transformers unordered-containers utf8-string vector xml-conduit
25+ ];
26+ testHaskellDepends = [
27+ aeson base bytestring conduit-combinators errors http-client
28+ http-client-tls http-types lifted-base monad-control mtl QuickCheck
29+ quickcheck-instances resourcet tagged tasty tasty-hunit
30+ tasty-quickcheck text time transformers transformers-base
31+ ];
32+ homepage = "http://github.com/aristidb/aws";
33+ description = "Amazon Web Services (AWS) for Haskell";
34+ license = stdenv.lib.licenses.bsd3;
35+}
test/golden-test-cases/bbdb.cabalnew file+54
@@ -0,0 +1,54 @@
1+Name: bbdb
2+Version: 0.8
3+Synopsis: Ability to read, write, and modify BBDB files
4+Description: BBDB (http://savannah.nongnu.org/projects/bbdb/) is a
5+ contact management utility that can be used with
6+ emacs. It stores its data internally as a lisp
7+ expression. This module parses the lisp and
8+ provides some convenience functions to get at and
9+ manipulate the data all from within Haskell. See
10+ the hackage docs for usage and examples.
11+
12+Homepage: https://github.com/henrylaxen/bbdb
13+License: GPL-3
14+License-file: LICENSE
15+Author: Henry Laxen
16+Copyright: Henry Laxen
17+Maintainer: nadine.and.henry@pobox.com
18+Stability: stable
19+Bug-reports: mailto:nadine.and.henry@pobox.com
20+Category: Database
21+Build-type: Simple
22+Extra-source-files: changelog.md
23+ LICENSE
24+ README.md
25+ test/sampleData.txt
26+
27+Cabal-version: >=1.10
28+
29+Library
30+ Exposed-modules: Database.BBDB
31+ hs-source-dirs: src
32+ ghc-options: -Wall
33+ default-language: Haskell2010
34+ default-extensions: FlexibleInstances,
35+ MultiParamTypeClasses,
36+ OverloadedStrings
37+ Build-depends:
38+ base >= 3 && <= 5,
39+ parsec >= 3
40+
41+Test-Suite bbdb-tests
42+ Type: exitcode-stdio-1.0
43+ Main-is: Spec.hs
44+ hs-source-dirs: src,test
45+ Other-modules: Database.BBDB,
46+ BBDBSpec
47+ default-language: Haskell2010
48+ default-extensions: FlexibleInstances,
49+ MultiParamTypeClasses,
50+ OverloadedStrings
51+ Build-depends:
52+ base >= 3 && <= 5,
53+ hspec,
54+ parsec >= 3
test/golden-test-cases/bbdb.nix.goldennew file+11
@@ -0,0 +1,11 @@
1+{ mkDerivation, base, hspec, parsec, stdenv }:
2+mkDerivation {
3+ pname = "bbdb";
4+ version = "0.8";
5+ sha256 = "deadbeef";
6+ libraryHaskellDepends = [ base parsec ];
7+ testHaskellDepends = [ base hspec parsec ];
8+ homepage = "https://github.com/henrylaxen/bbdb";
9+ description = "Ability to read, write, and modify BBDB files";
10+ license = stdenv.lib.licenses.gpl3;
11+}
test/golden-test-cases/benchpress.cabalnew file+41
@@ -0,0 +1,41 @@
1+name: benchpress
2+version: 0.2.2.10
3+synopsis: Micro-benchmarking with detailed statistics.
4+Description: Benchmarks actions and produces statistics
5+ such as min, mean, median, standard deviation,
6+ and max execution time. Also computes
7+ execution time percentiles. Comes with
8+ functions to pretty-print the results.
9+license: BSD3
10+license-file: LICENSE
11+author: Johan Tibell
12+maintainer: me@willsewell.com
13+build-type: Simple
14+cabal-version: >= 1.2
15+category: Testing
16+homepage: https://github.com/WillSewell/benchpress
17+
18+library
19+ exposed-modules: Test.BenchPress
20+
21+ other-modules: Math.Statistics
22+
23+ build-depends: base >= 2.0 && < 4.11,
24+ mtl >= 1 && < 2.3,
25+ time >= 1 && < 1.10
26+
27+ ghc-options: -funbox-strict-fields -Wall
28+
29+executable example
30+ main-is: Main.hs
31+
32+ -- This is not in build-depends for cabal 1.2 compatibility (requires 1.8)
33+ other-modules: Test.BenchPress
34+ Math.Statistics
35+
36+ hs-source-dirs: example, .
37+
38+ build-depends: base,
39+ bytestring
40+
41+ ghc-options: -funbox-strict-fields -Wall
test/golden-test-cases/benchpress.nix.goldennew file+13
@@ -0,0 +1,13 @@
1+{ mkDerivation, base, bytestring, mtl, stdenv, time }:
2+mkDerivation {
3+ pname = "benchpress";
4+ version = "0.2.2.10";
5+ sha256 = "deadbeef";
6+ isLibrary = true;
7+ isExecutable = true;
8+ libraryHaskellDepends = [ base mtl time ];
9+ executableHaskellDepends = [ base bytestring ];
10+ homepage = "https://github.com/WillSewell/benchpress";
11+ description = "Micro-benchmarking with detailed statistics";
12+ license = stdenv.lib.licenses.bsd3;
13+}
test/golden-test-cases/binary-bits.cabalnew file+44
@@ -0,0 +1,44 @@
1+-- http://www.haskell.org/cabal/release/cabal-latest/doc/users-guide/
2+name: binary-bits
3+version: 0.5
4+synopsis: Bit parsing/writing on top of binary.
5+description: Bit parsing/writing on top of binary. Provides functions to
6+ read and write bits to and from 8\/16\/32\/64 words.
7+license: BSD3
8+license-file: LICENSE
9+author: Lennart Kolmodin <kolmodin@gmail.com>
10+maintainer: Lennart Kolmodin <kolmodin@gmail.com>
11+category: Data, Parsing
12+build-type: Simple
13+
14+cabal-version: >=1.10
15+
16+source-repository head
17+ type: git
18+ location: git://github.com/kolmodin/binary-bits.git
19+
20+library
21+ build-depends: base==4.*, binary >= 0.6.0.0, bytestring
22+
23+ other-extensions: RankNTypes, MagicHash, BangPatterns, CPP
24+
25+ exposed-modules: Data.Binary.Bits ,
26+ Data.Binary.Bits.Put ,
27+ Data.Binary.Bits.Get
28+
29+ default-language: Haskell98
30+
31+ ghc-options: -O2 -Wall
32+
33+test-suite qc
34+ type: exitcode-stdio-1.0
35+ main-is: BitsQC.hs
36+ default-language: Haskell98
37+
38+ build-depends: base==4.*, binary >= 0.6.0.0, bytestring,
39+ QuickCheck>=2, random,
40+ test-framework,
41+ test-framework-quickcheck2
42+
43+ other-extensions: RankNTypes, MagicHash, BangPatterns, CPP,
44+ FlexibleInstances, FlexibleContexts, TupleSections
test/golden-test-cases/binary-bits.nix.goldennew file+15
@@ -0,0 +1,15 @@
1+{ mkDerivation, base, binary, bytestring, QuickCheck, random
2+, stdenv, test-framework, test-framework-quickcheck2
3+}:
4+mkDerivation {
5+ pname = "binary-bits";
6+ version = "0.5";
7+ sha256 = "deadbeef";
8+ libraryHaskellDepends = [ base binary bytestring ];
9+ testHaskellDepends = [
10+ base binary bytestring QuickCheck random test-framework
11+ test-framework-quickcheck2
12+ ];
13+ description = "Bit parsing/writing on top of binary";
14+ license = stdenv.lib.licenses.bsd3;
15+}
test/golden-test-cases/binary-tagged.cabalnew file+121
@@ -0,0 +1,121 @@
1+-- This file has been generated from package.yaml by hpack version 0.14.1.
2+--
3+-- see: https://github.com/sol/hpack
4+
5+name: binary-tagged
6+version: 0.1.4.2
7+synopsis: Tagged binary serialisation.
8+description: Check <https://github.com/phadej/binary-tagged#readme README on Github>
9+category: Web
10+homepage: https://github.com/phadej/binary-tagged#readme
11+bug-reports: https://github.com/phadej/binary-tagged/issues
12+author: Oleg Grenrus <oleg.grenrus@iki.fi>
13+maintainer: Oleg Grenrus <oleg.grenrus@iki.fi>
14+license: BSD3
15+license-file: LICENSE
16+tested-with: GHC==7.8.4, GHC==7.10.3, GHC==8.0.1
17+build-type: Simple
18+cabal-version: >= 1.10
19+
20+extra-source-files:
21+ CHANGELOG.md
22+ README.md
23+
24+source-repository head
25+ type: git
26+ location: https://github.com/phadej/binary-tagged
27+
28+library
29+ hs-source-dirs:
30+ src
31+ ghc-options: -Wall
32+ build-depends:
33+ base >=4.7 && <4.10
34+ , aeson >=0.8 && <1.1
35+ , array >=0.5 && <0.6
36+ , base16-bytestring >=0.1.1.6 && <0.2
37+ , binary >=0.7 && <0.9
38+ , bytestring >=0.10 && <0.11
39+ , containers >=0.5 && <0.6
40+ , generics-sop >=0.1 && <0.3
41+ , hashable >=1.2 && <1.3
42+ , nats >=1 && <1.2
43+ , scientific >=0.3 && <0.4
44+ , SHA >=1.6 && <1.7
45+ , semigroups >=0.16 && <0.19
46+ , tagged >=0.7 && <0.9
47+ , text >=1.2 && <1.3
48+ , time >=1.4 && <1.7
49+ , unordered-containers >=0.2 && <0.3
50+ , vector >=0.10 && <0.12
51+ exposed-modules:
52+ Data.Binary.Tagged
53+ default-language: Haskell2010
54+
55+test-suite binary-tagged-test
56+ type: exitcode-stdio-1.0
57+ main-is: Tests.hs
58+ hs-source-dirs:
59+ test
60+ ghc-options: -Wall
61+ build-depends:
62+ base >=4.7 && <4.10
63+ , aeson >=0.8 && <1.1
64+ , array >=0.5 && <0.6
65+ , base16-bytestring >=0.1.1.6 && <0.2
66+ , binary >=0.7 && <0.9
67+ , bytestring >=0.10 && <0.11
68+ , containers >=0.5 && <0.6
69+ , generics-sop >=0.1 && <0.3
70+ , hashable >=1.2 && <1.3
71+ , nats >=1 && <1.2
72+ , scientific >=0.3 && <0.4
73+ , SHA >=1.6 && <1.7
74+ , semigroups >=0.16 && <0.19
75+ , tagged >=0.7 && <0.9
76+ , text >=1.2 && <1.3
77+ , time >=1.4 && <1.7
78+ , unordered-containers >=0.2 && <0.3
79+ , vector >=0.10 && <0.12
80+ , binary-tagged
81+ , binary-orphans >=0.1.1
82+ , bifunctors
83+ , quickcheck-instances
84+ , tasty
85+ , tasty-quickcheck
86+ other-modules:
87+ Generators
88+ Rec1
89+ Rec2
90+ default-language: Haskell2010
91+
92+benchmark binary-tagged-bench
93+ type: exitcode-stdio-1.0
94+ main-is: Bench.hs
95+ hs-source-dirs:
96+ bench
97+ ghc-options: -Wall
98+ build-depends:
99+ base >=4.7 && <4.10
100+ , aeson >=0.8 && <1.1
101+ , array >=0.5 && <0.6
102+ , base16-bytestring >=0.1.1.6 && <0.2
103+ , binary >=0.7 && <0.9
104+ , bytestring >=0.10 && <0.11
105+ , containers >=0.5 && <0.6
106+ , generics-sop >=0.1 && <0.3
107+ , hashable >=1.2 && <1.3
108+ , nats >=1 && <1.2
109+ , scientific >=0.3 && <0.4
110+ , SHA >=1.6 && <1.7
111+ , semigroups >=0.16 && <0.19
112+ , tagged >=0.7 && <0.9
113+ , text >=1.2 && <1.3
114+ , time >=1.4 && <1.7
115+ , unordered-containers >=0.2 && <0.3
116+ , vector >=0.10 && <0.12
117+ , binary-tagged
118+ , binary-orphans >=0.1.1
119+ , deepseq
120+ , criterion
121+ default-language: Haskell2010
test/golden-test-cases/binary-tagged.nix.goldennew file+30
@@ -0,0 +1,30 @@
1+{ mkDerivation, aeson, array, base, base16-bytestring, bifunctors
2+, binary, binary-orphans, bytestring, containers, criterion
3+, deepseq, generics-sop, hashable, nats, quickcheck-instances
4+, scientific, semigroups, SHA, stdenv, tagged, tasty
5+, tasty-quickcheck, text, time, unordered-containers, vector
6+}:
7+mkDerivation {
8+ pname = "binary-tagged";
9+ version = "0.1.4.2";
10+ sha256 = "deadbeef";
11+ libraryHaskellDepends = [
12+ aeson array base base16-bytestring binary bytestring containers
13+ generics-sop hashable nats scientific semigroups SHA tagged text
14+ time unordered-containers vector
15+ ];
16+ testHaskellDepends = [
17+ aeson array base base16-bytestring bifunctors binary binary-orphans
18+ bytestring containers generics-sop hashable nats
19+ quickcheck-instances scientific semigroups SHA tagged tasty
20+ tasty-quickcheck text time unordered-containers vector
21+ ];
22+ benchmarkHaskellDepends = [
23+ aeson array base base16-bytestring binary binary-orphans bytestring
24+ containers criterion deepseq generics-sop hashable nats scientific
25+ semigroups SHA tagged text time unordered-containers vector
26+ ];
27+ homepage = "https://github.com/phadej/binary-tagged#readme";
28+ description = "Tagged binary serialisation";
29+ license = stdenv.lib.licenses.bsd3;
30+}
test/golden-test-cases/bindings-uname.cabalnew file+30
@@ -0,0 +1,30 @@
1+Name: bindings-uname
2+Version: 0.1
3+Synopsis: Low-level binding to POSIX uname(3)
4+Description:
5+ This is a low-level binding to POSIX uname(3)
6+ function. Perhaps it shoule be part of unix package.
7+Category: FFI, System
8+License: PublicDomain
9+Author: PHO <pho at cielonegro.org>
10+Maintainer: PHO <pho at cielonegro.org>
11+Stability: Experimental
12+Cabal-Version: >= 1.6
13+Build-Type: Simple
14+
15+Source-Repository head
16+ Type: git
17+ Location: git://git.cielonegro.org/bindings-uname
18+
19+Library
20+ Build-Depends:
21+ base < 5
22+
23+ Exposed-Modules:
24+ Bindings.Uname
25+
26+ Extensions:
27+ EmptyDataDecls, ForeignFunctionInterface
28+
29+ GHC-Options:
30+ -Wall
test/golden-test-cases/bindings-uname.nix.goldennew file+9
@@ -0,0 +1,9 @@
1+{ mkDerivation, base, stdenv }:
2+mkDerivation {
3+ pname = "bindings-uname";
4+ version = "0.1";
5+ sha256 = "deadbeef";
6+ libraryHaskellDepends = [ base ];
7+ description = "Low-level binding to POSIX uname(3)";
8+ license = stdenv.lib.licenses.publicDomain;
9+}
test/golden-test-cases/bioalign.cabalnew file+23
@@ -0,0 +1,23 @@
1+Name: bioalign
2+Version: 0.0.5
3+Synopsis: Data structures and helper functions for calculating alignments
4+Description: Data structures and helper functions for calculating alignments
5+Homepage: https://patch-tag.com/r/dfornika/biophd/home
6+License: GPL
7+License-file: LICENSE
8+Cabal-Version: >=1.6
9+Author: Dan Fornika <dfornika@gmail.com>
10+Maintainer: dfornika@gmail.com
11+Stability: Provisional
12+Category: Bioinformatics
13+Build-Type: Simple
14+
15+Library
16+ Build-depends: base >= 2 && < 5, biocore, bytestring
17+ Exposed-modules: Bio.Alignment.AlignData
18+ Hs-source-dirs: src
19+
20+source-Repository head
21+ type: darcs
22+ location: http://www.patch-tag.com/r/dfornika/bioalign
23+
test/golden-test-cases/bioalign.nix.goldennew file+10
@@ -0,0 +1,10 @@
1+{ mkDerivation, base, biocore, bytestring, stdenv }:
2+mkDerivation {
3+ pname = "bioalign";
4+ version = "0.0.5";
5+ sha256 = "deadbeef";
6+ libraryHaskellDepends = [ base biocore bytestring ];
7+ homepage = "https://patch-tag.com/r/dfornika/biophd/home";
8+ description = "Data structures and helper functions for calculating alignments";
9+ license = "GPL";
10+}
test/golden-test-cases/bits.cabalnew file+73
@@ -0,0 +1,73 @@
1+name: bits
2+category: Data, Serialization
3+version: 0.5.1
4+license: BSD3
5+cabal-version: >= 1.8
6+license-file: LICENSE
7+author: Edward A. Kmett
8+maintainer: Edward A. Kmett <ekmett@gmail.com>
9+stability: experimental
10+homepage: http://github.com/ekmett/bits
11+bug-reports: http://github.com/ekmett/bits/issues
12+copyright: Copyright (C) 2013 Edward A. Kmett
13+build-type: Custom
14+tested-with: GHC == 7.8.4, GHC == 7.10.3, GHC == 8.0.2, GHC == 8.2.1
15+synopsis: Various bit twiddling and bitwise serialization primitives
16+description: Various bit twiddling and bitwise serialization primitives
17+
18+extra-source-files:
19+ .travis.yml
20+ .ghci
21+ .gitignore
22+ .vim.custom
23+ travis/cabal-apt-install
24+ travis/config
25+ AUTHORS.markdown
26+ README.markdown
27+ CHANGELOG.markdown
28+
29+source-repository head
30+ type: git
31+ location: git://github.com/ekmett/bits.git
32+
33+custom-setup
34+ setup-depends:
35+ base >= 4 && < 5,
36+ Cabal,
37+ cabal-doctest >= 1 && < 1.1
38+
39+-- You can disable the doctests test suite with -f-test-doctests
40+flag test-doctests
41+ default: True
42+ manual: True
43+
44+library
45+ build-depends:
46+ base >= 4.7 && < 5,
47+ bytes >= 0.11 && < 1,
48+ mtl >= 2.0 && < 2.3,
49+ transformers >= 0.2 && < 0.6
50+
51+ exposed-modules:
52+ Data.Bits.Coding
53+ Data.Bits.Coded
54+ Data.Bits.Extras
55+
56+ c-sources: cbits/debruijn.c
57+ ghc-options: -Wall -fwarn-tabs -O2
58+ hs-source-dirs: src
59+
60+test-suite doctests
61+ type: exitcode-stdio-1.0
62+ main-is: doctests.hs
63+ ghc-options: -Wall -threaded
64+ hs-source-dirs: tests
65+ c-sources: cbits/debruijn.c
66+
67+ if !flag(test-doctests)
68+ buildable: False
69+ else
70+ build-depends:
71+ base,
72+ bits,
73+ doctest >= 0.11.1 && < 0.12
test/golden-test-cases/bits.nix.goldennew file+14
@@ -0,0 +1,14 @@
1+{ mkDerivation, base, bytes, Cabal, cabal-doctest, doctest, mtl
2+, stdenv, transformers
3+}:
4+mkDerivation {
5+ pname = "bits";
6+ version = "0.5.1";
7+ sha256 = "deadbeef";
8+ setupHaskellDepends = [ base Cabal cabal-doctest ];
9+ libraryHaskellDepends = [ base bytes mtl transformers ];
10+ testHaskellDepends = [ base doctest ];
11+ homepage = "http://github.com/ekmett/bits";
12+ description = "Various bit twiddling and bitwise serialization primitives";
13+ license = stdenv.lib.licenses.bsd3;
14+}
test/golden-test-cases/blank-canvas.cabalnew file+172
@@ -0,0 +1,172 @@
1+Name: blank-canvas
2+Version: 0.6.1
3+Synopsis: HTML5 Canvas Graphics Library
4+
5+Description: @blank-canvas@ is a Haskell binding to the complete
6+ <https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API HTML5 Canvas API>.
7+ @blank-canvas@ allows Haskell users to write, in Haskell,
8+ interactive images onto their web browsers. @blank-canvas@
9+ gives the user a single full-window canvas, and provides
10+ many well-documented functions for rendering
11+ images.
12+ .
13+ @
14+ &#123;-&#35; LANGUAGE OverloadedStrings &#35;-&#125;
15+ module Main where
16+ import Graphics.Blank -- import the blank canvas
17+ .
18+ main = blankCanvas 3000 $ \\ context -> do -- start blank canvas on port 3000
19+ &#32;&#32;send context $ do -- send commands to this specific context
20+ &#32;&#32;&#32;&#32;moveTo(50,50)
21+ &#32;&#32;&#32;&#32;lineTo(200,100)
22+ &#32;&#32;&#32;&#32;lineWidth 10
23+ &#32;&#32;&#32;&#32;strokeStyle \"red\"
24+ &#32;&#32;&#32;&#32;stroke() -- this draws the ink into the canvas
25+ @
26+ .
27+ <<https://github.com/ku-fpg/blank-canvas/wiki/images/Red_Line.png>>
28+ .
29+ For more details, read the <https://github.com/ku-fpg/blank-canvas/wiki blank-canvas wiki>.
30+ .
31+License: BSD3
32+License-file: LICENSE
33+Author: Andy Gill and Ryan Scott
34+Maintainer: andygill@ku.edu
35+Copyright: Copyright (c) 2014 The University of Kansas
36+Homepage: https://github.com/ku-fpg/blank-canvas/wiki
37+Bug-reports: https://github.com/ku-fpg/blank-canvas/issues
38+Category: Graphics
39+Build-type: Simple
40+Stability: Beta
41+Extra-source-files: README.md
42+ Changelog.md
43+Cabal-version: >= 1.10
44+tested-with: GHC == 7.8.4, GHC == 7.10.3, GHC == 8.0.2
45+data-files:
46+ static/index.html
47+ static/jquery.js
48+ static/jquery-json.js
49+
50+
51+Library
52+ Exposed-modules: Graphics.Blank
53+ Graphics.Blank.Cursor
54+ Graphics.Blank.Font
55+ Graphics.Blank.GHCi
56+ Graphics.Blank.Style
57+ other-modules: Graphics.Blank.Canvas
58+ Graphics.Blank.DeviceContext
59+ Graphics.Blank.Events
60+ Graphics.Blank.Generated
61+ Graphics.Blank.JavaScript
62+ Graphics.Blank.Parser
63+ Graphics.Blank.Types
64+ Graphics.Blank.Types.CSS
65+ Graphics.Blank.Types.Cursor
66+ Graphics.Blank.Types.Font
67+ Graphics.Blank.Utils
68+ Paths_blank_canvas
69+
70+ default-language: Haskell2010
71+ build-depends: aeson >= 0.7 && < 1.3,
72+ base64-bytestring == 1.0.*,
73+ base >= 4.7 && < 4.11,
74+ base-compat >= 0.8.1 && < 1,
75+ bytestring == 0.10.*,
76+ colour >= 2.2 && < 3.0,
77+ containers == 0.5.*,
78+ data-default-class >= 0.0.1 && < 0.2,
79+ http-types >= 0.8 && < 0.10,
80+ mime-types >= 0.1.0.3 && < 0.2,
81+ kansas-comet >= 0.4 && < 0.5,
82+ scotty >= 0.10 && < 0.12,
83+ stm >= 2.2 && < 2.5,
84+ text >= 1.1 && < 1.3,
85+ text-show >= 2 && < 4,
86+ transformers >= 0.3 && < 0.6,
87+ wai == 3.*,
88+ wai-extra >= 3.0.1 && < 3.1,
89+ warp == 3.*,
90+ vector >= 0.10 && < 0.13
91+
92+ GHC-options: -Wall
93+ GHC-prof-options: -Wall -fsimpl-tick-factor=100000
94+
95+
96+test-suite wiki-suite
97+ build-depends: base >= 4.7 && < 4.11,
98+ blank-canvas,
99+ containers == 0.5.*,
100+ process >= 1.2 && < 1.7,
101+ directory >= 1.2,
102+ shake >= 0.13,
103+ stm >= 2.2 && < 2.5,
104+ text >= 1.1 && < 1.3,
105+ time >= 1.4 && < 1.9,
106+ unix == 2.7.*,
107+ vector >= 0.10 && < 0.13
108+
109+ default-language: Haskell2010
110+ GHC-options: -threaded -Wall
111+ main-is: Main.hs
112+ hs-source-dirs: wiki-suite
113+ type: exitcode-stdio-1.0
114+ other-modules: Arc
115+ Bezier_Curve
116+ Bounce
117+ Circle
118+ Clipping_Region
119+ Color_Fill
120+ Color_Square
121+ Custom_Shape
122+ Custom_Transform
123+ Draw_Canvas
124+ Draw_Device
125+ Draw_Image
126+ Favicon
127+ Font_Size_and_Style
128+ Get_Image_Data_URL
129+ Global_Alpha
130+ Global_Composite_Operations
131+ Grayscale
132+ Image_Crop
133+ Image_Loader
134+ Image_Size
135+ Is_Point_In_Path
136+ Key_Read
137+ Line
138+ Line_Cap
139+ Line_Color
140+ Line_Join
141+ Line_Width
142+ Linear_Gradient
143+ Load_Image_Data_URL
144+ Load_Image_Data_URL_2
145+ Miter_Limit
146+ Path
147+ Pattern
148+ Quadratic_Curve
149+ Radial_Gradient
150+ Rectangle
151+ Red_Line
152+ Rotate_Transform
153+ Rotating_Square
154+ Rounded_Corners
155+ Scale_Transform
156+ Semicircle
157+ Shadow
158+ Square
159+ Text_Align
160+ Text_Baseline
161+ Text_Color
162+ Text_Metrics
163+ Text_Stroke
164+ Text_Wrap
165+ Tic_Tac_Toe
166+ Translate_Transform
167+ Wiki
168+
169+
170+source-repository head
171+ type: git
172+ location: https://github.com/ku-fpg/blank-canvas.git
test/golden-test-cases/blank-canvas.nix.goldennew file+23
@@ -0,0 +1,23 @@
1+{ mkDerivation, aeson, base, base-compat, base64-bytestring
2+, bytestring, colour, containers, data-default-class, directory
3+, http-types, kansas-comet, mime-types, process, scotty, shake
4+, stdenv, stm, text, text-show, time, transformers, unix, vector
5+, wai, wai-extra, warp
6+}:
7+mkDerivation {
8+ pname = "blank-canvas";
9+ version = "0.6.1";
10+ sha256 = "deadbeef";
11+ enableSeparateDataOutput = true;
12+ libraryHaskellDepends = [
13+ aeson base base-compat base64-bytestring bytestring colour
14+ containers data-default-class http-types kansas-comet mime-types
15+ scotty stm text text-show transformers vector wai wai-extra warp
16+ ];
17+ testHaskellDepends = [
18+ base containers directory process shake stm text time unix vector
19+ ];
20+ homepage = "https://github.com/ku-fpg/blank-canvas/wiki";
21+ description = "HTML5 Canvas Graphics Library";
22+ license = stdenv.lib.licenses.bsd3;
23+}
test/golden-test-cases/blaze-html.cabalnew file+87
@@ -0,0 +1,87 @@
1+Name: blaze-html
2+Version: 0.9.0.1
3+Homepage: http://jaspervdj.be/blaze
4+Bug-Reports: http://github.com/jaspervdj/blaze-html/issues
5+License: BSD3
6+License-file: LICENSE
7+Author: Jasper Van der Jeugt, Simon Meier
8+Maintainer: Jasper Van der Jeugt <m@jaspervdj.be>
9+Stability: Experimental
10+Category: Text
11+Synopsis: A blazingly fast HTML combinator library for Haskell
12+Description:
13+ A blazingly fast HTML combinator library for the Haskell
14+ programming language. The Text.Blaze module is a good
15+ starting point, as well as this tutorial:
16+ <http://jaspervdj.be/blaze/tutorial.html>.
17+
18+Build-type: Simple
19+Cabal-version: >= 1.8
20+
21+Extra-source-files:
22+ CHANGELOG
23+ src/Util/Sanitize.hs
24+ src/Util/GenerateHtmlCombinators.hs
25+
26+Library
27+ Hs-source-dirs: src
28+ Ghc-Options: -Wall
29+
30+ Exposed-modules:
31+ Text.Blaze.Html
32+ Text.Blaze.Html.Renderer.Pretty
33+ Text.Blaze.Html.Renderer.String
34+ Text.Blaze.Html.Renderer.Text
35+ Text.Blaze.Html.Renderer.Utf8
36+ Text.Blaze.Html4.FrameSet
37+ Text.Blaze.Html4.FrameSet.Attributes
38+ Text.Blaze.Html4.Strict
39+ Text.Blaze.Html4.Strict.Attributes
40+ Text.Blaze.Html4.Transitional
41+ Text.Blaze.Html4.Transitional.Attributes
42+ Text.Blaze.Html5
43+ Text.Blaze.Html5.Attributes
44+ Text.Blaze.XHtml1.FrameSet
45+ Text.Blaze.XHtml1.FrameSet.Attributes
46+ Text.Blaze.XHtml1.Strict
47+ Text.Blaze.XHtml1.Strict.Attributes
48+ Text.Blaze.XHtml1.Transitional
49+ Text.Blaze.XHtml1.Transitional.Attributes
50+ Text.Blaze.XHtml5
51+ Text.Blaze.XHtml5.Attributes
52+
53+ Build-depends:
54+ base >= 4 && < 5,
55+ blaze-builder >= 0.3 && < 0.5,
56+ blaze-markup >= 0.8 && < 0.9,
57+ bytestring >= 0.9 && < 0.11,
58+ text >= 0.10 && < 1.3
59+
60+Test-suite blaze-html-tests
61+ Type: exitcode-stdio-1.0
62+ Hs-source-dirs: src tests
63+ Main-is: TestSuite.hs
64+ Ghc-options: -Wall
65+
66+ Other-modules:
67+ Text.Blaze.Html.Tests
68+ Text.Blaze.Html.Tests.Util
69+ Util.Tests
70+
71+ Build-depends:
72+ HUnit >= 1.2 && < 1.6,
73+ QuickCheck >= 2.4 && < 2.10,
74+ containers >= 0.3 && < 0.6,
75+ test-framework >= 0.4 && < 0.9,
76+ test-framework-hunit >= 0.3 && < 0.4,
77+ test-framework-quickcheck2 >= 0.3 && < 0.4,
78+ -- Copied from regular dependencies...
79+ base >= 4 && < 5,
80+ blaze-builder >= 0.3 && < 0.5,
81+ blaze-markup >= 0.8 && < 0.9,
82+ bytestring >= 0.9 && < 0.11,
83+ text >= 0.10 && < 1.3
84+
85+Source-repository head
86+ Type: git
87+ Location: http://github.com/jaspervdj/blaze-html.git
test/golden-test-cases/blaze-html.nix.goldennew file+20
@@ -0,0 +1,20 @@
1+{ mkDerivation, base, blaze-builder, blaze-markup, bytestring
2+, containers, HUnit, QuickCheck, stdenv, test-framework
3+, test-framework-hunit, test-framework-quickcheck2, text
4+}:
5+mkDerivation {
6+ pname = "blaze-html";
7+ version = "0.9.0.1";
8+ sha256 = "deadbeef";
9+ libraryHaskellDepends = [
10+ base blaze-builder blaze-markup bytestring text
11+ ];
12+ testHaskellDepends = [
13+ base blaze-builder blaze-markup bytestring containers HUnit
14+ QuickCheck test-framework test-framework-hunit
15+ test-framework-quickcheck2 text
16+ ];
17+ homepage = "http://jaspervdj.be/blaze";
18+ description = "A blazingly fast HTML combinator library for Haskell";
19+ license = stdenv.lib.licenses.bsd3;
20+}
test/golden-test-cases/blaze-markup.cabalnew file+67
@@ -0,0 +1,67 @@
1+Name: blaze-markup
2+Version: 0.8.0.0
3+Homepage: http://jaspervdj.be/blaze
4+Bug-Reports: http://github.com/jaspervdj/blaze-markup/issues
5+License: BSD3
6+License-file: LICENSE
7+Author: Jasper Van der Jeugt, Simon Meier, Deepak Jois
8+Maintainer: Jasper Van der Jeugt <m@jaspervdj.be>
9+Stability: Experimental
10+Category: Text
11+Synopsis: A blazingly fast markup combinator library for Haskell
12+Description:
13+ Core modules of a blazingly fast markup combinator library for the Haskell
14+ programming language. The Text.Blaze module is a good
15+ starting point, as well as this tutorial:
16+ <http://jaspervdj.be/blaze/tutorial.html>.
17+
18+Build-type: Simple
19+Cabal-version: >= 1.8
20+
21+Extra-source-files:
22+ CHANGELOG
23+
24+Library
25+ Hs-source-dirs: src
26+ Ghc-Options: -Wall
27+
28+ Exposed-modules:
29+ Text.Blaze
30+ Text.Blaze.Internal
31+ Text.Blaze.Renderer.Pretty
32+ Text.Blaze.Renderer.String
33+ Text.Blaze.Renderer.Text
34+ Text.Blaze.Renderer.Utf8
35+
36+ Build-depends:
37+ base >= 4 && < 5,
38+ blaze-builder >= 0.3 && < 0.5,
39+ text >= 0.10 && < 1.3,
40+ bytestring >= 0.9 && < 0.11
41+
42+Test-suite blaze-markup-tests
43+ Type: exitcode-stdio-1.0
44+ Hs-source-dirs: src tests
45+ Main-is: TestSuite.hs
46+ Ghc-options: -Wall
47+
48+ Other-modules:
49+ Text.Blaze.Tests
50+ Text.Blaze.Tests.Util
51+
52+ Build-depends:
53+ HUnit >= 1.2 && < 1.6,
54+ QuickCheck >= 2.4 && < 2.10,
55+ containers >= 0.3 && < 0.6,
56+ test-framework >= 0.4 && < 0.9,
57+ test-framework-hunit >= 0.3 && < 0.4,
58+ test-framework-quickcheck2 >= 0.3 && < 0.4,
59+ -- Copied from regular dependencies...
60+ base >= 4 && < 5,
61+ blaze-builder >= 0.3 && < 0.5,
62+ text >= 0.10 && < 1.3,
63+ bytestring >= 0.9 && < 0.11
64+
65+Source-repository head
66+ Type: git
67+ Location: http://github.com/jaspervdj/blaze-markup
test/golden-test-cases/blaze-markup.nix.goldennew file+17
@@ -0,0 +1,17 @@
1+{ mkDerivation, base, blaze-builder, bytestring, containers, HUnit
2+, QuickCheck, stdenv, test-framework, test-framework-hunit
3+, test-framework-quickcheck2, text
4+}:
5+mkDerivation {
6+ pname = "blaze-markup";
7+ version = "0.8.0.0";
8+ sha256 = "deadbeef";
9+ libraryHaskellDepends = [ base blaze-builder bytestring text ];
10+ testHaskellDepends = [
11+ base blaze-builder bytestring containers HUnit QuickCheck
12+ test-framework test-framework-hunit test-framework-quickcheck2 text
13+ ];
14+ homepage = "http://jaspervdj.be/blaze";
15+ description = "A blazingly fast markup combinator library for Haskell";
16+ license = stdenv.lib.licenses.bsd3;
17+}
test/golden-test-cases/blaze-svg.cabalnew file+54
@@ -0,0 +1,54 @@
1+name: blaze-svg
2+version: 0.3.6.1
3+synopsis: SVG combinator library
4+homepage: https://github.com/deepakjois/blaze-svg
5+license: BSD3
6+license-file: LICENSE
7+author: Deepak Jois
8+maintainer: deepak.jois@gmail.com
9+category: Graphics
10+build-type: Simple
11+cabal-version: >=1.8
12+description:
13+ A blazingly fast SVG combinator library for the Haskell
14+ programming language. The "Text.Blaze.SVG" module is a good
15+ starting point.
16+ .
17+ Other documentation:
18+ .
19+ * Programs in the /examples/ folder of this project: <https://github.com/deepakjois/blaze-svg/tree/master/examples/>
20+ .
21+ * Jasper Van Der Jeugt has written a tutorial for /blaze-html/,
22+ which is a sister library of /blaze-svg/. It may not be directly relevant,
23+ but still it gives a good overview on how to use the combinators in
24+ "Text.Blaze.Svg11" and "Text.Blaze.Svg11.Attributes":
25+ <http://jaspervdj.be/blaze/tutorial.html>.
26+
27+Extra-source-files:
28+ src/Util/Sanitize.hs
29+ src/Util/GenerateSvgCombinators.hs
30+ examples/*.hs
31+ CHANGES.md
32+
33+Library
34+ Hs-Source-Dirs: src
35+ Ghc-Options: -Wall
36+
37+ Exposed-modules:
38+ Text.Blaze.Svg
39+ Text.Blaze.Svg.Internal
40+ Text.Blaze.Svg11
41+ Text.Blaze.Svg11.Attributes
42+ Text.Blaze.Svg.Renderer.Pretty
43+ Text.Blaze.Svg.Renderer.String
44+ Text.Blaze.Svg.Renderer.Text
45+ Text.Blaze.Svg.Renderer.Utf8
46+
47+ Build-depends:
48+ base >= 4 && < 5,
49+ mtl >= 2 && < 3,
50+ blaze-markup >= 0.5 && < 0.9
51+
52+Source-repository head
53+ Type: git
54+ Location: http://github.com/deepakjois/blaze-svg.git
test/golden-test-cases/blaze-svg.nix.goldennew file+10
@@ -0,0 +1,10 @@
1+{ mkDerivation, base, blaze-markup, mtl, stdenv }:
2+mkDerivation {
3+ pname = "blaze-svg";
4+ version = "0.3.6.1";
5+ sha256 = "deadbeef";
6+ libraryHaskellDepends = [ base blaze-markup mtl ];
7+ homepage = "https://github.com/deepakjois/blaze-svg";
8+ description = "SVG combinator library";
9+ license = stdenv.lib.licenses.bsd3;
10+}
test/golden-test-cases/blosum.cabalnew file+48
@@ -0,0 +1,48 @@
1+name: blosum
2+version: 0.1.1.4
3+synopsis: BLOSUM generator
4+description: Generates BLOSUMs for use with finding the degree of amino acid conservation.
5+homepage: http://github.com/GregorySchwartz/blosum#readme
6+license: GPL-2
7+license-file: LICENSE
8+author: Gregory W. Schwartz
9+maintainer: gregory.schwartz@drexel.edu
10+copyright: Copyright 2016 Gregory W. Schwartz
11+category: Bioinformatics
12+build-type: Simple
13+-- extra-source-files:
14+cabal-version: >=1.10
15+
16+library
17+ hs-source-dirs: src
18+ exposed-modules: Types
19+ , Utility
20+ , Cluster
21+ , Matrix
22+ , Print
23+ build-depends: base >= 4.9 && < 5
24+ , containers
25+ , text
26+ , text-show
27+ , fasta
28+ , lens
29+ default-language: Haskell2010
30+
31+executable blosum
32+ hs-source-dirs: app
33+ main-is: Main.hs
34+ ghc-options: -threaded -rtsopts -with-rtsopts=-N -O2
35+ build-depends: base
36+ , blosum
37+ , containers
38+ , fasta
39+ , text
40+ , split
41+ , pipes
42+ , pipes-text
43+ , optparse-applicative >=0.13
44+ default-language: Haskell2010
45+
46+source-repository head
47+ type: git
48+ location: https://github.com/GregorySchwartz/blosum
test/golden-test-cases/blosum.nix.goldennew file+20
@@ -0,0 +1,20 @@
1+{ mkDerivation, base, containers, fasta, lens, optparse-applicative
2+, pipes, pipes-text, split, stdenv, text, text-show
3+}:
4+mkDerivation {
5+ pname = "blosum";
6+ version = "0.1.1.4";
7+ sha256 = "deadbeef";
8+ isLibrary = true;
9+ isExecutable = true;
10+ libraryHaskellDepends = [
11+ base containers fasta lens text text-show
12+ ];
13+ executableHaskellDepends = [
14+ base containers fasta optparse-applicative pipes pipes-text split
15+ text
16+ ];
17+ homepage = "http://github.com/GregorySchwartz/blosum#readme";
18+ description = "BLOSUM generator";
19+ license = stdenv.lib.licenses.gpl2;
20+}
test/golden-test-cases/boomerang.cabalnew file+45
@@ -0,0 +1,45 @@
1+Name: boomerang
2+Version: 1.4.5.3
3+License: BSD3
4+License-File: LICENSE
5+Author: jeremy@seereason.com
6+Maintainer: partners@seereason.com
7+Bug-Reports: http://code.google.com/p/happstack/issues/list
8+Category: Parsing, Text
9+Synopsis: Library for invertible parsing and printing
10+Description: Specify a single unified grammar which can be used for parsing and pretty-printing
11+Cabal-Version: >= 1.6
12+Build-type: Simple
13+tested-with: GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.3, GHC == 8.0.1
14+
15+Library
16+ Build-Depends: base >= 4 && < 5,
17+ mtl >= 2.0 && < 2.3,
18+ template-haskell < 2.13,
19+ text >= 0.11 && < 1.3
20+ Exposed-Modules: Text.Boomerang
21+ Text.Boomerang.Combinators
22+ Text.Boomerang.Error
23+ Text.Boomerang.HStack
24+ Text.Boomerang.Pos
25+ Text.Boomerang.Prim
26+ Text.Boomerang.String
27+ Text.Boomerang.Strings
28+ Text.Boomerang.Texts
29+ Text.Boomerang.TH
30+
31+ Extensions: DeriveDataTypeable,
32+ FlexibleContexts,
33+ FlexibleContexts,
34+ FlexibleInstances,
35+ RankNTypes,
36+ ScopedTypeVariables,
37+ TemplateHaskell,
38+ TypeFamilies,
39+ TypeFamilies,
40+ TypeOperators,
41+ TypeSynonymInstances
42+
43+source-repository head
44+ type: git
45+ location: https://github.com/Happstack/boomerang.git
test/golden-test-cases/boomerang.nix.goldennew file+9
@@ -0,0 +1,9 @@
1+{ mkDerivation, base, mtl, stdenv, template-haskell, text }:
2+mkDerivation {
3+ pname = "boomerang";
4+ version = "1.4.5.3";
5+ sha256 = "deadbeef";
6+ libraryHaskellDepends = [ base mtl template-haskell text ];
7+ description = "Library for invertible parsing and printing";
8+ license = stdenv.lib.licenses.bsd3;
9+}
test/golden-test-cases/boxes.cabalnew file+35
@@ -0,0 +1,35 @@
1+name: boxes
2+version: 0.1.4
3+synopsis: 2D text pretty-printing library
4+description: A pretty-printing library for laying out text in
5+ two dimensions, using a simple box model.
6+category: Text
7+license: BSD3
8+license-file: LICENSE
9+extra-source-files: CHANGES, README.md
10+author: Brent Yorgey
11+maintainer: David Feuer <David.Feuer@gmail.com>
12+build-type: Simple
13+cabal-version: >= 1.9.2
14+-- Minimum Cabal version supporting test suites
15+
16+library
17+ build-depends: base >= 3 && < 5, split >=0.2 && <0.3
18+ exposed-modules: Text.PrettyPrint.Boxes
19+ extensions: CPP
20+ if impl(ghc)
21+ extensions: OverloadedStrings
22+
23+Test-Suite test-boxes
24+ type: exitcode-stdio-1.0
25+ main-is: Text/PrettyPrint/Tests.hs
26+ build-depends: base >= 3 && < 5, split >=0.2 && <0.3, QuickCheck
27+ extensions: CPP
28+ if impl(ghc)
29+ extensions: OverloadedStrings
30+ cpp-options: -DTESTING
31+-- Export some internals so the tests can get at them
32+
33+source-repository head
34+ type: git
35+ location: git://github.com/treeowl/boxes.git
test/golden-test-cases/boxes.nix.goldennew file+10
@@ -0,0 +1,10 @@
1+{ mkDerivation, base, QuickCheck, split, stdenv }:
2+mkDerivation {
3+ pname = "boxes";
4+ version = "0.1.4";
5+ sha256 = "deadbeef";
6+ libraryHaskellDepends = [ base split ];
7+ testHaskellDepends = [ base QuickCheck split ];
8+ description = "2D text pretty-printing library";
9+ license = stdenv.lib.licenses.bsd3;
10+}
test/golden-test-cases/brittany.cabalnew file+372
@@ -0,0 +1,372 @@
1+name: brittany
2+version: 0.9.0.0
3+synopsis: Haskell source code formatter
4+description: {
5+ See <https://github.com/lspitzner/brittany/blob/master/README.md the README>.
6+ .
7+ If you are interested in the implementation, have a look at <https://github.com/lspitzner/brittany/blob/master/doc/implementation/theory.md this document>;
8+ .
9+ The implementation is documented in more detail <https://github.com/lspitzner/brittany/blob/master/doc/implementation/index.md here>.
10+}
11+license: AGPL-3
12+license-file: LICENSE
13+author: Lennart Spitzner
14+maintainer: Lennart Spitzner <hexagoxel@hexagoxel.de>
15+copyright: Copyright (C) 2016-2017 Lennart Spitzner
16+category: Language
17+build-type: Simple
18+cabal-version: >=1.18
19+homepage: https://github.com/lspitzner/brittany/
20+bug-reports: https://github.com/lspitzner/brittany/issues
21+extra-doc-files: {
22+ ChangeLog.md
23+ README.md
24+ doc/implementation/*.md
25+}
26+extra-source-files: {
27+ src-literatetests/*.blt
28+}
29+
30+source-repository head {
31+ type: git
32+ location: https://github.com/lspitzner/brittany.git
33+}
34+
35+flag brittany-dev-lib
36+ description: set buildable false for anything but lib
37+ default: False
38+ manual: True
39+
40+library {
41+ default-language:
42+ Haskell2010
43+ hs-source-dirs:
44+ src
45+ install-includes: {
46+ srcinc/prelude.inc
47+ }
48+ exposed-modules: {
49+ Language.Haskell.Brittany
50+ Language.Haskell.Brittany.Internal
51+ Language.Haskell.Brittany.Internal.Prelude
52+ Language.Haskell.Brittany.Internal.PreludeUtils
53+ Language.Haskell.Brittany.Internal.Types
54+ Language.Haskell.Brittany.Internal.Utils
55+ Language.Haskell.Brittany.Internal.Config
56+ Language.Haskell.Brittany.Internal.Config.Types
57+ Language.Haskell.Brittany.Internal.Config.Types.Instances
58+ Paths_brittany
59+ }
60+ other-modules: {
61+ Language.Haskell.Brittany.Internal.LayouterBasics
62+ Language.Haskell.Brittany.Internal.Backend
63+ Language.Haskell.Brittany.Internal.BackendUtils
64+ Language.Haskell.Brittany.Internal.ExactPrintUtils
65+ Language.Haskell.Brittany.Internal.Layouters.Type
66+ Language.Haskell.Brittany.Internal.Layouters.Decl
67+ Language.Haskell.Brittany.Internal.Layouters.Expr
68+ Language.Haskell.Brittany.Internal.Layouters.Stmt
69+ Language.Haskell.Brittany.Internal.Layouters.Pattern
70+ Language.Haskell.Brittany.Internal.Transformations.Alt
71+ Language.Haskell.Brittany.Internal.Transformations.Floating
72+ Language.Haskell.Brittany.Internal.Transformations.Par
73+ Language.Haskell.Brittany.Internal.Transformations.Columns
74+ Language.Haskell.Brittany.Internal.Transformations.Indent
75+ }
76+ ghc-options: {
77+ -Wall
78+ -fno-warn-unused-imports
79+ -fno-warn-redundant-constraints
80+ }
81+ build-depends:
82+ { base >=4.9 && <4.11
83+ , ghc >=8.0.1 && <8.3
84+ , ghc-paths >=0.1.0.9 && <0.2
85+ , ghc-exactprint >=0.5.3.0 && <0.6
86+ , transformers >=0.5.2.0 && <0.6
87+ , containers >=0.5.7.1 && <0.6
88+ , mtl >=2.2.1 && <2.3
89+ , text >=1.2 && <1.3
90+ , multistate >=0.7.1.1 && <0.8
91+ , syb >=0.6 && <0.8
92+ , neat-interpolation >=0.3.2 && <0.4
93+ , data-tree-print
94+ , pretty >=1.1.3.3 && <1.2
95+ , bytestring >=0.10.8.1 && <0.11
96+ , directory >=1.2.6.2 && <1.4
97+ , butcher >=1.2 && <1.3
98+ , yaml >=0.8.18 && <0.9
99+ , aeson >=1.0.1.0 && <1.3
100+ , extra >=1.4.10 && <1.7
101+ , uniplate >=1.6.12 && <1.7
102+ , strict >=0.3.2 && <0.4
103+ , monad-memo >=0.4.1 && <0.5
104+ , unsafe >=0.0 && <0.1
105+ , safe >=0.3.9 && <0.4
106+ , deepseq >=1.4.2.0 && <1.5
107+ , semigroups >=0.18.2 && <0.19
108+ , cmdargs >=0.10.14 && <0.11
109+ , czipwith >=1.0.0.0 && <1.1
110+ , ghc-boot-th >=8.0.1 && <8.3
111+ }
112+ default-extensions: {
113+ CPP
114+
115+ NoImplicitPrelude
116+
117+ GADTs
118+
119+ FlexibleContexts
120+ FlexibleInstances
121+ ScopedTypeVariables
122+ MonadComprehensions
123+ LambdaCase
124+ MultiWayIf
125+ KindSignatures
126+ }
127+ include-dirs:
128+ srcinc
129+}
130+
131+executable brittany
132+ if flag(brittany-dev-lib) {
133+ buildable: False
134+ } else {
135+ buildable: True
136+ }
137+ main-is: Main.hs
138+ other-modules: {
139+ Paths_brittany
140+ }
141+ -- other-extensions:
142+ build-depends:
143+ { brittany
144+ , base
145+ , ghc
146+ , ghc-paths
147+ , ghc-exactprint
148+ , transformers
149+ , containers
150+ , mtl
151+ , text
152+ , multistate
153+ , syb
154+ , neat-interpolation
155+ , data-tree-print
156+ , pretty
157+ , bytestring
158+ , directory
159+ , butcher
160+ , yaml
161+ , aeson
162+ , extra
163+ , uniplate
164+ , strict
165+ , monad-memo
166+ , unsafe
167+ , safe
168+ , deepseq
169+ , semigroups
170+ , cmdargs
171+ , czipwith
172+ , ghc-boot-th
173+ , hspec >=2.4.1 && <2.5
174+ , filepath >=1.4.1.0 && <1.5
175+ }
176+ hs-source-dirs: src-brittany
177+ default-language: Haskell2010
178+ default-extensions: {
179+ CPP
180+
181+ NoImplicitPrelude
182+
183+ GADTs
184+
185+ FlexibleContexts
186+ FlexibleInstances
187+ ScopedTypeVariables
188+ MonadComprehensions
189+ LambdaCase
190+ MultiWayIf
191+ KindSignatures
192+ }
193+ ghc-options: {
194+ -Wall
195+ -fno-spec-constr
196+ -fno-warn-unused-imports
197+ -fno-warn-redundant-constraints
198+ -rtsopts
199+ -with-rtsopts "-M2G"
200+ }
201+
202+test-suite unittests
203+ if flag(brittany-dev-lib) {
204+ buildable: False
205+ } else {
206+ buildable: True
207+ }
208+ type: exitcode-stdio-1.0
209+ default-language: Haskell2010
210+ build-depends:
211+ { brittany
212+ , base
213+ , ghc
214+ , ghc-paths
215+ , ghc-exactprint
216+ , transformers
217+ , containers
218+ , mtl
219+ , text
220+ , multistate
221+ , syb
222+ , neat-interpolation
223+ , data-tree-print
224+ , pretty
225+ , bytestring
226+ , directory
227+ , butcher
228+ , yaml
229+ , aeson
230+ , extra
231+ , uniplate
232+ , strict
233+ , monad-memo
234+ , unsafe
235+ , safe
236+ , deepseq
237+ , semigroups
238+ , cmdargs
239+ , czipwith
240+ , ghc-boot-th
241+ , hspec >=2.4.1 && <2.5
242+ }
243+ ghc-options: -Wall
244+ main-is: TestMain.hs
245+ other-modules: TestUtils
246+ AsymptoticPerfTests
247+ hs-source-dirs: src-unittests
248+ default-extensions: {
249+ CPP
250+
251+ NoImplicitPrelude
252+
253+ GADTs
254+
255+ FlexibleContexts
256+ FlexibleInstances
257+ ScopedTypeVariables
258+ MonadComprehensions
259+ LambdaCase
260+ MultiWayIf
261+ KindSignatures
262+ }
263+ ghc-options: {
264+ -Wall
265+ -fno-warn-unused-imports
266+ -rtsopts
267+ -with-rtsopts "-M2G"
268+ }
269+
270+test-suite littests
271+ if flag(brittany-dev-lib) {
272+ buildable: False
273+ } else {
274+ buildable: True
275+ }
276+ type: exitcode-stdio-1.0
277+ default-language: Haskell2010
278+ build-depends:
279+ { brittany
280+ , base
281+ , ghc
282+ , ghc-paths
283+ , ghc-exactprint
284+ , transformers
285+ , containers
286+ , mtl
287+ , text
288+ , multistate
289+ , syb
290+ , neat-interpolation
291+ , data-tree-print
292+ , pretty
293+ , bytestring
294+ , directory
295+ , butcher
296+ , yaml
297+ , aeson
298+ , extra
299+ , uniplate
300+ , strict
301+ , monad-memo
302+ , unsafe
303+ , safe
304+ , deepseq
305+ , semigroups
306+ , cmdargs
307+ , czipwith
308+ , ghc-boot-th
309+ , hspec >=2.4.1 && <2.5
310+ , filepath
311+ , parsec >=3.1.11 && <3.2
312+ }
313+ ghc-options: -Wall
314+ main-is: Main.hs
315+ other-modules:
316+ hs-source-dirs: src-literatetests
317+ default-extensions: {
318+ CPP
319+
320+ NoImplicitPrelude
321+
322+ GADTs
323+
324+ FlexibleContexts
325+ FlexibleInstances
326+ ScopedTypeVariables
327+ MonadComprehensions
328+ LambdaCase
329+ MultiWayIf
330+ KindSignatures
331+ }
332+ ghc-options: {
333+ -Wall
334+ -fno-warn-unused-imports
335+ -rtsopts
336+ -with-rtsopts "-M2G"
337+ }
338+
339+test-suite libinterfacetests
340+ if flag(brittany-dev-lib) {
341+ buildable: False
342+ } else {
343+ buildable: True
344+ }
345+ type: exitcode-stdio-1.0
346+ default-language: Haskell2010
347+ build-depends:
348+ { brittany
349+ , base
350+ , text
351+ , transformers
352+ , hspec >=2.4.1 && <2.5
353+ }
354+ ghc-options: -Wall
355+ main-is: Main.hs
356+ other-modules:
357+ hs-source-dirs: src-libinterfacetests
358+ default-extensions: {
359+ FlexibleContexts
360+ FlexibleInstances
361+ ScopedTypeVariables
362+ MonadComprehensions
363+ LambdaCase
364+ MultiWayIf
365+ KindSignatures
366+ }
367+ ghc-options: {
368+ -Wall
369+ -fno-warn-unused-imports
370+ -rtsopts
371+ -with-rtsopts "-M2G"
372+ }
test/golden-test-cases/brittany.nix.goldennew file+38

This diff is too big to show here.

test/golden-test-cases/broadcast-chan.cabalnew file+53

This diff is too big to show here.

test/golden-test-cases/broadcast-chan.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/butcher.cabalnew file+157

This diff is too big to show here.

test/golden-test-cases/butcher.nix.goldennew file+16

This diff is too big to show here.

test/golden-test-cases/bzlib.cabalnew file+47

This diff is too big to show here.

test/golden-test-cases/bzlib.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/case-insensitive.cabalnew file+73

This diff is too big to show here.

test/golden-test-cases/case-insensitive.nix.goldennew file+16

This diff is too big to show here.

test/golden-test-cases/cassava-conduit.cabalnew file+79

This diff is too big to show here.

test/golden-test-cases/cassava-conduit.nix.goldennew file+20

This diff is too big to show here.

test/golden-test-cases/cassette.cabalnew file+28

This diff is too big to show here.

test/golden-test-cases/cassette.nix.goldennew file+9

This diff is too big to show here.

test/golden-test-cases/cereal-text.cabalnew file+38

This diff is too big to show here.

test/golden-test-cases/cereal-text.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/cheapskate.cabalnew file+81

This diff is too big to show here.

test/golden-test-cases/cheapskate.nix.goldennew file+19

This diff is too big to show here.

test/golden-test-cases/chell.cabalnew file+88

This diff is too big to show here.

test/golden-test-cases/chell.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/clumpiness.cabalnew file+72

This diff is too big to show here.

test/golden-test-cases/clumpiness.nix.goldennew file+9

This diff is too big to show here.

test/golden-test-cases/code-page.cabalnew file+60

This diff is too big to show here.

test/golden-test-cases/code-page.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/colorize-haskell.cabalnew file+33

This diff is too big to show here.

test/golden-test-cases/colorize-haskell.nix.goldennew file+13

This diff is too big to show here.

test/golden-test-cases/countable.cabalnew file+78

This diff is too big to show here.

test/golden-test-cases/countable.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/cpu.cabalnew file+81

This diff is too big to show here.

test/golden-test-cases/cpu.nix.goldennew file+13

This diff is too big to show here.

test/golden-test-cases/criterion.cabalnew file+218

This diff is too big to show here.

test/golden-test-cases/criterion.nix.goldennew file+31

This diff is too big to show here.

test/golden-test-cases/crypt-sha512.cabalnew file+60

This diff is too big to show here.

test/golden-test-cases/crypt-sha512.nix.goldennew file+19

This diff is too big to show here.

test/golden-test-cases/crypto-random-api.cabalnew file+23

This diff is too big to show here.

test/golden-test-cases/crypto-random-api.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/csv.cabalnew file+23

This diff is too big to show here.

test/golden-test-cases/csv.nix.goldennew file+9

This diff is too big to show here.

test/golden-test-cases/data-accessor.cabalnew file+128

This diff is too big to show here.

test/golden-test-cases/data-accessor.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/data-default-instances-containers.cabalnew file+18

This diff is too big to show here.

test/golden-test-cases/data-default-instances-containers.nix.goldennew file+9

This diff is too big to show here.

test/golden-test-cases/data-endian.cabalnew file+30

This diff is too big to show here.

test/golden-test-cases/data-endian.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/data-msgpack.cabalnew file+114

This diff is too big to show here.

test/golden-test-cases/data-msgpack.nix.goldennew file+26

This diff is too big to show here.

test/golden-test-cases/data-serializer.cabalnew file+60

This diff is too big to show here.

test/golden-test-cases/data-serializer.nix.goldennew file+17

This diff is too big to show here.

test/golden-test-cases/deque.cabalnew file+45

This diff is too big to show here.

test/golden-test-cases/deque.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/dhall-bash.cabalnew file+54

This diff is too big to show here.

test/golden-test-cases/dhall-bash.nix.goldennew file+20

This diff is too big to show here.

test/golden-test-cases/diagrams-solve.cabalnew file+42

This diff is too big to show here.

test/golden-test-cases/diagrams-solve.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/discrimination.cabalnew file+76

This diff is too big to show here.

test/golden-test-cases/discrimination.nix.goldennew file+22

This diff is too big to show here.

test/golden-test-cases/dotenv.cabalnew file+153

This diff is too big to show here.

test/golden-test-cases/dotenv.nix.goldennew file+27

This diff is too big to show here.

test/golden-test-cases/dotnet-timespan.cabalnew file+79

This diff is too big to show here.

test/golden-test-cases/dotnet-timespan.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/dpor.cabalnew file+74

This diff is too big to show here.

test/golden-test-cases/dpor.nix.goldennew file+14

This diff is too big to show here.

test/golden-test-cases/drawille.cabalnew file+102

This diff is too big to show here.

test/golden-test-cases/drawille.nix.goldennew file+13

This diff is too big to show here.

test/golden-test-cases/drifter-postgresql.cabalnew file+63

This diff is too big to show here.

test/golden-test-cases/drifter-postgresql.nix.goldennew file+19

This diff is too big to show here.

test/golden-test-cases/ede.cabalnew file+110

This diff is too big to show here.

test/golden-test-cases/ede.nix.goldennew file+25

This diff is too big to show here.

test/golden-test-cases/ekg-cloudwatch.cabalnew file+46

This diff is too big to show here.

test/golden-test-cases/ekg-cloudwatch.nix.goldennew file+16

This diff is too big to show here.

test/golden-test-cases/emailaddress.cabalnew file+49

This diff is too big to show here.

test/golden-test-cases/emailaddress.nix.goldennew file+19

This diff is too big to show here.

test/golden-test-cases/envelope.cabalnew file+38

This diff is too big to show here.

test/golden-test-cases/envelope.nix.goldennew file+13

This diff is too big to show here.

test/golden-test-cases/eventful-sqlite.cabalnew file+69

This diff is too big to show here.

test/golden-test-cases/eventful-sqlite.nix.goldennew file+21

This diff is too big to show here.

test/golden-test-cases/exact-pi.cabalnew file+35

This diff is too big to show here.

test/golden-test-cases/exact-pi.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/expiring-cache-map.cabalnew file+108

This diff is too big to show here.

test/golden-test-cases/expiring-cache-map.nix.goldennew file+17

This diff is too big to show here.

test/golden-test-cases/explicit-exception.cabalnew file+124

This diff is too big to show here.

test/golden-test-cases/explicit-exception.nix.goldennew file+12

This diff is too big to show here.

test/golden-test-cases/fdo-notify.cabalnew file+26

This diff is too big to show here.

test/golden-test-cases/fdo-notify.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/fgl.cabalnew file+134

This diff is too big to show here.

test/golden-test-cases/fgl.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/file-modules.cabalnew file+46

This diff is too big to show here.

test/golden-test-cases/file-modules.nix.goldennew file+21

This diff is too big to show here.

test/golden-test-cases/fingertree.cabalnew file+59

This diff is too big to show here.

test/golden-test-cases/fingertree.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/fixed-vector.cabalnew file+87

This diff is too big to show here.

test/golden-test-cases/fixed-vector.nix.goldennew file+12

This diff is too big to show here.

test/golden-test-cases/fixed.cabalnew file+32

This diff is too big to show here.

test/golden-test-cases/fixed.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/foundation.cabalnew file+280

This diff is too big to show here.

test/golden-test-cases/foundation.nix.goldennew file+12

This diff is too big to show here.

test/golden-test-cases/frisby.cabalnew file+37

This diff is too big to show here.

test/golden-test-cases/frisby.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/funcmp.cabalnew file+92

This diff is too big to show here.

test/golden-test-cases/funcmp.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/functor-classes-compat.cabalnew file+147

This diff is too big to show here.

test/golden-test-cases/functor-classes-compat.nix.goldennew file+14

This diff is too big to show here.

test/golden-test-cases/general-games.cabalnew file+53

This diff is too big to show here.

test/golden-test-cases/general-games.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/generic-lens.cabalnew file+123

This diff is too big to show here.

test/golden-test-cases/generic-lens.nix.goldennew file+16

This diff is too big to show here.

test/golden-test-cases/genvalidity-aeson.cabalnew file+51

This diff is too big to show here.

test/golden-test-cases/genvalidity-aeson.nix.goldennew file+21

This diff is too big to show here.

test/golden-test-cases/genvalidity-hspec-aeson.cabalnew file+63

This diff is too big to show here.

test/golden-test-cases/genvalidity-hspec-aeson.nix.goldennew file+20

This diff is too big to show here.

test/golden-test-cases/genvalidity-hspec-binary.cabalnew file+59

This diff is too big to show here.

test/golden-test-cases/genvalidity-hspec-binary.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/genvalidity-scientific.cabalnew file+48

This diff is too big to show here.

test/golden-test-cases/genvalidity-scientific.nix.goldennew file+17

This diff is too big to show here.

test/golden-test-cases/genvalidity-uuid.cabalnew file+48

This diff is too big to show here.

test/golden-test-cases/genvalidity-uuid.nix.goldennew file+17

This diff is too big to show here.

test/golden-test-cases/ghc-syb-utils.cabalnew file+51

This diff is too big to show here.

test/golden-test-cases/ghc-syb-utils.nix.goldennew file+13

This diff is too big to show here.

test/golden-test-cases/ghcid.cabalnew file+117

This diff is too big to show here.

test/golden-test-cases/ghcid.nix.goldennew file+25

This diff is too big to show here.

test/golden-test-cases/giphy-api.cabalnew file+94

This diff is too big to show here.

test/golden-test-cases/giphy-api.nix.goldennew file+24

This diff is too big to show here.

test/golden-test-cases/github.cabalnew file+202

This diff is too big to show here.

test/golden-test-cases/github.nix.goldennew file+30

This diff is too big to show here.

test/golden-test-cases/gl.cabalnew file+917

This diff is too big to show here.

test/golden-test-cases/gl.nix.goldennew file+17

This diff is too big to show here.

test/golden-test-cases/gogol-adexchange-buyer.cabalnew file+85

This diff is too big to show here.

test/golden-test-cases/gogol-adexchange-buyer.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/gogol-admin-emailmigration.cabalnew file+46

This diff is too big to show here.

test/golden-test-cases/gogol-admin-emailmigration.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/gogol-affiliates.cabalnew file+55

This diff is too big to show here.

test/golden-test-cases/gogol-affiliates.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/gogol-apps-tasks.cabalnew file+59

This diff is too big to show here.

test/golden-test-cases/gogol-apps-tasks.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/gogol-appstate.cabalnew file+50

This diff is too big to show here.

test/golden-test-cases/gogol-appstate.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/gogol-blogger.cabalnew file+82

This diff is too big to show here.

test/golden-test-cases/gogol-blogger.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/gogol-datastore.cabalnew file+52

This diff is too big to show here.

test/golden-test-cases/gogol-datastore.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/gogol-dfareporting.cabalnew file+249

This diff is too big to show here.

test/golden-test-cases/gogol-dfareporting.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/gogol-firebase-rules.cabalnew file+56

This diff is too big to show here.

test/golden-test-cases/gogol-firebase-rules.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/gogol-gmail.cabalnew file+102

This diff is too big to show here.

test/golden-test-cases/gogol-gmail.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/gogol-kgsearch.cabalnew file+46

This diff is too big to show here.

test/golden-test-cases/gogol-kgsearch.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/gogol-maps-engine.cabalnew file+123

This diff is too big to show here.

test/golden-test-cases/gogol-maps-engine.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/gogol-plus.cabalnew file+54

This diff is too big to show here.

test/golden-test-cases/gogol-plus.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/gogol-resourceviews.cabalnew file+61

This diff is too big to show here.

test/golden-test-cases/gogol-resourceviews.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/gogol-translate.cabalnew file+48

This diff is too big to show here.

test/golden-test-cases/gogol-translate.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/gogol-webmaster-tools.cabalnew file+58

This diff is too big to show here.

test/golden-test-cases/gogol-webmaster-tools.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/gogol-youtube.cabalnew file+117

This diff is too big to show here.

test/golden-test-cases/gogol-youtube.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/groundhog-mysql.cabalnew file+32

This diff is too big to show here.

test/golden-test-cases/groundhog-mysql.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/gsasl.cabalnew file+38

This diff is too big to show here.

test/golden-test-cases/gsasl.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/hOpenPGP.cabalnew file+342

This diff is too big to show here.

test/golden-test-cases/hOpenPGP.nix.goldennew file+49

This diff is too big to show here.

test/golden-test-cases/hPDB-examples.cabalnew file+97

This diff is too big to show here.

test/golden-test-cases/hPDB-examples.nix.goldennew file+24

This diff is too big to show here.

test/golden-test-cases/haddock-library.cabalnew file+130

This diff is too big to show here.

test/golden-test-cases/haddock-library.nix.goldennew file+17

This diff is too big to show here.

test/golden-test-cases/hakyll.cabalnew file+321

This diff is too big to show here.

test/golden-test-cases/hakyll.nix.goldennew file+42

This diff is too big to show here.

test/golden-test-cases/happstack-hsp.cabalnew file+37

This diff is too big to show here.

test/golden-test-cases/happstack-hsp.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/happy.cabalnew file+180

This diff is too big to show here.

test/golden-test-cases/happy.nix.goldennew file+16

This diff is too big to show here.

test/golden-test-cases/harp.cabalnew file+31

This diff is too big to show here.

test/golden-test-cases/harp.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/hashtables.cabalnew file+199

This diff is too big to show here.

test/golden-test-cases/hashtables.nix.goldennew file+13

This diff is too big to show here.

test/golden-test-cases/haskell-tools-debug.cabalnew file+38

This diff is too big to show here.

test/golden-test-cases/haskell-tools-debug.nix.goldennew file+22

This diff is too big to show here.

test/golden-test-cases/haskell-tools-rewrite.cabalnew file+64

This diff is too big to show here.

test/golden-test-cases/haskell-tools-rewrite.nix.goldennew file+20

This diff is too big to show here.

test/golden-test-cases/hasql.cabalnew file+205

This diff is too big to show here.

test/golden-test-cases/hasql.nix.goldennew file+27

This diff is too big to show here.

test/golden-test-cases/hformat.cabalnew file+45

This diff is too big to show here.

test/golden-test-cases/hformat.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/highlighting-kate.cabalnew file+276

This diff is too big to show here.

test/golden-test-cases/highlighting-kate.nix.goldennew file+22

This diff is too big to show here.

test/golden-test-cases/hit.cabalnew file+125

This diff is too big to show here.

test/golden-test-cases/hit.nix.goldennew file+24

This diff is too big to show here.

test/golden-test-cases/hjson.cabalnew file+19

This diff is too big to show here.

test/golden-test-cases/hjson.nix.goldennew file+9

This diff is too big to show here.

test/golden-test-cases/hmpfr.cabalnew file+83

This diff is too big to show here.

test/golden-test-cases/hmpfr.nix.goldennew file+12

This diff is too big to show here.

test/golden-test-cases/hoogle.cabalnew file+142

This diff is too big to show here.

test/golden-test-cases/hoogle.nix.goldennew file+30

This diff is too big to show here.

test/golden-test-cases/hostname-validate.cabalnew file+20

This diff is too big to show here.

test/golden-test-cases/hostname-validate.nix.goldennew file+9

This diff is too big to show here.

test/golden-test-cases/hsinstall.cabalnew file+45

This diff is too big to show here.

test/golden-test-cases/hsinstall.nix.goldennew file+13

This diff is too big to show here.

test/golden-test-cases/hstatsd.cabalnew file+24

This diff is too big to show here.

test/golden-test-cases/hstatsd.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/hsx-jmacro.cabalnew file+33

This diff is too big to show here.

test/golden-test-cases/hsx-jmacro.nix.goldennew file+14

This diff is too big to show here.

test/golden-test-cases/hsyslog.cabalnew file+77

This diff is too big to show here.

test/golden-test-cases/hsyslog.nix.goldennew file+14

This diff is too big to show here.

test/golden-test-cases/htoml.cabalnew file+89

This diff is too big to show here.

test/golden-test-cases/htoml.nix.goldennew file+24

This diff is too big to show here.

test/golden-test-cases/http-conduit.cabalnew file+82

This diff is too big to show here.

test/golden-test-cases/http-conduit.nix.goldennew file+29

This diff is too big to show here.

test/golden-test-cases/http-link-header.cabalnew file+74

This diff is too big to show here.

test/golden-test-cases/http-link-header.nix.goldennew file+23

This diff is too big to show here.

test/golden-test-cases/http-media.cabalnew file+128

This diff is too big to show here.

test/golden-test-cases/http-media.nix.goldennew file+19

This diff is too big to show here.

test/golden-test-cases/hxt-charproperties.cabalnew file+46

This diff is too big to show here.

test/golden-test-cases/hxt-charproperties.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/hxt-expat.cabalnew file+36

This diff is too big to show here.

test/golden-test-cases/hxt-expat.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/hxt-tagsoup.cabalnew file+42

This diff is too big to show here.

test/golden-test-cases/hxt-tagsoup.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/iconv.cabalnew file+34

This diff is too big to show here.

test/golden-test-cases/iconv.nix.goldennew file+9

This diff is too big to show here.

test/golden-test-cases/incremental-parser.cabalnew file+55

This diff is too big to show here.

test/golden-test-cases/incremental-parser.nix.goldennew file+19

This diff is too big to show here.

test/golden-test-cases/indentation-core.cabalnew file+39

This diff is too big to show here.

test/golden-test-cases/indentation-core.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/indentation-parsec.cabalnew file+70

This diff is too big to show here.

test/golden-test-cases/indentation-parsec.nix.goldennew file+13

This diff is too big to show here.

test/golden-test-cases/inline-c-cpp.cabalnew file+41

This diff is too big to show here.

test/golden-test-cases/inline-c-cpp.nix.goldennew file+14

This diff is too big to show here.

test/golden-test-cases/integer-logarithms.cabalnew file+111

This diff is too big to show here.

test/golden-test-cases/integer-logarithms.nix.goldennew file+17

This diff is too big to show here.

test/golden-test-cases/intero.cabalnew file+116

This diff is too big to show here.

test/golden-test-cases/intero.nix.goldennew file+24

This diff is too big to show here.

test/golden-test-cases/invariant.cabalnew file+69

This diff is too big to show here.

test/golden-test-cases/invariant.nix.goldennew file+21

This diff is too big to show here.

test/golden-test-cases/io-machine.cabalnew file+34

This diff is too big to show here.

test/golden-test-cases/io-machine.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/io-streams-haproxy.cabalnew file+78

This diff is too big to show here.

test/golden-test-cases/io-streams-haproxy.nix.goldennew file+19

This diff is too big to show here.

test/golden-test-cases/ip.cabalnew file+124

This diff is too big to show here.

test/golden-test-cases/ip.nix.goldennew file+24

This diff is too big to show here.

test/golden-test-cases/iso639.cabalnew file+26

This diff is too big to show here.

test/golden-test-cases/iso639.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/iso8601-time.cabalnew file+60

This diff is too big to show here.

test/golden-test-cases/iso8601-time.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/jmacro-rpc-happstack.cabalnew file+29

This diff is too big to show here.

test/golden-test-cases/jmacro-rpc-happstack.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/jmacro-rpc.cabalnew file+26

This diff is too big to show here.

test/golden-test-cases/jmacro-rpc.nix.goldennew file+17

This diff is too big to show here.

test/golden-test-cases/jose.cabalnew file+147

This diff is too big to show here.

test/golden-test-cases/jose.nix.goldennew file+30

This diff is too big to show here.

test/golden-test-cases/katip-elasticsearch.cabalnew file+114

This diff is too big to show here.

test/golden-test-cases/katip-elasticsearch.nix.goldennew file+30

This diff is too big to show here.

test/golden-test-cases/katip.cabalnew file+151

This diff is too big to show here.

test/golden-test-cases/katip.nix.goldennew file+35

This diff is too big to show here.

test/golden-test-cases/katydid.cabalnew file+89

This diff is too big to show here.

test/golden-test-cases/katydid.nix.goldennew file+21

This diff is too big to show here.

test/golden-test-cases/kawhi.cabalnew file+66

This diff is too big to show here.

test/golden-test-cases/kawhi.nix.goldennew file+22

This diff is too big to show here.

test/golden-test-cases/kraken.cabalnew file+41

This diff is too big to show here.

test/golden-test-cases/kraken.nix.goldennew file+13

This diff is too big to show here.

test/golden-test-cases/l10n.cabalnew file+29

This diff is too big to show here.

test/golden-test-cases/l10n.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/lambdabot-social-plugins.cabalnew file+60

This diff is too big to show here.

test/golden-test-cases/lambdabot-social-plugins.nix.goldennew file+14

This diff is too big to show here.

test/golden-test-cases/lazy-csv.cabalnew file+36

This diff is too big to show here.

test/golden-test-cases/lazy-csv.nix.goldennew file+13

This diff is too big to show here.

test/golden-test-cases/lens-aeson.cabalnew file+80

This diff is too big to show here.

test/golden-test-cases/lens-aeson.nix.goldennew file+21

This diff is too big to show here.

test/golden-test-cases/lens.cabalnew file+503

This diff is too big to show here.

test/golden-test-cases/lens.nix.goldennew file+39

This diff is too big to show here.

test/golden-test-cases/libgit.cabalnew file+29

This diff is too big to show here.

test/golden-test-cases/libgit.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/librato.cabalnew file+52

This diff is too big to show here.

test/golden-test-cases/librato.nix.goldennew file+17

This diff is too big to show here.

test/golden-test-cases/lifted-async.cabalnew file+115

This diff is too big to show here.

test/golden-test-cases/lifted-async.nix.goldennew file+20

This diff is too big to show here.

test/golden-test-cases/lmdb.cabalnew file+51

This diff is too big to show here.

test/golden-test-cases/lmdb.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/logging-effect-extra-file.cabalnew file+63

This diff is too big to show here.

test/golden-test-cases/logging-effect-extra-file.nix.goldennew file+17

This diff is too big to show here.

test/golden-test-cases/lucid.cabalnew file+75

This diff is too big to show here.

test/golden-test-cases/lucid.nix.goldennew file+22

This diff is too big to show here.

test/golden-test-cases/mainland-pretty.cabalnew file+40

This diff is too big to show here.

test/golden-test-cases/mainland-pretty.nix.goldennew file+14

This diff is too big to show here.

test/golden-test-cases/matrices.cabalnew file+73

This diff is too big to show here.

test/golden-test-cases/matrices.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/median-stream.cabalnew file+38

This diff is too big to show here.

test/golden-test-cases/median-stream.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/megaparsec.cabalnew file+142

This diff is too big to show here.

test/golden-test-cases/megaparsec.nix.goldennew file+22

This diff is too big to show here.

test/golden-test-cases/mersenne-random.cabalnew file+111

This diff is too big to show here.

test/golden-test-cases/mersenne-random.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/messagepack.cabalnew file+48

This diff is too big to show here.

test/golden-test-cases/messagepack.nix.goldennew file+19

This diff is too big to show here.

test/golden-test-cases/microlens-ghc.cabalnew file+44

This diff is too big to show here.

test/golden-test-cases/microlens-ghc.nix.goldennew file+14

This diff is too big to show here.

test/golden-test-cases/microlens.cabalnew file+71

This diff is too big to show here.

test/golden-test-cases/microlens.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/minio-hs.cabalnew file+245

This diff is too big to show here.

test/golden-test-cases/minio-hs.nix.goldennew file+34

This diff is too big to show here.

test/golden-test-cases/mmorph.cabalnew file+28

This diff is too big to show here.

test/golden-test-cases/mmorph.nix.goldennew file+13

This diff is too big to show here.

test/golden-test-cases/mnist-idx.cabalnew file+83

This diff is too big to show here.

test/golden-test-cases/mnist-idx.nix.goldennew file+13

This diff is too big to show here.

test/golden-test-cases/mole.cabalnew file+98

This diff is too big to show here.

test/golden-test-cases/mole.nix.goldennew file+26

This diff is too big to show here.

test/golden-test-cases/monad-products.cabalnew file+30

This diff is too big to show here.

test/golden-test-cases/monad-products.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/monadcryptorandom.cabalnew file+41

This diff is too big to show here.

test/golden-test-cases/monadcryptorandom.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/monadloc.cabalnew file+43

This diff is too big to show here.

test/golden-test-cases/monadloc.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/mongoDB.cabalnew file+117

This diff is too big to show here.

test/golden-test-cases/mongoDB.nix.goldennew file+29

This diff is too big to show here.

test/golden-test-cases/monoid-extras.cabalnew file+57

This diff is too big to show here.

test/golden-test-cases/monoid-extras.nix.goldennew file+12

This diff is too big to show here.

test/golden-test-cases/mwc-random-monad.cabalnew file+41

This diff is too big to show here.

test/golden-test-cases/mwc-random-monad.nix.goldennew file+13

This diff is too big to show here.

test/golden-test-cases/mwc-random.cabalnew file+88

This diff is too big to show here.

test/golden-test-cases/mwc-random.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/nanospec.cabalnew file+45

This diff is too big to show here.

test/golden-test-cases/nanospec.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/netpbm.cabalnew file+166

This diff is too big to show here.

test/golden-test-cases/netpbm.nix.goldennew file+18

This diff is too big to show here.

test/golden-test-cases/network-protocol-xmpp.cabalnew file+57

This diff is too big to show here.

test/golden-test-cases/network-protocol-xmpp.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/network-transport-tcp.cabalnew file+93

This diff is too big to show here.

test/golden-test-cases/network-transport-tcp.nix.goldennew file+17

This diff is too big to show here.

test/golden-test-cases/nix-paths.cabalnew file+37

This diff is too big to show here.

test/golden-test-cases/nix-paths.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/nvim-hs.cabalnew file+201

This diff is too big to show here.

test/golden-test-cases/nvim-hs.nix.goldennew file+39

This diff is too big to show here.

test/golden-test-cases/once.cabalnew file+30

This diff is too big to show here.

test/golden-test-cases/once.nix.goldennew file+14

This diff is too big to show here.

test/golden-test-cases/one-liner.cabalnew file+50

This diff is too big to show here.

test/golden-test-cases/one-liner.nix.goldennew file+16

This diff is too big to show here.

test/golden-test-cases/online.cabalnew file+85

This diff is too big to show here.

test/golden-test-cases/online.nix.goldennew file+14

This diff is too big to show here.

test/golden-test-cases/opencv.cabalnew file+263

This diff is too big to show here.

test/golden-test-cases/opencv.nix.goldennew file+30

This diff is too big to show here.

test/golden-test-cases/openexr-write.cabalnew file+52

This diff is too big to show here.

test/golden-test-cases/openexr-write.nix.goldennew file+17

This diff is too big to show here.

test/golden-test-cases/openpgp-asciiarmor.cabalnew file+62

This diff is too big to show here.

test/golden-test-cases/openpgp-asciiarmor.nix.goldennew file+19

This diff is too big to show here.

test/golden-test-cases/pager.cabalnew file+69

This diff is too big to show here.

test/golden-test-cases/pager.nix.goldennew file+20

This diff is too big to show here.

test/golden-test-cases/partial-isomorphisms.cabalnew file+50

This diff is too big to show here.

test/golden-test-cases/partial-isomorphisms.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/partial-semigroup.cabalnew file+154

This diff is too big to show here.

test/golden-test-cases/partial-semigroup.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/pathtype.cabalnew file+150

This diff is too big to show here.

test/golden-test-cases/pathtype.nix.goldennew file+18

This diff is too big to show here.

test/golden-test-cases/pcap.cabalnew file+39

This diff is too big to show here.

test/golden-test-cases/pcap.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/pdfinfo.cabalnew file+30

This diff is too big to show here.

test/golden-test-cases/pdfinfo.nix.goldennew file+14

This diff is too big to show here.

test/golden-test-cases/pell.cabalnew file+54

This diff is too big to show here.

test/golden-test-cases/pell.nix.goldennew file+16

This diff is too big to show here.

test/golden-test-cases/persistable-types-HDBC-pg.cabalnew file+42

This diff is too big to show here.

test/golden-test-cases/persistable-types-HDBC-pg.nix.goldennew file+16

This diff is too big to show here.

test/golden-test-cases/persistent-mysql-haskell.cabalnew file+66

This diff is too big to show here.

test/golden-test-cases/persistent-mysql-haskell.nix.goldennew file+23

This diff is too big to show here.

test/golden-test-cases/picosat.cabalnew file+72

This diff is too big to show here.

test/golden-test-cases/picosat.nix.goldennew file+13

This diff is too big to show here.

test/golden-test-cases/pinch.cabalnew file+111

This diff is too big to show here.

test/golden-test-cases/pinch.nix.goldennew file+21

This diff is too big to show here.

test/golden-test-cases/pipes-network.cabalnew file+51

This diff is too big to show here.

test/golden-test-cases/pipes-network.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/pipes-safe.cabalnew file+52

This diff is too big to show here.

test/golden-test-cases/pipes-safe.nix.goldennew file+14

This diff is too big to show here.

test/golden-test-cases/pointed.cabalnew file+98

This diff is too big to show here.

test/golden-test-cases/pointed.nix.goldennew file+17

This diff is too big to show here.

test/golden-test-cases/poly-arity.cabalnew file+23

This diff is too big to show here.

test/golden-test-cases/poly-arity.nix.goldennew file+9

This diff is too big to show here.

test/golden-test-cases/polynomials-bernstein.cabalnew file+22

This diff is too big to show here.

test/golden-test-cases/polynomials-bernstein.nix.goldennew file+9

This diff is too big to show here.

test/golden-test-cases/postgresql-simple-url.cabalnew file+43

This diff is too big to show here.

test/golden-test-cases/postgresql-simple-url.nix.goldennew file+17

This diff is too big to show here.

test/golden-test-cases/prelude-safeenum.cabalnew file+59

This diff is too big to show here.

test/golden-test-cases/prelude-safeenum.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/presburger.cabalnew file+32

This diff is too big to show here.

test/golden-test-cases/presburger.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/prettyclass.cabalnew file+15

This diff is too big to show here.

test/golden-test-cases/prettyclass.nix.goldennew file+9

This diff is too big to show here.

test/golden-test-cases/prettyprinter-compat-ansi-wl-pprint.cabalnew file+36

This diff is too big to show here.

test/golden-test-cases/prettyprinter-compat-ansi-wl-pprint.nix.goldennew file+14

This diff is too big to show here.

test/golden-test-cases/prettyprinter-compat-wl-pprint.cabalnew file+35

This diff is too big to show here.

test/golden-test-cases/prettyprinter-compat-wl-pprint.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/primitive.cabalnew file+76

This diff is too big to show here.

test/golden-test-cases/primitive.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/product-profunctors.cabalnew file+53

This diff is too big to show here.

test/golden-test-cases/product-profunctors.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/profiterole.cabalnew file+44

This diff is too big to show here.

test/golden-test-cases/profiterole.nix.goldennew file+17

This diff is too big to show here.

test/golden-test-cases/projectroot.cabalnew file+43

This diff is too big to show here.

test/golden-test-cases/projectroot.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/proto-lens-optparse.cabalnew file+26

This diff is too big to show here.

test/golden-test-cases/proto-lens-optparse.nix.goldennew file+14

This diff is too big to show here.

test/golden-test-cases/proto-lens.cabalnew file+45

This diff is too big to show here.

test/golden-test-cases/proto-lens.nix.goldennew file+16

This diff is too big to show here.

test/golden-test-cases/psqueues.cabalnew file+156

This diff is too big to show here.

test/golden-test-cases/psqueues.nix.goldennew file+22

This diff is too big to show here.

test/golden-test-cases/pusher-http-haskell.cabalnew file+92

This diff is too big to show here.

test/golden-test-cases/pusher-http-haskell.nix.goldennew file+23

This diff is too big to show here.

test/golden-test-cases/quickcheck-arbitrary-adt.cabalnew file+40

This diff is too big to show here.

test/golden-test-cases/quickcheck-arbitrary-adt.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/quickcheck-combinators.cabalnew file+43

This diff is too big to show here.

test/golden-test-cases/quickcheck-combinators.nix.goldennew file+9

This diff is too big to show here.

test/golden-test-cases/rank1dynamic.cabalnew file+43

This diff is too big to show here.

test/golden-test-cases/rank1dynamic.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/rasterific-svg.cabalnew file+74

This diff is too big to show here.

test/golden-test-cases/rasterific-svg.nix.goldennew file+23

This diff is too big to show here.

test/golden-test-cases/ratio-int.cabalnew file+25

This diff is too big to show here.

test/golden-test-cases/ratio-int.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/rawstring-qm.cabalnew file+34

This diff is too big to show here.

test/golden-test-cases/rawstring-qm.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/reactive-banana.cabalnew file+88

This diff is too big to show here.

test/golden-test-cases/reactive-banana.nix.goldennew file+20

This diff is too big to show here.

test/golden-test-cases/readline.cabalnew file+33

This diff is too big to show here.

test/golden-test-cases/readline.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/rebase.cabalnew file+372

This diff is too big to show here.

test/golden-test-cases/rebase.nix.goldennew file+20

This diff is too big to show here.

test/golden-test-cases/reform-blaze.cabalnew file+29

This diff is too big to show here.

test/golden-test-cases/reform-blaze.nix.goldennew file+14

This diff is too big to show here.

test/golden-test-cases/reform-hsp.cabalnew file+28

This diff is too big to show here.

test/golden-test-cases/reform-hsp.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/regex-compat.cabalnew file+36

This diff is too big to show here.

test/golden-test-cases/regex-compat.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/regex-pcre.cabalnew file+68

This diff is too big to show here.

test/golden-test-cases/regex-pcre.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/relational-query.cabalnew file+171

This diff is too big to show here.

test/golden-test-cases/relational-query.nix.goldennew file+21

This diff is too big to show here.

test/golden-test-cases/relational-schemas.cabalnew file+100

This diff is too big to show here.

test/golden-test-cases/relational-schemas.nix.goldennew file+14

This diff is too big to show here.

test/golden-test-cases/repa-io.cabalnew file+40

This diff is too big to show here.

test/golden-test-cases/repa-io.nix.goldennew file+14

This diff is too big to show here.

test/golden-test-cases/repa.cabalnew file+98

This diff is too big to show here.

test/golden-test-cases/repa.nix.goldennew file+14

This diff is too big to show here.

test/golden-test-cases/rosezipper.cabalnew file+16

This diff is too big to show here.

test/golden-test-cases/rosezipper.nix.goldennew file+9

This diff is too big to show here.

test/golden-test-cases/rvar.cabalnew file+59

This diff is too big to show here.

test/golden-test-cases/rvar.nix.goldennew file+14

This diff is too big to show here.

test/golden-test-cases/scalpel-core.cabalnew file+87

This diff is too big to show here.

test/golden-test-cases/scalpel-core.nix.goldennew file+18

This diff is too big to show here.

test/golden-test-cases/sdl2.cabalnew file+452

This diff is too big to show here.

test/golden-test-cases/sdl2.nix.goldennew file+18

This diff is too big to show here.

test/golden-test-cases/selda-sqlite.cabalnew file+38

This diff is too big to show here.

test/golden-test-cases/selda-sqlite.nix.goldennew file+14

This diff is too big to show here.

test/golden-test-cases/selda.cabalnew file+110

This diff is too big to show here.

test/golden-test-cases/selda.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/servant-checked-exceptions.cabalnew file+145

This diff is too big to show here.

test/golden-test-cases/servant-checked-exceptions.nix.goldennew file+23

This diff is too big to show here.

test/golden-test-cases/set-cover.cabalnew file+253

This diff is too big to show here.

test/golden-test-cases/set-cover.nix.goldennew file+16

This diff is too big to show here.

test/golden-test-cases/sets.cabalnew file+85

This diff is too big to show here.

test/golden-test-cases/sets.nix.goldennew file+27

This diff is too big to show here.

test/golden-test-cases/simple-smt.cabalnew file+24

This diff is too big to show here.

test/golden-test-cases/simple-smt.nix.goldennew file+9

This diff is too big to show here.

test/golden-test-cases/slack-web.cabalnew file+97

This diff is too big to show here.

test/golden-test-cases/slack-web.nix.goldennew file+21

This diff is too big to show here.

test/golden-test-cases/slug.cabalnew file+65

This diff is too big to show here.

test/golden-test-cases/slug.nix.goldennew file+18

This diff is too big to show here.

test/golden-test-cases/soxlib.cabalnew file+70

This diff is too big to show here.

test/golden-test-cases/soxlib.nix.goldennew file+19

This diff is too big to show here.

test/golden-test-cases/speedy-slice.cabalnew file+80

This diff is too big to show here.

test/golden-test-cases/speedy-slice.nix.goldennew file+16

This diff is too big to show here.

test/golden-test-cases/splice.cabalnew file+66

This diff is too big to show here.

test/golden-test-cases/splice.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/spreadsheet.cabalnew file+108

This diff is too big to show here.

test/golden-test-cases/spreadsheet.nix.goldennew file+16

This diff is too big to show here.

test/golden-test-cases/stack-type.cabalnew file+25

This diff is too big to show here.

test/golden-test-cases/stack-type.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/state-codes.cabalnew file+60

This diff is too big to show here.

test/golden-test-cases/state-codes.nix.goldennew file+13

This diff is too big to show here.

test/golden-test-cases/stb-image-redux.cabalnew file+45

This diff is too big to show here.

test/golden-test-cases/stb-image-redux.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/stm-containers.cabalnew file+251

This diff is too big to show here.

test/golden-test-cases/stm-containers.nix.goldennew file+27

This diff is too big to show here.

test/golden-test-cases/streaming-commons.cabalnew file+161

This diff is too big to show here.

test/golden-test-cases/streaming-commons.nix.goldennew file+23

This diff is too big to show here.

test/golden-test-cases/strict-base-types.cabalnew file+130

This diff is too big to show here.

test/golden-test-cases/strict-base-types.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/strict-types.cabalnew file+34

This diff is too big to show here.

test/golden-test-cases/strict-types.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/string-class.cabalnew file+60

This diff is too big to show here.

test/golden-test-cases/string-class.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/stripe-haskell.cabalnew file+35

This diff is too big to show here.

test/golden-test-cases/stripe-haskell.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/svg-tree.cabalnew file+61

This diff is too big to show here.

test/golden-test-cases/svg-tree.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/swagger.cabalnew file+61

This diff is too big to show here.

test/golden-test-cases/swagger.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/system-argv0.cabalnew file+42

This diff is too big to show here.

test/golden-test-cases/system-argv0.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/system-fileio.cabalnew file+91

This diff is too big to show here.

test/golden-test-cases/system-fileio.nix.goldennew file+18

This diff is too big to show here.

test/golden-test-cases/system-filepath.cabalnew file+61

This diff is too big to show here.

test/golden-test-cases/system-filepath.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/tagged.cabalnew file+67

This diff is too big to show here.

test/golden-test-cases/tagged.nix.goldennew file+14

This diff is too big to show here.

test/golden-test-cases/taggy.cabalnew file+140

This diff is too big to show here.

test/golden-test-cases/taggy.nix.goldennew file+27

This diff is too big to show here.

test/golden-test-cases/tagstream-conduit.cabalnew file+62

This diff is too big to show here.

test/golden-test-cases/tagstream-conduit.nix.goldennew file+20

This diff is too big to show here.

test/golden-test-cases/tasty-hedgehog.cabalnew file+41

This diff is too big to show here.

test/golden-test-cases/tasty-hedgehog.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/tasty-rerun.cabalnew file+87

This diff is too big to show here.

test/golden-test-cases/tasty-rerun.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/tce-conf.cabalnew file+66

This diff is too big to show here.

test/golden-test-cases/tce-conf.nix.goldennew file+14

This diff is too big to show here.

test/golden-test-cases/terminal-progress-bar.cabalnew file+69

This diff is too big to show here.

test/golden-test-cases/terminal-progress-bar.nix.goldennew file+17

This diff is too big to show here.

test/golden-test-cases/test-fixture.cabalnew file+78

This diff is too big to show here.

test/golden-test-cases/test-fixture.nix.goldennew file+20

This diff is too big to show here.

test/golden-test-cases/texmath.cabalnew file+156

This diff is too big to show here.

test/golden-test-cases/texmath.nix.goldennew file+21

This diff is too big to show here.

test/golden-test-cases/text-icu.cabalnew file+118

This diff is too big to show here.

test/golden-test-cases/text-icu.nix.goldennew file+19

This diff is too big to show here.

test/golden-test-cases/text-postgresql.cabalnew file+50

This diff is too big to show here.

test/golden-test-cases/text-postgresql.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/th-expand-syns.cabalnew file+39

This diff is too big to show here.

test/golden-test-cases/th-expand-syns.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/these.cabalnew file+90

This diff is too big to show here.

test/golden-test-cases/these.nix.goldennew file+24

This diff is too big to show here.

test/golden-test-cases/timezone-series.cabalnew file+57

This diff is too big to show here.

test/golden-test-cases/timezone-series.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/transformers-compat.cabalnew file+99

This diff is too big to show here.

test/golden-test-cases/transformers-compat.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/transformers-lift.cabalnew file+36

This diff is too big to show here.

test/golden-test-cases/transformers-lift.nix.goldennew file+12

This diff is too big to show here.

test/golden-test-cases/tree-fun.cabalnew file+70

This diff is too big to show here.

test/golden-test-cases/tree-fun.nix.goldennew file+9

This diff is too big to show here.

test/golden-test-cases/ttrie.cabalnew file+68

This diff is too big to show here.

test/golden-test-cases/ttrie.nix.goldennew file+26

This diff is too big to show here.

test/golden-test-cases/tuple-th.cabalnew file+23

This diff is too big to show here.

test/golden-test-cases/tuple-th.nix.goldennew file+9

This diff is too big to show here.

test/golden-test-cases/tuples-homogenous-h98.cabalnew file+59

This diff is too big to show here.

test/golden-test-cases/tuples-homogenous-h98.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/turtle-options.cabalnew file+56

This diff is too big to show here.

test/golden-test-cases/turtle-options.nix.goldennew file+16

This diff is too big to show here.

test/golden-test-cases/type-operators.cabalnew file+26

This diff is too big to show here.

test/golden-test-cases/type-operators.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/type-spec.cabalnew file+102

This diff is too big to show here.

test/golden-test-cases/type-spec.nix.goldennew file+11

This diff is too big to show here.

test/golden-test-cases/unicode-show.cabalnew file+48

This diff is too big to show here.

test/golden-test-cases/unicode-show.nix.goldennew file+16

This diff is too big to show here.

test/golden-test-cases/unique.cabalnew file+31

This diff is too big to show here.

test/golden-test-cases/unique.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/unix-bytestring.cabalnew file+62

This diff is too big to show here.

test/golden-test-cases/unix-bytestring.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/unlit.cabalnew file+44

This diff is too big to show here.

test/golden-test-cases/unlit.nix.goldennew file+12

This diff is too big to show here.

test/golden-test-cases/utility-ht.cabalnew file+108

This diff is too big to show here.

test/golden-test-cases/utility-ht.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/validity-aeson.cabalnew file+33

This diff is too big to show here.

test/golden-test-cases/validity-aeson.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/validity-containers.cabalnew file+33

This diff is too big to show here.

test/golden-test-cases/validity-containers.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/vector-mmap.cabalnew file+33

This diff is too big to show here.

test/golden-test-cases/vector-mmap.nix.goldennew file+13

This diff is too big to show here.

test/golden-test-cases/vivid-supercollider.cabalnew file+69

This diff is too big to show here.

test/golden-test-cases/vivid-supercollider.nix.goldennew file+17

This diff is too big to show here.

test/golden-test-cases/vty.cabalnew file+624

This diff is too big to show here.

test/golden-test-cases/vty.nix.goldennew file+33

This diff is too big to show here.

test/golden-test-cases/wai-cors.cabalnew file+168

This diff is too big to show here.

test/golden-test-cases/wai-cors.nix.goldennew file+23

This diff is too big to show here.

test/golden-test-cases/wai-middleware-auth.cabalnew file+75

This diff is too big to show here.

test/golden-test-cases/wai-middleware-auth.nix.goldennew file+28

This diff is too big to show here.

test/golden-test-cases/wai-middleware-caching-redis.cabalnew file+40

This diff is too big to show here.

test/golden-test-cases/wai-middleware-caching-redis.nix.goldennew file+16

This diff is too big to show here.

test/golden-test-cases/wai-middleware-prometheus.cabalnew file+46

This diff is too big to show here.

test/golden-test-cases/wai-middleware-prometheus.nix.goldennew file+16

This diff is too big to show here.

test/golden-test-cases/warp.cabalnew file+208

This diff is too big to show here.

test/golden-test-cases/warp.nix.goldennew file+34

This diff is too big to show here.

test/golden-test-cases/weigh.cabalnew file+60

This diff is too big to show here.

test/golden-test-cases/weigh.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/xml-hamlet.cabalnew file+44

This diff is too big to show here.

test/golden-test-cases/xml-hamlet.nix.goldennew file+19

This diff is too big to show here.

test/golden-test-cases/xmonad-contrib.cabalnew file+338

This diff is too big to show here.

test/golden-test-cases/xmonad-contrib.nix.goldennew file+17

This diff is too big to show here.

test/golden-test-cases/yahoo-finance-api.cabalnew file+71

This diff is too big to show here.

test/golden-test-cases/yahoo-finance-api.nix.goldennew file+20

This diff is too big to show here.

test/golden-test-cases/yesod-form-bootstrap4.cabalnew file+31

This diff is too big to show here.

test/golden-test-cases/yesod-form-bootstrap4.nix.goldennew file+10

This diff is too big to show here.

test/golden-test-cases/yesod-gitrepo.cabalnew file+28

This diff is too big to show here.

test/golden-test-cases/yesod-gitrepo.nix.goldennew file+15

This diff is too big to show here.

test/golden-test-cases/yesod-recaptcha2.cabalnew file+37

This diff is too big to show here.

test/golden-test-cases/yesod-recaptcha2.nix.goldennew file+14

This diff is too big to show here.

test/golden-test-cases/zlib.cabalnew file+97

This diff is too big to show here.

test/golden-test-cases/zlib.nix.goldennew file+15

This diff is too big to show here.

update-hackage-snapshot.shnew file+19

This diff is too big to show here.

update-nixpkgs.sh+11−12

This diff is too big to show here.

update-stackage.shnew file+53

This diff is too big to show here.