packages feed

archlinux 0.1 → 0.2

raw patch · 7 files changed

+2066/−5 lines, 7 filesdep +directorydep +filepathdep +processdep ~basePVP ok

version bump matches the API change (PVP)

Dependencies added: directory, filepath, process, xhtml

Dependency ranges changed: base

API changes (from Hackage documentation)

+ Distribution.ArchLinux.AUR: package :: String -> IO (Either String AURInfo, Either String AnnotatedPkgBuild)
+ Distribution.ArchLinux.AUR: packageURLinAUR :: AURInfo -> String
+ Distribution.ArchLinux.PkgBuild: (<$>) :: (Functor f) => (a -> b) -> f a -> f b
+ Distribution.ArchLinux.PkgBuild: AnnotatedPkgBuild :: Maybe Version -> String -> PkgBuild -> AnnotatedPkgBuild
+ Distribution.ArchLinux.PkgBuild: ArchDep :: Dependency -> ArchDep
+ Distribution.ArchLinux.PkgBuild: ArchList :: [a] -> ArchList a
+ Distribution.ArchLinux.PkgBuild: Arch_X86 :: ArchArch
+ Distribution.ArchLinux.PkgBuild: Arch_X86_64 :: ArchArch
+ Distribution.ArchLinux.PkgBuild: GetPKG :: (String -> Either String (a, String)) -> GetPKG a
+ Distribution.ArchLinux.PkgBuild: PkgBuild :: String -> Version -> !Int -> String -> ArchList ArchArch -> String -> ArchList License -> ArchList ArchDep -> ArchList ArchDep -> ArchList String -> ArchList String -> [String] -> Maybe String -> ArchList ArchOptions -> PkgBuild
+ Distribution.ArchLinux.PkgBuild: Strip :: ArchOptions
+ Distribution.ArchLinux.PkgBuild: arch_arch :: PkgBuild -> ArchList ArchArch
+ Distribution.ArchLinux.PkgBuild: arch_build :: PkgBuild -> [String]
+ Distribution.ArchLinux.PkgBuild: arch_depends :: PkgBuild -> ArchList ArchDep
+ Distribution.ArchLinux.PkgBuild: arch_install :: PkgBuild -> Maybe String
+ Distribution.ArchLinux.PkgBuild: arch_license :: PkgBuild -> ArchList License
+ Distribution.ArchLinux.PkgBuild: arch_makedepends :: PkgBuild -> ArchList ArchDep
+ Distribution.ArchLinux.PkgBuild: arch_md5sum :: PkgBuild -> ArchList String
+ Distribution.ArchLinux.PkgBuild: arch_options :: PkgBuild -> ArchList ArchOptions
+ Distribution.ArchLinux.PkgBuild: arch_pkgdesc :: PkgBuild -> String
+ Distribution.ArchLinux.PkgBuild: arch_pkgname :: PkgBuild -> String
+ Distribution.ArchLinux.PkgBuild: arch_pkgrel :: PkgBuild -> !Int
+ Distribution.ArchLinux.PkgBuild: arch_pkgver :: PkgBuild -> Version
+ Distribution.ArchLinux.PkgBuild: arch_source :: PkgBuild -> ArchList String
+ Distribution.ArchLinux.PkgBuild: arch_url :: PkgBuild -> String
+ Distribution.ArchLinux.PkgBuild: data AnnotatedPkgBuild
+ Distribution.ArchLinux.PkgBuild: data ArchArch
+ Distribution.ArchLinux.PkgBuild: data ArchOptions
+ Distribution.ArchLinux.PkgBuild: data PkgBuild
+ Distribution.ArchLinux.PkgBuild: decodePackage :: String -> ResultP AnnotatedPkgBuild
+ Distribution.ArchLinux.PkgBuild: dispNoQuotes :: (Text a) => ArchList a -> Doc
+ Distribution.ArchLinux.PkgBuild: emptyPkg :: AnnotatedPkgBuild
+ Distribution.ArchLinux.PkgBuild: emptyPkgBuild :: PkgBuild
+ Distribution.ArchLinux.PkgBuild: getInput :: GetPKG String
+ Distribution.ArchLinux.PkgBuild: instance (Eq a) => Eq (ArchList a)
+ Distribution.ArchLinux.PkgBuild: instance (Show a) => Show (ArchList a)
+ Distribution.ArchLinux.PkgBuild: instance (Text a) => Text (ArchList a)
+ Distribution.ArchLinux.PkgBuild: instance Eq AnnotatedPkgBuild
+ Distribution.ArchLinux.PkgBuild: instance Eq ArchArch
+ Distribution.ArchLinux.PkgBuild: instance Eq ArchDep
+ Distribution.ArchLinux.PkgBuild: instance Eq ArchOptions
+ Distribution.ArchLinux.PkgBuild: instance Eq PkgBuild
+ Distribution.ArchLinux.PkgBuild: instance Functor ArchList
+ Distribution.ArchLinux.PkgBuild: instance Functor GetPKG
+ Distribution.ArchLinux.PkgBuild: instance Monad GetPKG
+ Distribution.ArchLinux.PkgBuild: instance Monoid (ArchList a)
+ Distribution.ArchLinux.PkgBuild: instance Show AnnotatedPkgBuild
+ Distribution.ArchLinux.PkgBuild: instance Show ArchArch
+ Distribution.ArchLinux.PkgBuild: instance Show ArchDep
+ Distribution.ArchLinux.PkgBuild: instance Show ArchOptions
+ Distribution.ArchLinux.PkgBuild: instance Show PkgBuild
+ Distribution.ArchLinux.PkgBuild: instance Text ArchArch
+ Distribution.ArchLinux.PkgBuild: instance Text ArchDep
+ Distribution.ArchLinux.PkgBuild: instance Text ArchOptions
+ Distribution.ArchLinux.PkgBuild: instance Text String
+ Distribution.ArchLinux.PkgBuild: newtype ArchDep
+ Distribution.ArchLinux.PkgBuild: newtype ArchList a
+ Distribution.ArchLinux.PkgBuild: newtype GetPKG a
+ Distribution.ArchLinux.PkgBuild: oldCabal2Arch :: AnnotatedPkgBuild -> Bool
+ Distribution.ArchLinux.PkgBuild: pkgBody :: AnnotatedPkgBuild -> PkgBuild
+ Distribution.ArchLinux.PkgBuild: pkgBuiltWith :: AnnotatedPkgBuild -> Maybe Version
+ Distribution.ArchLinux.PkgBuild: pkgHeader :: AnnotatedPkgBuild -> String
+ Distribution.ArchLinux.PkgBuild: readPackage :: AnnotatedPkgBuild -> GetPKG AnnotatedPkgBuild
+ Distribution.ArchLinux.PkgBuild: recentCabal2ArchVersion :: Maybe Version
+ Distribution.ArchLinux.PkgBuild: runGetPKG :: GetPKG a -> String -> ResultP a
+ Distribution.ArchLinux.PkgBuild: setInput :: String -> GetPKG ()
+ Distribution.ArchLinux.PkgBuild: type ResultP a = Either String a
+ Distribution.ArchLinux.PkgBuild: type Warnings = String
+ Distribution.ArchLinux.PkgBuild: un :: GetPKG a -> String -> Either String (a, String)
+ Distribution.ArchLinux.Report: myReadProcess :: FilePath -> [String] -> String -> IO (Either (ExitCode, String, String) String)
+ Distribution.ArchLinux.Report: report :: [String] -> IO String
- Distribution.ArchLinux.AUR: AURInfo :: Integer -> String -> Either String (Version, String) -> Integer -> String -> Integer -> String -> FilePath -> String -> Integer -> Bool -> AURInfo
+ Distribution.ArchLinux.AUR: AURInfo :: Integer -> String -> String -> Either String (Version, String) -> Integer -> String -> Integer -> String -> FilePath -> String -> Integer -> Bool -> AURInfo

Files

