git.iko.soy/typeable/cabal2nix
on master help sign in
PackageList.hs: don't try to guess the Nix attribute -- nix-env can tell us what it is
7919758Peter Simons
src/PackageList.hs+32−32
@@ -1,51 +1,51 @@
1module Main ( main ) where
1module Main ( main ) where
2
2
3−import Text.Regex.Posix
4−import System.Process
5−import Data.Maybe
6import Data.List
3import Data.List
4+import Data.Maybe
7import Data.Version
5import Data.Version
8import Distribution.Text
6import Distribution.Text
9−import Distribution.Package
7+import System.Process
10−import Cabal2Nix.Name
8+import Text.Regex.Posix
11
9
12−regsubmatch :: String -> String -> [String]
10+type Pkg = (String,Version,String) -- (Name, Version, Attribute)
13−regsubmatch buf patt = let (_,_,_,x) = f in x
11+type Pkgset = [Pkg]
14− where f :: (String,String,String,[String])
15− f = match (makeRegexOpts compExtended execBlank patt) buf
16
12
17−parseHaskellPackageName :: String -> Maybe (String,Version)
13+parseHaskellPackageName :: String -> Maybe Pkg
18parseHaskellPackageName name =
14parseHaskellPackageName name =
19− case name `regsubmatch` "^haskell-(.*)-ghc[0-9.]+-(.*)$" of
15+ case name `regsubmatch` "^(haskellPackages[^ \t]+)[ \t]+haskell-(.*)-ghc[0-9.]+-(.*)$" of
20− [name',version] -> case simpleParse version of
16+ [attr,name',version] -> case simpleParse version of
21− Just version' -> Just (name',version')
17+ Just version' -> Just (name',version',attr)
22− _ -> Nothing
18+ _ -> Nothing
23 _ -> Nothing
19 _ -> Nothing
24
20
25−stripProfilingTag :: Version -> Version
26−stripProfilingTag (Version v tags) = Version v (filter (/="profiling") tags)
27−
28−getHaskellPackageList :: IO [(String,Version)]
21+getHaskellPackageList :: IO Pkgset
29getHaskellPackageList = do
22getHaskellPackageList = do
30− allPkgs <- fmap lines (readProcess "bash" ["-c", "exec nix-env -qa \\* 2>/dev/tty"] "")
23+ allPkgs <- fmap lines (readProcess "bash" ["-c", "exec nix-env -qaP \\* 2>/dev/tty"] "")
31− let hsPkgs = map parseHaskellPackageName allPkgs
24+ let pkgset = map parseHaskellPackageName allPkgs
32− pkglist = [ (name, stripProfilingTag version) | Just (name,version) <- hsPkgs ]
33− return (sort (nub pkglist))
25+ return (sort (nub (catMaybes pkgset)))
34
26
35−selectLatestVersion :: [(String,Version)] -> [(String,Version)]
27+stripProfilingVersions :: Pkgset -> Pkgset
28+stripProfilingVersions pkgs = [ p | p@(_,_,attr) <- pkgs , not ("ghc[0-9.]+_profiling" =~ attr) ]
29+
30+selectLatestVersions :: Pkgset -> Pkgset
36−selectLatestVersion = nubBy f2 . sortBy f1
31+selectLatestVersions = nubBy f2 . sortBy f1
37 where
32 where
38− f1 (n1,v1) (n2,v2)
33+ f1 (n1,v1,a1) (n2,v2,a2)
39− | n1 == n2 = compare v2 v1
34+ | n1 == n2 = compare v2 v1
40− | otherwise = compare n1 n2
35+ | otherwise = compare n1 n2
41− f2 (n1,v1) (n2,v2) = n1 == n2
36+ f2 (n1,_,_) (n2,_,_) = n1 == n2
42
37
43−formatPackageLine :: (String,Version) -> String
38+formatPackageLine :: Pkg -> String
44−formatPackageLine (n,v) = show (n, showVersion v, Just url)
39+formatPackageLine (name,version,attr) = show (name, showVersion version, Just url)
45 where
40 where
46− url = "http://hydra.nixos.org/job/nixpkgs/trunk/haskellPackages_ghc704_no_profiling."++toNixName n
41+ url = "http://hydra.nixos.org/job/nixpkgs/trunk/" ++ attr
42+
43+regsubmatch :: String -> String -> [String]
44+regsubmatch buf patt = let (_,_,_,x) = f in x
45+ where f :: (String,String,String,[String])
46+ f = match (makeRegexOpts compExtended execBlank patt) buf
47
47
48main :: IO ()
48main :: IO ()
49main = do
49main = do
50− pkgs <- fmap selectLatestVersion getHaskellPackageList
50+ pkgs <- fmap (selectLatestVersions . stripProfilingVersions) getHaskellPackageList
51 mapM_ (putStrLn . formatPackageLine) pkgs
51 mapM_ (putStrLn . formatPackageLine) pkgs