git.iko.soy/typeable/cabal2nix
on master help sign in
src/PackageList.hs: convert "nix-env -qa *" output into a package list for Hackage
commitb472d83504ff6157e0ebb9942ba4ee4d43835ff0 authorPeter Simons <simons@cryp.to> dateTue 16 Aug 2011, 11:24 (15 years ago) parentb654259
1 file changed+51
src/PackageList.hs+51
src/PackageList.hsnew file+51
@@ -0,0 +1,51 @@
1+module Main ( main ) where
2+
3+import Text.Regex.Posix
4+import System.Process
5+import Data.Maybe
6+import Data.List
7+import Data.Version
8+import Distribution.Text
9+import Distribution.Package
10+import Cabal2Nix.Name
11+
12+regsubmatch :: String -> String -> [String]
13+regsubmatch buf patt = let (_,_,_,x) = f in x
14+ where f :: (String,String,String,[String])
15+ f = match (makeRegexOpts compExtended execBlank patt) buf
16+
17+parseHaskellPackageName :: String -> Maybe (String,Version)
18+parseHaskellPackageName name =
19+ case name `regsubmatch` "^haskell-(.*)-ghc[0-9.]+-(.*)$" of
20+ [name',version] -> case simpleParse version of
21+ Just version' -> Just (name',version')
22+ _ -> Nothing
23+ _ -> Nothing
24+
25+stripProfilingTag :: Version -> Version
26+stripProfilingTag (Version v tags) = Version v (filter (/="profiling") tags)
27+
28+getHaskellPackageList :: IO [(String,Version)]
29+getHaskellPackageList = do
30+ allPkgs <- fmap lines (readProcess "bash" ["-c", "exec nix-env -qa \\* 2>/dev/tty"] "")
31+ let hsPkgs = map parseHaskellPackageName allPkgs
32+ pkglist = [ (name, stripProfilingTag version) | Just (name,version) <- hsPkgs ]
33+ return (sort (nub pkglist))
34+
35+selectLatestVersion :: [(String,Version)] -> [(String,Version)]
36+selectLatestVersion = nubBy f2 . sortBy f1
37+ where
38+ f1 (n1,v1) (n2,v2)
39+ | n1 == n2 = compare v2 v1
40+ | otherwise = compare n1 n2
41+ f2 (n1,v1) (n2,v2) = n1 == n2
42+
43+formatPackageLine :: (String,Version) -> String
44+formatPackageLine (n,v) = show (n, showVersion v, Just url)
45+ where
46+ url = "http://hydra.nixos.org/job/nixpkgs/trunk/haskellPackages_ghc704_no_profiling."++toNixName n
47+
48+main :: IO ()
49+main = do
50+ pkgs <- fmap selectLatestVersion getHaskellPackageList
51+ mapM_ (putStrLn . formatPackageLine) pkgs