Distribution/ArchLinux/AUR.hs view
@@ -9,7 +9,9 @@ module Distribution.ArchLinux.AUR (         AURInfo(..),         info,-        search+        search,+        package+     ) where  {-@@ -37,7 +39,12 @@ import Text.PrettyPrint.HughesPJClass import qualified Data.Map as M import Control.Monad+import System.FilePath+import Data.List+import Data.Char +import Distribution.ArchLinux.PkgBuild+ ------------------------------------------------------------------------  -- | Query AUR for information on a package @@ -68,7 +75,64 @@         Right a -> flatten a  ------------------------------------------------------------------------+--+-- TODO: programmatically list all packages by arch-haskell+-- generate table of versions.+-- colour out of date things.+-- +-- | Return the parsed PKGBUILD+-- pkgbuild :: String -> IO (Either String [String]) -- (Either String PkgBuild)++package :: String -> IO (Either String AURInfo, Either String AnnotatedPkgBuild)+package m = do+    v <- info m+    case v of+        Left s  -> return $ (Left s, Left "No PKGBUILD found")+        Right p -> do+            let name   = packageName p+                aurUrl = "http://aur.archlinux.org/packages" </> name </> name </> "PKGBUILD"++            rsp <- simpleHTTP (getRequest aurUrl)+            case rsp of+                 Left err -> return $ (Right p, Left (show err))+                 Right _  -> do+                    pkg <- getResponseBody rsp -- TODO 404+                    case decodePackage pkg of+                         Left e ->  return (Right p, Left e)+                         Right k -> return (Right p, Right k)++------------------------------------------------------------------------+--+-- TODO:+-- generate report on packages. groupBy+--++-- | List packages not built with up to date version of cabal2arch+{-+lint_cabal2arch = do+    aurs <- search "haskell"+    forM_ aurs $ \aur -> do+        let n = packageName aur+        k <- pkgbuild n+        case k of+             Left _ -> putStrLn $ "No pkgbuild for" ++ packageName aur+             Right p -> do++                case cabal2arch_version p of+                     v | v == simpleParse "0.6"+                             -> putStrLn $ "GOOD " ++ packageName aur ++                     v       -> do putStrLn $ "Missing cabal2arch version for: " ++ packageName aur ++ " " ++ show v+                                   putStrLn $ "http://aur.archlinux.org/packages.php?ID=" ++ show ( packageID aur)+                                   putStrLn ""+-}++------------------------------------------------------------------------+--+-- TODO: from the packagename, construct the url to the AUR page.+--+ -- | URL for AUR RPC server url :: Doc url = text "http://aur.archlinux.org/rpc.php"@@ -120,6 +184,7 @@ data AURInfo     = AURInfo {          packageID        :: Integer                        -- ^ unique ID of the package on AUR+        ,packageURLinAUR  :: String                         -- ^ url of AUR package         ,packageName      :: String                         -- ^ string name of package         ,packageVersion   :: Either String (Version,String) -- ^ either the AUR version (version,rev)  or a string         ,packageCategory  :: Integer                        -- ^ numeric category of the package (e.g. 17 == System)@@ -197,8 +262,11 @@                                         Just v  -> Right (v, tail xs)                 | otherwise         = Left vers__ +        id_ident = read (fromJSString id_)+     return $ AURInfo {-                packageID          = read (fromJSString id_)+                packageID          = id_ident+               ,packageURLinAUR    = "http://aur.archlinux.org/packages.php?ID=" ++ show id_ident                ,packageName        = fromJSString name_                ,packageVersion     = version                ,packageCategory    = read (fromJSString cat_)
+ Distribution/ArchLinux/PkgBuild.hs view
@@ -0,0 +1,458 @@+{-# LANGUAGE TypeSynonymInstances        #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+-- |+-- Module    : Distribution.ArchLinux.PkgBuild+-- Copyright : (c) Don Stewart, 2008-2009+-- License   : BSD3+--+-- Maintainer: Don Stewart <dons@galois.com>+--++module Distribution.ArchLinux.PkgBuild where++import Distribution.Text+import Distribution.Version+import Distribution.PackageDescription+import Distribution.Package+import Distribution.License++import Text.PrettyPrint+import Data.List+import Data.Monoid+import Data.Maybe+import Debug.Trace++import Control.Monad+import Control.Monad.Instances+import Data.Char+import Numeric+++--+-- | A data type to represent PKGBUILD files+--+data PkgBuild =+  PkgBuild+    { arch_pkgname :: String+        -- ^+        -- The name of the package. This has be a unix-friendly name+        -- as it will be used in the package filename.+    , arch_pkgver  :: Version+        -- ^ The version of the software as released from the authorii+        --  (e.g. ´2.7.1´).+    , arch_pkgrel  :: !Int+        -- ^+        --  This is the release number specific to the Arch Linux+        -- release. This allows package maintainers to make updates to+        -- the package´s configure flags, for example. A pkgrel of 1+        -- is typically used for each upstream software release and is+        -- incremented for intermediate PKGBUILD updates.+    , arch_pkgdesc :: String+        -- ^+        -- This should be a brief description of the package and its+        -- functionality. Try to keep the description to one line of text.+    , arch_arch    :: ArchList ArchArch+        -- ^+        -- Defines on which architectures the given package is+        -- available (e.g. arch=(´i686´ ´x86_64´)).+    , arch_url     :: String+        -- ^+        -- This field contains a URL that is associated with the software+        -- being packaged. This is typically the project´s website.+    , arch_license :: ArchList License+        -- ^+        -- This field specifies the license(s) that apply to the package.+        -- Commonly-used licenses are found in /usr/share/licenses/common. If+        -- you see the package´s license there, simply reference it in the+        -- license field (e.g.  license=(´GPL´)). If the package provides a+        -- license not found in /usr/share/licenses/common, then you should+        -- include the license in the package itself and set+        -- license=(´custom´) or license=(´custom:LicenseName´). The license+        -- should be placed in $pkgdir/usr/share/licenses/$pkgname when+        -- building the package. If multiple licenses are applicable for a+        -- package, list all of them: license=(´GPL´ ´FDL´).+    , arch_makedepends :: ArchList ArchDep+        -- ^+        -- An array of packages that this package depends on to build, but are+        -- not needed at runtime. Packages in this list follow the same format+        -- as depends.++    , arch_depends     :: ArchList ArchDep+        -- ^+        -- An array of packages that this package depends on to run. Packages+        -- in this list should be surrounded with single quotes and contain at+        -- least the package name. Entries can also include a version+        -- requirement of the form name<>version, where <> is one of five+        -- comparisons: >= (greater than or equal to), <= (less than or equal+        -- to), = (equal to), > (greater than), or < (less than).+    , arch_source      :: ArchList String+        -- ^+        -- An array of source files required to build the package. Source+        -- files must either reside in the same directory as the PKGBUILD+        -- file, or be a fully-qualified URL that makepkg will use to download+        -- the file. In order to make the PKGBUILD as useful as possible, use+        -- the $pkgname and $pkgver variables if possible when specifying the+        -- download location. Any files that are compressed will automatically+        -- be extracted, unless found in the noextract array listed below.+    , arch_md5sum      :: ArchList String+        -- ^+        -- This array contains an MD5 hash for every source file specified in+        -- the source array (in the same order). makepkg will use this to+        -- verify source file integrity during subsequent builds. To easily+        -- generate md5sums, run “makepkg -g >> PKGBUILD”. If desired, move+        -- the md5sums line to an appropriate location.  NOTE: makepkg+        -- supports multiple integrity algorithms and their corresponding+        -- arrays (i.e. sha1sums for the SHA1 algorithm); however, official+        -- packages use only md5sums for the time being.+    , arch_build        :: [String]+        -- ^+        -- The build hook++    , arch_install      :: Maybe String+        -- ^+        -- Specifies a special install script that is to be included in the package. This+        -- file should reside in the same directory as the PKGBUILD, and will be copied+        -- into the package by makepkg. It does not need to be included in the source+        -- array (e.g.  install=pkgname.install).+            --+    , arch_options      :: ArchList ArchOptions+        -- ^+        -- This array allows you to override some of makepkg´s default behavior when+        -- building packages. To set an option, just include the option name in the+        -- options array. To reverse the default behavior, place an “!” at the front of+        -- the option. Only specify the options you specifically want to override, the+        -- rest will be taken from makepkg.conf(5).  NOTE: force is a special option only+        -- used in a PKGBUILD(5), do not use it unless you know what you are doing.++    }+    deriving (Show, Eq)++data ArchOptions+    = Strip+    deriving (Show, Eq)++--+-- | An empty PKGBUILD+--+emptyPkgBuild :: PkgBuild+emptyPkgBuild =+  PkgBuild+    { arch_pkgname     = display $ pkgName (package e)+    , arch_pkgver      = pkgVersion (package e)+    , arch_pkgrel      = 1+    , arch_pkgdesc     = synopsis e+    , arch_arch        = ArchList [Arch_X86, Arch_X86_64]+    , arch_url         = homepage e+    , arch_license     = ArchList [license e]++    -- everything depends on ghc and Cabal 1.4.x+    , arch_makedepends = ArchList+        [(ArchDep (Dependency (PackageName "ghc")    AnyVersion))+        ,(ArchDep (Dependency (PackageName "haskell-cabal") AnyVersion))+--        ,(ArchDep (Dependency "haskell-cabal" (LaterVersion (Version  [1,4,0,0] []))))+        ]++        -- makedepends=('ghc>=6.6') ?+    , arch_depends     = ArchList []+    , arch_source      = ArchList []+    , arch_md5sum      = ArchList []+        -- sha1sums=('a08670e4c749850714205f425cb460ed5a0a56b2')+    , arch_build       = []+    , arch_install     = Nothing  -- executable+    , arch_options     = ArchList [Strip]+    }+  where+    e = emptyPackageDescription++------------------------------------------------------------------------+-- Extra pretty printer instances and types++newtype ArchDep = ArchDep Dependency+  deriving (Eq,Show)++instance Text ArchOptions where+  disp Strip = text "strip"+  parse = undefined++-- the PKGBUILD version spec is less expressive than cabal, we can't+-- really handle unions or intersections well yet.++instance Text ArchDep where+  disp (ArchDep (Dependency name ver)) =+    text (display name) <> mydisp ver+   where+     --  >= (greater than or equal to), <= (less than or+     --  equal to), = (equal to), > (greater than), or <+      mydisp AnyVersion           = empty++      mydisp (ThisVersion    v)   = text "=" <> disp v+      mydisp (LaterVersion   v)   = char '>' <> disp v+      mydisp (EarlierVersion v)   = char '<' <> disp v++      mydisp (UnionVersionRanges (ThisVersion  v1) (LaterVersion v2))+        | v1 == v2 = text ">=" <> disp v1+      mydisp (UnionVersionRanges (LaterVersion v2) (ThisVersion  v1))+        | v1 == v2 = text ">=" <> disp v1+      mydisp (UnionVersionRanges (ThisVersion v1) (EarlierVersion v2))+        | v1 == v2 = text "<=" <> disp v1+      mydisp (UnionVersionRanges (EarlierVersion v2) (ThisVersion v1))+        | v1 == v2 = text "<=" <> disp v1++{-+      mydisp (UnionVersionRanges r1 r2)+        = disp r1 <+> text "||" <+> disp r2++      mydisp (IntersectVersionRanges r1 r2)+        = disp r1 <+> text "&&" <+> disp r2+-}++      mydisp x = trace ("WARNING: Can't handle this version format yet: " ++ show x ++ "\ncheck the dependencies by hand.")$ empty++  parse = undefined++--+-- | Valid linux platforms+--+data ArchArch = Arch_X86 | Arch_X86_64+    deriving (Show, Eq)++instance Text ArchArch where+    disp x = case x of+       Arch_X86      -> text "i686"+       Arch_X86_64   -> text "x86_64"+    parse = error "Text.parrse not defined for ArchList"++-- Lists with quotes+newtype ArchList a = ArchList [a]+  deriving (Show, Eq, Monoid, Functor)++instance Text String where+    disp s = text s+    parse = error "Text.parse not defined for String"++instance Text a => Text (ArchList a) where+    disp (ArchList xs) =+         parens (hcat+                (intersperse space+                    (map (quotes . disp) xs)))+    parse = error "Text.parse not defined for ArchList"++-- | Printing with no quotes+dispNoQuotes :: Text a => ArchList a -> Doc+dispNoQuotes (ArchList xs) =+         parens (hcat+                (intersperse space+                    (map disp xs)))+++------------------------------------------------------------------------+-- Support for parsing PKGBULIDs++-- | A PKGBUILD data structure with additional metadata+data AnnotatedPkgBuild =+     AnnotatedPkgBuild+        {pkgBuiltWith :: Maybe Version   -- ^ version of cabal2arch used, if any+        ,pkgHeader    :: String          -- ^ header strings+        ,pkgBody      :: PkgBuild }      -- ^ contents of pkgbuild file+    deriving (Eq, Show)++-- | Empty state structure+emptyPkg :: AnnotatedPkgBuild+emptyPkg = AnnotatedPkgBuild+    { pkgBuiltWith = Nothing+    , pkgHeader    = []+    , pkgBody      = emptyPkgBuild { arch_options = ArchList []+                                , arch_makedepends = ArchList []+                                }+    }++-- | Result type for pkgbuild parsers+type ResultP a = Either String a++decodePackage :: String -> ResultP AnnotatedPkgBuild+decodePackage s = runGetPKG (readPackage emptyPkg) s++-- | The type of pkgbuild parsers for String+newtype GetPKG a = GetPKG { un :: String -> Either String (a,String) }++instance Functor GetPKG where fmap = liftM++instance Monad GetPKG where+  return x       = GetPKG (\s -> Right (x,s))+  fail x         = GetPKG (\_ -> Left x)+  GetPKG m >>= f = GetPKG (\s -> case m s of+                                     Left err -> Left err+                                     Right (a,s1) -> un (f a) s1)++------------------------------------------------------------------------++-- | Run a PKG reader on an input String, returning a PKGBUILD+runGetPKG :: GetPKG a -> String -> ResultP a+runGetPKG (GetPKG m) s = case m s of+     Left err    -> Left err+     Right (a,t) -> case t of+                        [] -> Right a+                        _  -> Left $ "Invalid tokens at end of PKG string: "++ show (take 10 t)++getInput   :: GetPKG String+getInput    = GetPKG (\s -> Right (s,s))++setInput   :: String -> GetPKG ()+setInput s  = GetPKG (\_ -> Right ((),s))++(<$>) :: Functor f => (a -> b) -> f a -> f b+x <$> y = fmap x y++------------------------------------------------------------------------++-- read until end of line+line s = case break (== '\n') s of+    (h , _ : rest) -> do+        setInput rest+        return h++-- | Recursively parse the pkgbuild+--+readPackage :: AnnotatedPkgBuild -> GetPKG AnnotatedPkgBuild+readPackage st = do+  cs <- getInput++  case cs of+    _ | "# Contributor"       `isPrefixOf` cs -> do+            h <- line cs+            readPackage st { pkgHeader = h }++      | "# Package generated" `isPrefixOf` cs -> do+            h <- line cs+            let v = simpleParse+                    . reverse+                    . takeWhile (not . isSpace)+                    . reverse $ h+            readPackage st { pkgBuiltWith = v }++      | "pkgname="  `isPrefixOf` cs -> do+            h <- line cs+            let s = drop 8 h+            readPackage st { pkgBody = (pkgBody st) { arch_pkgname = s } }++      | "pkgrel="   `isPrefixOf` cs -> do+            h <- line cs+            let s = drop 7 h+            readPackage st { pkgBody = (pkgBody st) { arch_pkgrel = read s } }++      | "pkgver="   `isPrefixOf` cs -> do+            h <- line cs+            let s = drop 7 h+            case simpleParse s of+                Nothing -> fail $ "Unable to parse package version"+                Just v  -> readPackage st { pkgBody = (pkgBody st) { arch_pkgver = v } }++      | "pkgdesc="  `isPrefixOf` cs -> do+            h <- line cs+            let s = drop 8 h+            readPackage st { pkgBody = (pkgBody st) { arch_pkgdesc = s } }++      | "url="      `isPrefixOf` cs -> do+            h <- line cs+            let s = drop 4 h+            readPackage st { pkgBody = (pkgBody st) { arch_url = s } }++      | "license="  `isPrefixOf` cs -> do+            h <- line cs+            let s = takeWhile (/= '\'')+                    . drop 1+                    . dropWhile (/= '\'')+                    . drop 8 $ h+                s' | "custom:" `isPrefixOf` s = drop 7 s+                   | otherwise                = s++            case simpleParse s' of+                Nothing -> readPackage st { pkgBody = (pkgBody st) { arch_license = ArchList [UnknownLicense s'] } }+                Just l  -> readPackage st { pkgBody = (pkgBody st) { arch_license = ArchList [l] } }++    -- do these later:++      | "arch="     `isPrefixOf` cs+            -> do _ <- line cs ; readPackage st+      | "makedepends=" `isPrefixOf` cs+            -> do _ <- line cs ; readPackage st+      | "depends="  `isPrefixOf` cs+            -> do _ <- line cs ; readPackage st+      | "options="  `isPrefixOf` cs+            -> do _ <- line cs ; readPackage st+      | "source="   `isPrefixOf` cs+            -> do _ <- line cs ; readPackage st+      | "install="  `isPrefixOf` cs+            -> do _ <- line cs ; readPackage st+      | "md5sums="  `isPrefixOf` cs+            -> do _ <- line cs ; readPackage st+      | "build()"   `isPrefixOf` cs+            -> do setInput [] ; return st++    -- skip comments+      | "#" `isPrefixOf` cs+            -> do _ <- line cs ; readPackage st++      | otherwise -> fail $ "Malformed PKGBUILD: " ++ take 80 cs+++------------------------------------------------------------------------++++{-+# Contributor: Arch Haskell Team <arch-haskell@haskell.org>+# Package generated by cabal2arch 0.6.1+pkgname=haskell-pcre-light+pkgrel=2+pkgver=0.3.1+pkgdesc="A small, efficient and portable regex library for Perl 5 compatible regular expressions"+url="http://hackage.haskell.org/package/pcre-light"+license=('custom:BSD3')+arch=('i686' 'x86_64')+makedepends=()+depends=('ghc' 'haskell-cabal' 'pcre')+options=('strip')+source=(http://hackage.haskell.org/packages/archive/pcre-light/0.3.1/pcre-light-0.3.1.tar.gz)+install=haskell-pcre-light.install+md5sums=('14d8d6e2fd200c385b1d63c888794014')+build() {+    cd ${srcdir}/pcre-light-0.3.1+    runhaskell Setup configure --prefix=/usr --docdir=/usr/share/doc/${pkgname} || return 1+    runhaskell Setup build                   || return 1+    runhaskell Setup haddock || return 1+    runhaskell Setup register   --gen-script || return 1+    runhaskell Setup unregister --gen-script || return 1+    install -D -m744 register.sh   ${pkgdir}/usr/share/haskell/$pkgname/register.sh+    install    -m744 unregister.sh ${pkgdir}/usr/share/haskell/$pkgname/unregister.sh+    install -d -m755 $pkgdir/usr/share/doc/ghc/libraries+    ln -s /usr/share/doc/${pkgname}/html ${pkgdir}/usr/share/doc/ghc/libraries/pcre-light+    runhaskell Setup copy --destdir=${pkgdir} || return 1+    install -D -m644 LICENSE ${pkgdir}/usr/share/licenses/$pkgname/LICENSE || return 1+    rm -f ${pkgdir}/usr/share/doc/${pkgname}/LICENSE+}+    -}++------------------------------------------------------------------------+-- Checker+--++type Warnings = String++-- Hard code the cabal2arch version+recentCabal2ArchVersion :: Maybe Version+recentCabal2ArchVersion = case simpleParse "0.4" of+    Nothing -> error "Unable to parse cabal2arch version"+    Just v  -> Just v++-- | Look for problems in the PKGBUILD+oldCabal2Arch :: AnnotatedPkgBuild -> Bool+oldCabal2Arch s+    | isNothing (pkgBuiltWith s)+    = True++    | pkgBuiltWith s < recentCabal2ArchVersion+    = True -- ["Old version of cabal2arch: " ++ display (fromJust (pkgBuiltWith s))]++    | otherwise                             = False+
+ Distribution/ArchLinux/Report.hs view
@@ -0,0 +1,233 @@++-- | Construct reports about a set of packages in AUR+--+module Distribution.ArchLinux.Report where++import Distribution.ArchLinux.AUR+import Distribution.ArchLinux.PkgBuild++import Distribution.Text++import System.FilePath+import Data.Maybe++import Text.XHtml.Transitional+import Control.OldException+import Control.Monad+import Data.List+import Data.Ord+import Data.Char++import System.Directory+import System.Environment+import System.Exit+import System.FilePath+import Control.Concurrent+import qualified Control.OldException as C+import System.IO+import System.Process++-- | Take as input a list of package names, return a pandoc object+-- reporting on interesting facts about the packages.+--+report :: [String] -> IO String+report xs = do+    -- collect sets of results+    res_ <- forM xs $ \p -> do+        handle (\s -> return (p, Nothing, (Left (show s), Left []))) $ do+            putStrLn $ "Retrieving " ++ p+            k <- package p++            -- if there is a hackage path, lookup version.+            --  cabal info xmonad -v0+            vers <- case k of++                 (Right aur, _) | not (null (packageURL aur))  -> do+                     let name = takeFileName (packageURL aur) -- haskell package name+                     v <- myReadProcess "cabal" ["info","-v0",name] []+                     return $! case v of+                          Left _  -> Nothing+                          Right s -> let v = reverse+                                          . takeWhile (not . isSpace )+                                          . reverse+                                          . (\k -> case find ("Latest version available" `isInfixOf`) k of+                                                 Nothing -> []+                                                 Just n  -> n )+                                          $ lines s++                                     in simpleParse v+                 _ -> return Nothing++            return (p, vers, k)++    let results = sortBy (\(n,_,_) (m,_,_) -> n `compare` m) res_++    return. showHtml $+        (header $+            (thetitle (toHtml "Arch Haskell Package Report")) ++++            ((thelink noHtml) ! [ rel "stylesheet"+                                , href "http://galois.com/~dons/arch-haskell.css"+                                , thetype "text/css" ])) +++++        (body $+            center ((h2 (toHtml "Arch Haskell Package Status")))+            +++++            (scores . table $+                tr (concatHtml+                      [ td . categoryTag . toHtml $ "Package"+                      , td . categoryTag . toHtml $ "Hackage"+                      , td . categoryTag . toHtml $ "Version"+                      , td . categoryTag . toHtml $ "Latest"+                      , td . categoryTag . toHtml $ "cabal2arch"+                      , td . categoryTag . toHtml $ "Votes"+                      , td . categoryTag . toHtml $ "Description"+                      ]) +++++                concatHtml++                    [++                     tr $ concatHtml $+                      case aur_ of+                       Left  err ->+                          [ td $ toHtml p+                          , td $ bad (toHtml "No AUR entry found!")+                          ]++                       Right aur -> case pkg_ of++                        -- Didn't find a PKGBUILD+                         Left  err ->+                          [ td . toHtml $+                              hotlink+                                (packageURLinAUR aur)+                                (toHtml p)++                          , td .+                              (if null (packageURL aur) then bad else id) . toHtml $+                              hotlink+                                (packageURL aur)+                                (toHtml (takeFileName (packageURL aur)))++                          , td  $ case packageVersion aur of+                                     Left s  -> bad $ toHtml s+                                     Right (v,_) -> toHtml $ display v++                          , td  $++                              case vers of+                                   Nothing -> bad (toHtml "-")+                                   Just v  -> case packageVersion aur of+                                     Left s  -> toHtml (display v)+                                     Right (v',_) | v == v' -> toHtml (display v)+                                                 | otherwise -> bad (toHtml (display v))++                          , td $ bad (toHtml "PKGBUILD not found")++                          , td  $ if packageVotes aur > 10+                                     then good $ toHtml $ show $ packageVotes aur+                                     else        toHtml $ show $ packageVotes aur++                          , td $ toHtml $ packageDesc aur+                          ]++                        -- Found everything+                         Right pkg ->+                          [ td . toHtml $+                              hotlink+                                (packageURLinAUR aur)+                                (toHtml p)++                          , td .+                              (if null (packageURL aur) then bad else id) . toHtml $+                              hotlink+                                (packageURL aur)+                                (toHtml (takeFileName (packageURL aur)))++                          , td  $+                                case packageVersion aur of+                                     Left s  -> bad $ toHtml s+                                     Right (v,_) -> toHtml $ display v++                          , td  $+                              case vers of+                                   Nothing -> bad (toHtml "-")+                                   Just v  -> case packageVersion aur of+                                     Left s  -> toHtml (display v)+                                     Right (v',_) | v == v' -> toHtml (display v)+                                                 | otherwise -> bad (toHtml (display v))++                          , td  $+                              if oldCabal2Arch pkg+                                 then bad . toHtml $+                                            case pkgBuiltWith pkg of+                                                     Nothing -> "Nothing"+                                                     Just v  -> display v++                                 else toHtml $+                                            case pkgBuiltWith pkg of+                                                     Nothing -> "Nothing"+                                                     Just v  -> display v++                          , td  $ if packageVotes aur > 10+                                     then good $ toHtml $ show $ packageVotes aur+                                     else        toHtml $ show $ packageVotes aur++                          , td  $ toHtml $ packageDesc aur++                          ]++                        | (p, vers, (aur_,pkg_)) <- results+                        ]+                )+            )+++    {-+    (Right (AURInfo {packageID = 17480, packageName = "haskell-json", packageVersion = Right (Version {versionBranch = [0,4,3], versionTags = []},"1"), packageCategory = 10, packageDesc = "Support for serialising Haskell to and from JSON", packageLocation = 2, packageURL = "http://hackage.haskell.org/cgi-bin/hackage-scripts/package/json", packagePath = "/packages/haskell-json/haskell-json.tar.gz", packageLicense = "custom:BSD3", packageVotes = 16, packageOutOfDate = False}),Right (AnnotatedPkgBuild {pkgBuiltWith = Just (Version {versionBranch = [0,5,3], versionTags = []}), pkgHeader = "# Contributor: Arch Haskell Team <arch-haskell@haskell.org>", pkgBody = PkgBuild {arch_pkgname = "haskell-json", arch_pkgver = Version {versionBranch = [0,4,3], versionTags = []}, arch_pkgrel = 1, arch_pkgdesc = "\"Support for serialising Haskell to and from JSON\"", arch_arch = ArchList [Arch_X86,Arch_X86_64], arch_url = "\"http://hackage.haskell.org/cgi-bin/hackage-scripts/package/json\"", arch_license = ArchList [BSD3], arch_makedepends = ArchList [], arch_depends = ArchList [], arch_source = ArchList [], arch_md5sum = ArchList [], arch_build = [], arch_install = Nothing, arch_options = ArchList []}}))+    -}++categoryTag  x = thediv x ! [identifier "Category"    ]+bad     x = thediv x ! [identifier "Bad"  ]+good    x = thediv x ! [identifier "Best" ]+scores  x = thediv x ! [identifier "Scores" ]+++------------------------------------------------------------------------++--+-- Strict process reading+--+myReadProcess :: FilePath                              -- ^ command to run+            -> [String]                              -- ^ any arguments+            -> String                                -- ^ standard input+            -> IO (Either (ExitCode,String,String) String)  -- ^ either the stdout, or an exitcode and any output++myReadProcess cmd args input = C.handle (return . handler) $ do+    (inh,outh,errh,pid) <- runInteractiveProcess cmd args Nothing Nothing++    output  <- hGetContents outh+    outMVar <- newEmptyMVar+    forkIO $ (C.evaluate (length output) >> putMVar outMVar ())++    errput  <- hGetContents errh+    errMVar <- newEmptyMVar+    forkIO $ (C.evaluate (length errput) >> putMVar errMVar ())++    when (not (null input)) $ hPutStr inh input+    takeMVar outMVar+    takeMVar errMVar+    ex     <- C.catch (waitForProcess pid) (\_e -> return ExitSuccess)+    hClose outh+    hClose inh          -- done with stdin+    hClose errh         -- ignore stderr++    return $ case ex of+        ExitSuccess   -> Right output+        ExitFailure _ -> Left (ex, errput, output)++  where+    handler (C.ExitException e) = Left (e,"","")+    handler e                   = Left (ExitFailure 1, show e, "")+
+ TODO view
@@ -0,0 +1,19 @@++    * lint checker+        -- for all our packages, check they are consistent++    * hackage version checker+        -- automatically check versions between hackage and AUR++    * cabal2arch version checker+        -- list all packages that were generated with which version of cabal2arch,+            then auto-rebuild++    * regression builds++Oh,also, anyone know how I can get the full list of arch-haskell+maintained packages from AUR programmatically? I've found only very+sparse documentation for the JSON interface.++If we could get the full package list, we can do regression builds.+
archlinux.cabal view
@@ -1,5 +1,5 @@ name:           archlinux-version:        0.1+version:        0.2 license:        BSD3 license-file:   LICENSE author:         Don Stewart <dons@galois.com>@@ -23,13 +23,19 @@ cabal-version:  >= 1.2.3  library-    build-depends:  base < 6,+    build-depends:  base >= 4 && < 6,                     HTTP,                     Cabal >= 1.6,                     json,                     pretty,                     prettyclass,-                    containers+                    containers,+                    filepath,+                    xhtml,+                    process,+                    directory      exposed-modules:         Distribution.ArchLinux.AUR+        Distribution.ArchLinux.PkgBuild+        Distribution.ArchLinux.Report
+ scripts/arch-haskell-packages.txt view
@@ -0,0 +1,1271 @@+addlicenseinfo+agda-executable+armada+arrowp+augur+haskell-autoproc+backdropper+bacteria+baskell+beautifhol+bloxorz+bookshelf+c2hs+cabal-rpm+cabal2arch+cabal2doap+cabal2spec+cabalgraph+cap+change-monger+cheatsheet+clevercss+clustertools+conjure+cpbrainfuck+cpphs+curry-frontend+darcs+darcs-beta+darcs-graph+darcs-monitor+darcswatch+datapacker+defendtheking+dephd+derive+distract+djinn+doctest+drift+ehaskell+elerea-examples+emping+equal-files+estreps+fallingblocks+feed-cli+flippi+flow2dot+flower+foo+fquery+fractal+frag+ftshell+gameclock+geniconvert+ghc-core+ghci-haskeline+gitit+glome-hs+graphmod+greencard+guihaskell+hackage-sparks+hackage2twitter+haddock+happraise+happs-tutorial+hashell+hask-home+haskeem+haskell-ac-easyraster-gtk+haskell-ac-halfinteger+haskell-ac-vector+haskell-acme-now+haskell-action-permutations+haskell-actor+haskell-adaptive+haskell-adaptive-containers+haskell-adhoc-network+haskell-aern-net+haskell-aern-real+haskell-aern-rntorm+haskell-aern-rntorm-plot+haskell-agda+haskell-agi+haskell-algebra+haskell-alloy+haskell-alloy-proxy-fd+haskell-alsa+haskell-alsa-midi+haskell-alut+haskell-ansi-terminal+haskell-ansi-wl-pprint+haskell-antimirov+haskell-anydbm+haskell-applepush+haskell-applicative-extras+haskell-applicative-numbers+haskell-archlinux+haskell-arff+haskell-array+haskell-arrayref+haskell-arrows+haskell-asn1+haskell-astar+haskell-atom+haskell-attoparsec+haskell-augeas+haskell-authenticate+haskell-avar+haskell-avltree+haskell-bamboo+haskell-barracuda+haskell-barrie+haskell-base64-string+haskell-basic+haskell-benchpress+haskell-bencode+haskell-berkeleydb+haskell-berkeleydbxml+haskell-bff+haskell-bimap+haskell-binary+haskell-binary-search+haskell-binary-strict+haskell-binarydefer+haskell-bindings+haskell-bindings-common+haskell-bindings-libffi+haskell-bindings-libusb+haskell-bindings-sqlite3+haskell-bindings-uname+haskell-bio+haskell-bitarray+haskell-bitset+haskell-bitsyntax+haskell-bktrees+haskell-blas+haskell-blogination+haskell-bloomfilter+haskell-bool-extras+haskell-boolean+haskell-boxes+haskell-bsd-sysctl+haskell-buster+haskell-buster-gtk+haskell-buster+haskell-byteorder+haskell-bytestring+haskell-bytestring-class+haskell-bytestring-csv+haskell-bytestring-lexing+haskell-bytestring-mmap+haskell-bytestring-show+haskell-bytestring-trie+haskell-bytestringparser+haskell-bytestringreadp+haskell-bzlib+haskell-c-io+haskell-cabalrpmdeps+haskell-caf+haskell-caldims+haskell-carray+haskell-category-extras+haskell-cautious-file+haskell-cc-delcont+haskell-cedict+haskell-cflp+haskell-cgi+haskell-cgi-undecidable+haskell-chalkboard+haskell-chalkboard-viewer+haskell-chalmers-lava2000+haskell-chart+haskell-chasingbottoms+haskell-cheatsheet+haskell-checked+haskell-checkers+haskell-chp+haskell-christmastree+haskell-chunks+haskell-citeproc-hs+haskell-clase+haskell-classify+haskell-clientsession+haskell-clock+haskell-cmath+haskell-cml+haskell-cmonad+haskell-coadjute+haskell-codec-compression-lzf+haskell-codec-image-devil+haskell-codec-libevent+haskell-colock+haskell-colour+haskell-combinat+haskell-comonad-random+haskell-compact-map+haskell-compact-string+haskell-complexity+haskell-concurrentoutput+haskell-condorcet+haskell-configfile+haskell-containers+haskell-contarrow+haskell-control-engine+haskell-control-event+haskell-control-monad-exception+haskell-control-monad-free+haskell-control-monad-omega+haskell-control-monad-queue+haskell-control-timeout+haskell-convertible+haskell-cordering+haskell-core+haskell-coreerlang+haskell-coroutine+haskell-couchdb+haskell-crack+haskell-crc16+haskell-crypto+haskell-cspm-frontend+haskell-csv+haskell-ctemplate+haskell-curl+haskell-data-accessor+haskell-data-accessor-monads-fd+haskell-data-accessor-monads-tf+haskell-data-accessor-mtl+haskell-data-accessor-template+haskell-data-accessor-transformers+haskell-data-binary-ieee754+haskell-data-cordering+haskell-data-default+haskell-data-hash+haskell-data-ivar+haskell-data-memocombinators+haskell-data-ordlist+haskell-data-quotientref+haskell-data-reify+haskell-data-spacepart+haskell-data-tree-avl+haskell-data-trie-general+haskell-data-trie-general-ordgt+haskell-dataenc+haskell-datetime+haskell-dbus+haskell-debian+haskell-debian-binary+haskell-debugtracehelpers+haskell-decimal+haskell-decisiontree+haskell-deeparrow+haskell-delicious+haskell-delimited-text+haskell-denominate+haskell-dequeue+haskell-derive+haskell-derive-gadt+haskell-diagrams+haskell-diff+haskell-digest+haskell-dimensional+haskell-directory+haskell-directory-tree+haskell-dlist+haskell-dnsrbl+haskell-dom+haskell-dotgen+haskell-download+haskell-download-curl+haskell-drhylo+haskell-dsp+haskell-dstring+haskell-dwarf+haskell-dzen-utils+haskell-edisonapi+haskell-edisoncore+haskell-edit-distance+haskell-editline+haskell-eeconfig+haskell-either-unwrap+haskell-elerea+haskell-elf+haskell-email-validate+haskell-emgm+haskell-encode+haskell-encoding+haskell-enumsets+haskell-erf+haskell-errno+haskell-esotericbot+haskell-etherbunny+haskell-event-handlers+haskell-event-list+haskell-event-monad+haskell-executable-path+haskell-exif+haskell-explicit-exception+haskell-explicit-sharing+haskell-extensible-exceptions+haskell-external-sort+haskell-extra+haskell-fad+haskell-fair-predicates+haskell-fastcgi+haskell-fckeditor+haskell-fclabels+haskell-fec+haskell-feed+haskell-feed2twitter+haskell-fez-conf+haskell-ffeed+haskell-fft+haskell-fgl+haskell-fieldtrip+haskell-filemanip+haskell-filepath+haskell-filestore+haskell-finance-quote-yahoo+haskell-finance-treasury+haskell-findbin+haskell-fingertree+haskell-fingertree-psqueue+haskell-finitemap+haskell-first-class-patterns+haskell-fixpoint+haskell-flickr+haskell-flock+haskell-flow2dot+haskell-fmlist+haskell-formlets+haskell-forsyde+haskell-fraction+haskell-franchise+haskell-free-theorems+haskell-freesound+haskell-fsmactions+haskell-fst+haskell-ftgl+haskell-ftphs+haskell-full-sessions+haskell-funcmp+haskell-fungen+haskell-funsat+haskell-future+haskell-game-tree+haskell-garsia-wachs+haskell-gd+haskell-generator+haskell-genericserialize+haskell-geoip+haskell-ghc-mtl+haskell-ghc-paths+haskell-ghc-syb+haskell-ghood+haskell-gitit+haskell-glfw+haskell-glfw-ogl+haskell-glob+haskell-gluraw+haskell-glut+haskell-gmap+haskell-gnuplot+haskell-goa+haskell-gofer-prelude+haskell-googlechart+haskell-googlesb+haskell-gpcsets+haskell-gps+haskell-grapefruit-examples+haskell-grapefruit-frp+haskell-grapefruit-records+haskell-grapefruit-ui+haskell-grapefruit-ui-gtk+haskell-graphalyze+haskell-graphics-drawingcombinators+haskell-graphicsformats+haskell-graphscc+haskell-graphviz+haskell-gravatar+haskell-grotetrap+haskell-growlnotify+haskell-gsasl+haskell-gsl-random+haskell-gtk2hs-cast-glade+haskell-gtk2hs-cast-glib+haskell-gtk2hs-cast-gnomevfs+haskell-gtk2hs-cast-gtk+haskell-gtk2hs-cast-gtkglext+haskell-gtk2hs-cast-gtksourceview2+haskell-gtk2hs-cast-th+haskell-gtk2hs-rpn+haskell-gtk2hsgenerics+haskell-hack+haskell-hack-contrib+haskell-hack-frontend-happstack+haskell-hack-frontend-monadcgi+haskell-hack-handler-cgi+haskell-hack-handler-fastcgi+haskell-hack-handler-happstack+haskell-hack-handler-hyena+haskell-hack-handler-kibro+haskell-hack-handler-simpleserver+haskell-hack-middleware-cleanpath+haskell-hack-middleware-gzip+haskell-hack-middleware-jsonp+haskell-hackmail+haskell-haha+haskell-hake+haskell-halex+haskell-halfs+haskell-hamusic+haskell-happs-data+haskell-happs-ixset+haskell-happs-server+haskell-happs-state+haskell-happs-util+haskell-happshelpers+haskell-happstack+haskell-happstack-data+haskell-happstack-fastcgi+haskell-happstack-helpers+haskell-happstack-ixset+haskell-happstack-server+haskell-happstack-state+haskell-happstack-util+haskell-harm+haskell-harp+haskell-harpy+haskell-hashed-storage+haskell-hasim+haskell-haskeline+haskell-haskeline-class+haskell-haskell-lexer+haskell-haskell-src+haskell-haskell-src-exts+haskell-haskell-src-meta+haskell-haskell-tyrant+haskell-haskell98+haskell-haskelldb+haskell-haskelldb-hdbc+haskell-haskelldb-hdbc-odbc+haskell-haskelldb-hdbc-postgresql+haskell-haskelldb-hdbc-sqlite3+haskell-haskelldb-th+haskell-haskellformaths+haskell-haskellnet+haskell-haskgame+haskell-haskore+haskell-haskore-realtime+haskell-haskore-supercollider+haskell-haskore-synthesizer+haskell-haskore-vintage+haskell-haxml+haskell-haxr+haskell-hcard+haskell-hcheat+haskell-hcl+haskell-hcodecs+haskell-hcsound+haskell-hdaemonize+haskell-hdbc+haskell-hdbc-mysql+haskell-hdbc-odbc+haskell-hdbc-postgresql+haskell-hdbc-sqlite3+haskell-hdbc-tuple+haskell-hdf+haskell-heap+haskell-hedi+haskell-hera+haskell-hetero-map+haskell-hex+haskell-hexdump+haskell-hexpat+haskell-hexpat-pickle+haskell-hfann+haskell-hfov+haskell-hfuse+haskell-hgal+haskell-hgalib+haskell-hgdbmi+haskell-hgeometric+haskell-hgettext+haskell-hgl+haskell-hieroglyph+haskell-higherorder+haskell-highlighting-kate+haskell-hinotify+haskell-hinstaller+haskell-hint+haskell-hinze-streams+haskell-hipmunk+haskell-hjavascript+haskell-hjs+haskell-hjscript+haskell-hledger+haskell-hlibev+haskell-hlist+haskell-hlongurl+haskell-hmarkup+haskell-hmatrix+haskell-hmatrix-static+haskell-hmeap+haskell-hmidi+haskell-hmm+haskell-hmpfr+haskell-hmt+haskell-hnm+haskell-hode+haskell-hogg+haskell-holumbus-distribution+haskell-holumbus-mapreduce+haskell-holumbus-storage+haskell-homeomorphic+haskell-hommage+haskell-hopenssl+haskell-hosc+haskell-hpapi+haskell-hpc+haskell-hpc-strobe+haskell-hpdf+haskell-hplot+haskell-hps+haskell-hps-cairo+haskell-hs-dotnet+haskell-hs-fltk+haskell-hs-gizapp+haskell-hs-pgms+haskell-hs-twitter+haskell-hs3+haskell-hsasa+haskell-hsc3+haskell-hsc3-db+haskell-hsc3-dot+haskell-hsc3-process+haskell-hsc3-rec+haskell-hsc3-sf+haskell-hsc3-unsafe+haskell-hscamwire+haskell-hsconfigure+haskell-hscurses+haskell-hsdip+haskell-hsdns+haskell-hsemail+haskell-hsgnutls+haskell-hsgsom+haskell-hsh+haskell-hsharupdf+haskell-hshhelpers+haskell-hshyperestraier+haskell-hsjudy+haskell-hskeleton+haskell-hslogger+haskell-hslogger-template+haskell-hslua+haskell-hsmagick+haskell-hsndfile+haskell-hsntp+haskell-hsopenssl+haskell-hsoundfile+haskell-hsp+haskell-hsp-cgi+haskell-hsparklines+haskell-hsparql+haskell-hsparrot+haskell-hsperl5+haskell-hspr-sh+haskell-hspread+haskell-hsql+haskell-hsql-mysql+haskell-hsql-postgresql+haskell-hssvn+haskell-hssyck+haskell-hstats+haskell-hstringtemplate+haskell-hstringtemplatehelpers+haskell-hsx+haskell-hsx-xhtml+haskell-hsxenctrl+haskell-hsyslog+haskell-hszephyr+haskell-htensor+haskell-htf+haskell-html+haskell-html-minimalist+haskell-http-monad+haskell-http-shed+haskell-http-simple+haskell-http-wget+haskell-httpd-shed+haskell-hugs2yc+haskell-hunit+haskell-hxq+haskell-hxt+haskell-hxt-filter+haskell-hyena+haskell-hyphenate+haskell-i18n+haskell-icalendar+haskell-iconv+haskell-idna+haskell-ieee+haskell-ieee-utils+haskell-ieee754-parser+haskell-iexception+haskell-ifelse+haskell-iff+haskell-ifs+haskell-imlib+haskell-in-space+haskell-incremental-sat-solver+haskell-indentparser+haskell-infinite-search+haskell-infix+haskell-infixapplicative+haskell-interleavableio+haskell-interlude+haskell-interpolatedstring-perl6+haskell-interpolatedstring-qq+haskell-io-capture+haskell-io-reactive+haskell-ior+haskell-iospec+haskell-ipc+haskell-ipprint+haskell-irc+haskell-iteratee+haskell-ivar-simple+haskell-ivor+haskell-ix-shapable+haskell-jmacro+haskell-join+haskell-jscontracts+haskell-jsmw+haskell-json+haskell-kibro+haskell-kmeans+haskell-kure+haskell-kure-your-boilerplate+haskell-lambdabot-utils+haskell-language-c+haskell-language-python+haskell-language-sh+haskell-lastik+haskell-lax+haskell-lazyarray+haskell-lazyio+haskell-lazysmallcheck+haskell-lazysplines+haskell-lcs+haskell-leapseconds-announced+haskell-level-monad+haskell-libffi+haskell-libgeni+haskell-libmpd+haskell-liboleg+haskell-libxml+haskell-libxml-sax+haskell-lighttpd-conf+haskell-linear-maps+haskell-lispparser+haskell-list+haskell-list-extras+haskell-list-tries+haskell-listlike+haskell-listzipper+haskell-llvm+haskell-loch+haskell-logfloat+haskell-logic-tptp+haskell-logict+haskell-lojban+haskell-loli+haskell-lru+haskell-lub+haskell-lucu+haskell-luhn+haskell-lui+haskell-maccatcher+haskell-macho+haskell-marked-pretty+haskell-markov-chain+haskell-mathlink+haskell-matlab+haskell-matrix-market+haskell-maybench+haskell-maybet+haskell-mediawiki+haskell-memcached+haskell-memotrie+haskell-mersenne-random+haskell-mersenne-random-pure64+haskell-metaobject+haskell-microbench+haskell-midi+haskell-mime+haskell-mime-directory+haskell-mime-string+haskell-miniplex+haskell-missingh+haskell-missingpy+haskell-mlist+haskell-mmap+haskell-mmtl+haskell-modsplit+haskell-mohws+haskell-monad-interleave+haskell-monad-loops+haskell-monad-param+haskell-monad-ran+haskell-monad-tx+haskell-monadcatchio-mtl+haskell-monadiccp+haskell-monadlab+haskell-monadlib+haskell-monadprompt+haskell-monadrandom+haskell-monads-fd+haskell-monads-tf+haskell-monoid-record+haskell-monoid-transformer+haskell-monte-carlo+haskell-mps+haskell-mtl+haskell-mtl-tf+haskell-mtlparse+haskell-mtlx+haskell-mucipher+haskell-mueval+haskell-multirec+haskell-multirec-binary+haskell-multiset+haskell-multisetrewrite+haskell-munkres+haskell-musicxml+haskell-n-m+haskell-nano-hmac+haskell-nano-md5+haskell-nanocurses+haskell-nat+haskell-nemesis+haskell-netsnmp+haskell-network+haskell-network-bytestring+haskell-network-connection+haskell-network-dns+haskell-network-minihttp+haskell-network-multicast+haskell-network-protocol-xmpp+haskell-network-server+haskell-newbinary+haskell-nntp+haskell-non-negative+haskell-nonempty+haskell-np-extras+haskell-nthable+haskell-numbers+haskell-numbersieves+haskell-numerals+haskell-numeric-prelude+haskell-numeric-quest+haskell-obdd+haskell-obj+haskell-objectname+haskell-oeis+haskell-ogl+haskell-old-locale+haskell-old-time+haskell-onetuple+haskell-open-witness+haskell-openafp+haskell-openal+haskell-opengl+haskell-openglcheck+haskell-openglraw+haskell-openid+haskell-opensoundcontrol-ht+haskell-openvg+haskell-operads+haskell-opml+haskell-orchid+haskell-osx-ar+haskell-packedstring+haskell-pageio+haskell-panda+haskell-pandoc+haskell-parallel+haskell-parallel-tree-search+haskell-parameterized-data+haskell-parport+haskell-parrows+haskell-parse-dimacs+haskell-parseargs+haskell-parsec+haskell-parsedate+haskell-parserfunction+haskell-pbkdf2+haskell-pcap+haskell-pcre-light+haskell-peakachu+haskell-peano-inf+haskell-pecoff+haskell-penn-treebank+haskell-perfecthash+haskell-permutation+haskell-persistent-map+haskell-pgm+haskell-phonetic-code+haskell-pipe+haskell-pkcs1+haskell-platform+haskell-plugins+haskell-pointedlist+haskell-polyparse+haskell-polytypeable+haskell-popenhs+haskell-portaudio+haskell-porte+haskell-posix-realtime+haskell-powermate+haskell-ppm+haskell-pqc+haskell-pqueue-mtl+haskell-predicates+haskell-preprocessor-tools+haskell-presburger+haskell-press+haskell-pretty+haskell-pretty-ncols+haskell-pretty-show+haskell-prettyclass+haskell-primes+haskell-printf-mauke+haskell-printf-th+haskell-priority-queue+haskell-priority-sync+haskell-probability+haskell-process+haskell-procrastinating-structure+haskell-procrastinating-variable+haskell-progressbar+haskell-property-list+haskell-proplang+haskell-protocol-buffers+haskell-protocol-buffers-descriptor+haskell-psqueue+haskell-pugs-compat+haskell-pugs-drift+haskell-pugs-hsregex+haskell-pugs-hssyck+haskell-pure-fft+haskell-puremd5+haskell-quantum-arrow+haskell-queue+haskell-queuelike+haskell-quickcheck+haskell-random+haskell-random-access-list+haskell-random-fu+haskell-random-shuffle+haskell-randomdotorg+haskell-ranged-sets+haskell-rangemin+haskell-ranges+haskell-rbr+haskell-rdtsc+haskell-reactive+haskell-reactive-fieldtrip+haskell-reactive-glut+haskell-readline+haskell-recaptcha+haskell-redhandlers+haskell-reflection+haskell-refserialize+haskell-regex-base+haskell-regex-compat+haskell-regex-dfa+haskell-regex-pcre+haskell-regex-pcre-builtin+haskell-regex-posix+haskell-regex-tdfa+haskell-regex-tdfa-utf8+haskell-regex-xmlschema+haskell-regexpr+haskell-regexpr-symbolic+haskell-regular+haskell-reord+haskell-replib+haskell-restng+haskell-reviewboard+haskell-rewriting+haskell-rjson+haskell-rmonad+haskell-roman-numerals+haskell-rosezipper+haskell-rsa+haskell-rsagl+haskell-rss+haskell-rungekutta+haskell-safe+haskell-safe-lazy-io+haskell-safecopy+haskell-salvia+haskell-satchmo+haskell-satchmo-backends+haskell-satchmo-funsat+haskell-satchmo-minisat+haskell-scc+haskell-scenegraph+haskell-scgi+haskell-sdl+haskell-sdl-gfx+haskell-sdl-image+haskell-sdl-mixer+haskell-sdl-mpeg+haskell-sdl-ttf+haskell-segmenttree+haskell-selenium+haskell-semaphore-plus+haskell-sendfile+haskell-serial+haskell-sessions+haskell-setlocale+haskell-sexpr+haskell-sg+haskell-sha+haskell-shellac+haskell-shellac-editline+haskell-shellac-haskeline+haskell-shellac-readline+haskell-show+haskell-shpider+haskell-simple-reflect+haskell-simple-sessions+haskell-simpleargs+haskell-simplesmtpclient+haskell-smallcheck+haskell-smtpclient+haskell-sonic-visualiser+haskell-sox+haskell-spacepart+haskell-sparsebit+haskell-species+haskell-sphinx+haskell-split+haskell-spreadsheet+haskell-sqlite+haskell-stateful-mtl+haskell-stateref+haskell-statevar+haskell-statistics-fusion+haskell-stb-image+haskell-stb-truetype+haskell-stemmer+haskell-stm+haskell-stm-io-hooks+haskell-stmcontrol+haskell-stmonadtrans+haskell-storable+haskell-storable-complex+haskell-storable-record+haskell-storable-tuple+haskell-storablevector+haskell-stream+haskell-stream-fusion+haskell-stream-monad+haskell-streamproc+haskell-strict+haskell-strict-concurrency+haskell-strict-io+haskell-strictbench+haskell-string-combinators+haskell-stringprep+haskell-stringsearch+haskell-stringtable-atom+haskell-suffixtree+haskell-supercollider-ht+haskell-supercollider-midi+haskell-svgfonts+haskell-swf+haskell-syb+haskell-syb-with-class+haskell-sybwidget+haskell-synchronous-channels+haskell-synthesizer+haskell-synthesizer-core+haskell-synthesizer-dimensional+haskell-synthesizer-inference+haskell-system-inotify+haskell-system-uuid+haskell-tabular+haskell-tagchup+haskell-taglib+haskell-tagsoup+haskell-tagsoup-ht+haskell-tagsoup-parsec+haskell-takusen+haskell-tar+haskell-tcache+haskell-tconfig+haskell-tcp+haskell-template+haskell-template-haskell+haskell-tensor+haskell-terminfo+haskell-ternarytrees+haskell-terrahs+haskell-test-framework+haskell-test-framework-hunit+haskell-test-framework-quickcheck+haskell-testpack+haskell-testrunner+haskell-texmath+haskell-text+haskell-text-icu+haskell-tfp+haskell-th-fold+haskell-theora+haskell-thih+haskell-thingie+haskell-threadmanager+haskell-thrist+haskell-time+haskell-timeit+haskell-tinyurl+haskell-tokyocabinet-haskell+haskell-tokyotyrant-haskell+haskell-torch+haskell-traced+haskell-tracker+haskell-transactional-events+haskell-transformers+haskell-tree-monad+haskell-treestructures+haskell-tttas+haskell-tuple+haskell-tv+haskell-type+haskell-type-equality-check+haskell-type-level+haskell-typecompose+haskell-typehash+haskell-typical+haskell-uconv+haskell-unamb+haskell-unamb-custom+haskell-unboxed-containers+haskell-unicode-names+haskell-unicode-prelude+haskell-unicode-properties+haskell-uniplate+haskell-uniqueid+haskell-universal-binary+haskell-unix+haskell-unix-compat+haskell-unix-pty-light+haskell-unixutils+haskell-unlambda+haskell-uri-template+haskell-url+haskell-urldisp+haskell-urlencoded+haskell-utf8-env+haskell-utf8-light+haskell-utf8-prelude+haskell-utility-ht+haskell-uu-parsinglib+haskell-uuid+haskell-uulib+haskell-uvector+haskell-uvector-algorithms+haskell-vacuum+haskell-vacuum-cairo+haskell-vacuum-opengl+haskell-validate+haskell-value-supply+haskell-vcard+haskell-vec+haskell-vect+haskell-vector-space+haskell-visual-graphrewrite+haskell-vty+haskell-wave+haskell-wavesurfer+haskell-web-encodings+haskell-webbits+haskell-whim+haskell-wikimediaparser+haskell-windowslive+haskell-wired+haskell-witness+haskell-wl-pprint+haskell-wol+haskell-wordcloud+haskell-wordnet+haskell-workflow+haskell-wx+haskell-wxcore+haskell-wxfruit+haskell-xattr+haskell-xauth+haskell-xcb-types+haskell-xformat+haskell-xhb+haskell-xhtml+haskell-xml+haskell-xml-basic+haskell-xml-parsec+haskell-xosd+haskell-xsact+haskell-yahoo-web-search+haskell-yamlreference+haskell-yampa+haskell-ycextra+haskell-yhccore+haskell-yices+haskell-yjftp+haskell-yjtools+haskell-yogurt+haskell-yuigrid+haskell-zfs+haskell-zip-archive+haskell-zipedit+haskell-zipfold+haskell-zipper+haskell-zoneinfo+hasktags+hback+hbeat+hburg+helisp+helium+hetris+hevolisa+hevolisa-dph+hichi+hinvaders+hipmunkplayground+historian+hledger+hlint+hmp3+hmpf+hoogle+hpodder+hpong+hprotoc+hpylos+hranker+hray+hsclock+hscolour+hsffig+hspresent+hstidy+htags+htar+hunp+husky+hybrid+internetmarke+ip6addr+ircbouncer+ixdopp+jarfind+json2yaml+kbq-gu+korfu+l-seed+lambdabot+lambdacalculator+lambdacube+lambdahack+lambdashell+leksah+lhc+line2pdf+linkchk+lscabal+lslplus+mage+maid+make-hard-links+mazesofmonad+mdo+memscript+mines+minesweeper+mkbndl+mkcabal+modsplit+mohws+monadius+mp3decoder+mpdmate+multiplicity+nehe-tuts+ngrams+nhc98+nymphaea+omnicodec+only+openafp-utils+orchid-demo+pdf2line+pesca+photoname+piet+pkggraph+plsltools+pointfree+pony+printxosd+prof2dot+pugs+pugs-drift+pxsl-tools+quickcheck-script+riot+roguestar-engine+roguestar-gl+rss2irc+sat+sat-micro-hs+satchmo-examples+scaleimage+scurry+sgdemo+she+shelltestrunner+showdown+shu-thing+simgi+simseq+smartword+sourcegraph+spaceinvaders+sphinx-cli+strictify+subtitles+supercollider-midi+tabloid+testpattern+tetris+threadpool+timberc+timepiece+topkata+turing-music+twidge+twitter+typalyze+typeilluminator+uacpid+uhexdump+urlcheck+uuagc+vintage-basic+wavconvert+wp-archivebot+wxasteroids+xml2x+yampasynth+yeganesh+yi+zmachine+ztail
+ scripts/arch-report.hs view
@@ -0,0 +1,6 @@+import Distribution.ArchLinux.Report++main = do+    s <- lines `fmap` readFile "arch-haskell-packages.txt"+    writeFile "/tmp/x.html" =<< report s+