packages feed

cabal-rpm 0.12.3 → 0.12.4

raw patch · 16 files changed

+206/−151 lines, 16 filesdep ~http-client

Dependency ranges changed: http-client

Files

ChangeLog view
@@ -1,3 +1,8 @@+* 0.12.4 (2018-05-31)+- now uses Hackage revisions of packages+- spec --stream STREAM replaces --hackage+- disable https for ghc < 7.10+ * 0.12.3 (2018-05-14) - build: remove erroneous tarball check - refresh: use cblrpm for old cabal-rpm
README.md view
@@ -2,6 +2,7 @@ [![Hackage](http://img.shields.io/hackage/v/cabal-rpm.png)](http://hackage.haskell.org/package/cabal-rpm) [![Stackage LTS](http://stackage.org/package/cabal-rpm/badge/lts)](http://stackage.org/lts/package/cabal-rpm) [![Stackage Nightly](http://stackage.org/package/cabal-rpm/badge/nightly)](http://stackage.org/nightly/package/cabal-rpm)+[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/cabal-rpm/Lobby?utm_source=badge&utm_medium=badge&utm_content=badge)  # cabal-rpm 
cabal-rpm.cabal view
@@ -1,5 +1,5 @@ Name:                cabal-rpm-Version:             0.12.3+Version:             0.12.4 Synopsis:            RPM packaging tool for Haskell Cabal-based packages Description:     This package provides a RPM packaging tool for Haskell Cabal-based packages.@@ -10,7 +10,8 @@     missing dependencies. The diff command compares the current spec file     with a freshly generated one, the update command updates the spec file     to latest version from Stackage or Hackage, and the refresh command updates-    the spec file to the current cabal-rpm packaging.+    the spec file to the current cabal-rpm packaging. It also handles Hackage+    revisions of packages. Homepage:            https://github.com/juhp/cabal-rpm Bug-reports:         https://github.com/juhp/cabal-rpm/issues License:             GPL-3@@ -25,7 +26,7 @@ Cabal-version:       >=1.6 Tested-with:         GHC == 7.4.2, GHC == 7.6.3, GHC == 7.8.4,                      GHC == 7.10.3, GHC == 8.0.2, GHC == 8.2.2,-                     GHC == 8.4.1+                     GHC == 8.4.2  source-repository head   type:     git@@ -36,7 +37,7 @@   Default:       False  Flag https-  Description:   Use http to query Stackage+  Description:   Use http to query Stackage (ghc >= 7.10)   Default:       True  Executable cabal-rpm@@ -52,9 +53,9 @@                       time >= 1.2 && < 1.5     else        Build-Depends: time >= 1.5 && < 1.9-    if flag(https)+    if impl(ghc >= 7.10) && flag(https)        Build-Depends: bytestring,-                      http-client,+                      http-client >= 0.4.30,                       http-client-tls,                       http-conduit        Cpp-options: -DHTTPS
src/Commands/Depends.hs view
@@ -28,6 +28,7 @@ #endif import Control.Monad (filterM, unless, void) import Data.List (nub, sort, (\\))+import System.FilePath ((<.>))  data Depends = Depends | Requires | Missing @@ -37,8 +38,8 @@   case action of     Depends -> do       (deps, tools, clibs, pkgcfgs, _) <- dependencies pkgDesc-      let clibs' = map (\ lib -> "lib" ++ lib ++ ".so") clibs-      let pkgcfgs' = map (++ ".pc") pkgcfgs+      let clibs' = map (\ lib -> "lib" ++ lib <.> "so") clibs+      let pkgcfgs' = map (<.> "pc") pkgcfgs       mapM_ putStrLn $ deps ++ tools ++ clibs' ++ pkgcfgs'     Requires -> do       (deps, tools, clibs, pkgcfgs, _) <- packageDependencies False pkgDesc@@ -67,7 +68,7 @@  missingDepsPkg :: String -> IO [String] missingDepsPkg pkg = do-  pkgdata <- prepare quiet (Just pkg)+  pkgdata <- prepare quiet (Just pkg) False   missingPackages (packageDesc pkgdata) >>= filterM notAvail  putMissing :: String -> [String] -> [String] -> IO ()
src/Commands/Diff.hs view
@@ -21,12 +21,12 @@ import FileUtils (mktempdir, withCurrentDirectory) import Options (RpmFlags (..)) import PackageUtils (PackageData (..), prepare)-import SysCmd ((+-+), shell)+import SysCmd ((+-+), die, shell)  import Data.Maybe (isNothing)-import Distribution.Simple.Utils (die)  import System.Directory (removeDirectoryRecursive)+import System.FilePath ((<.>)) import System.Posix.Env (getEnvDefault)  diff :: PackageData -> RpmFlags -> Maybe String -> IO ()@@ -36,8 +36,8 @@     Just spec -> do       tmpdir <- mktempdir       pd <- if isNothing mpkg then return pkgdata-            else withCurrentDirectory tmpdir $ prepare flags mpkg+            else withCurrentDirectory tmpdir $ prepare flags mpkg False       speccblrpm <- createSpecFile pd flags (Just tmpdir)       diffcmd <- getEnvDefault "CBLRPM_DIFF" "diff -u"-      shell $ diffcmd +-+ spec +-+ speccblrpm +-+ "| sed -e s%" ++ speccblrpm ++ "%" ++ spec ++ ".cblrpm" ++ "%"+      shell $ diffcmd +-+ spec +-+ speccblrpm +-+ "| sed -e s%" ++ speccblrpm ++ "%" ++ spec <.> "cblrpm" ++ "%"       removeDirectoryRecursive tmpdir
src/Commands/Install.hs view
@@ -29,7 +29,7 @@ #endif import Control.Monad (filterM, unless, when) import System.Directory (doesFileExist)-import System.FilePath ((</>))+import System.FilePath ((</>), (<.>))  install :: PackageData -> RpmFlags -> IO () install pkgdata flags = do@@ -42,7 +42,7 @@   spec <- rpmBuild pkgdata flags Binary   arch <- cmd "arch" []   rpmdir <- cmd "rpm" ["--eval", "%{_rpmdir}"]-  rpms <- map (\ p -> rpmdir </> arch </> p ++ ".rpm") . lines <$>+  rpms <- map (\ p -> rpmdir </> arch </> p <.> "rpm") . lines <$>           cmd "rpmspec" ["-q", spec]   -- metapkgs don't have base package   filterM doesFileExist rpms >>= rpmInstall
src/Commands/Refresh.hs view
@@ -21,7 +21,7 @@ import Options (RpmFlags (..)) import PackageUtils (PackageData (..), cabal_, isGitDir, patchSpec,                      removePrefix)-import SysCmd (cmd, cmd_, grep_, notNull, optionalProgram)+import SysCmd (cmd, cmd_, die, grep_, notNull, optionalProgram)  #if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,2)) #else@@ -30,12 +30,11 @@ import Control.Monad (unless, when) import Data.List (isPrefixOf) import Data.Version (showVersion)-import Distribution.Simple.Utils (die) import System.Directory (copyFile, createDirectoryIfMissing, doesFileExist,                          getCurrentDirectory, setCurrentDirectory) import System.Environment (getEnv) --import System.Exit (exitSuccess)-import System.FilePath ((</>))+import System.FilePath ((</>), (<.>))  refresh :: PackageData -> RpmFlags -> IO () refresh pkgdata flags =@@ -67,7 +66,7 @@     createOldSpec :: String -> FilePath -> IO FilePath     createOldSpec crVer spec = do       cblrpmVersion crVer-      let backup = spec ++ ".cblrpm"+      let backup = spec <.> "cblrpm"           backup' = backup ++ "-" ++ crVer       cmd_ "mv" [backup, backup']       return backup'
src/Commands/RpmBuild.hs view
@@ -22,9 +22,9 @@ import Commands.Spec (createSpecFile) import Dependencies (pkgInstallMissing) import Options (RpmFlags (..))-import PackageUtils (copyTarball, PackageData (..), packageName,+import PackageUtils (bringTarball, PackageData (..), packageName,                      packageVersion, rpmbuild, RpmStage (..))-import SysCmd (cmd, (+-+))+import SysCmd ((+-+))  --import Control.Exception (bracket) import Control.Monad    (unless, void, when)@@ -58,12 +58,10 @@     pkgInstallMissing pkgdata False    unless (stage == BuildDep) $ do-    srcdir <- cmd "rpm" ["--eval", "%{_sourcedir}"]     let version = packageVersion pkg--    copyTarball name version False srcdir-+    bringTarball (name ++ "-" ++ version) False     rpmbuild stage False Nothing specFile+   return specFile  rpmBuild_ :: PackageData -> RpmFlags -> RpmStage -> IO ()
src/Commands/Spec.hs view
@@ -24,8 +24,8 @@                      showDep, subPackages, testsuiteDependencies) import Distro (Distro(..), detectDistro) import Options (RpmFlags (..))-import PackageUtils (copyTarball, getPkgName, latestPackage,-                     nameVersion, PackageData (..), packageName,+import PackageUtils (bringTarball, getPkgName, latestPackage,+                     PackageData (..), packageName,                      packageVersion, stripPkgDevel) import SysCmd ((+-+), notNull) @@ -37,7 +37,7 @@ import Data.Char        (toUpper) import Data.List        (groupBy, intercalate, intersect, isPrefixOf,                          nub, sort, (\\))-import Data.Maybe       (fromMaybe, fromJust)+import Data.Maybe       (isJust, fromMaybe, fromJust) import Data.Time.Clock  (getCurrentTime) import Data.Time.Format (formatTime) import qualified Data.Version (showVersion)@@ -78,7 +78,7 @@ #else import System.Locale (defaultTimeLocale) #endif-import System.FilePath (takeBaseName, (</>))+import System.FilePath (takeBaseName, (</>), (<.>))  import qualified Paths_cabal_rpm (version) @@ -116,7 +116,7 @@       basename | binlib = "%{pkg_name}"                | hasExecPkg = name                | otherwise = "ghc-%{pkg_name}"-      specFile = fromMaybe "" mdest </> pkgname ++ ".spec"+      specFile = fromMaybe "" mdest </> pkgname <.> "spec"       hasExecPkg = binlib || (hasExec && not hasLib)   -- run commands before opening file to prevent empty file on error   -- maybe shell commands should be in a monad or something@@ -223,7 +223,7 @@   let version = packageVersion pkg       defRelease = defaultRelease distro       release = fromMaybe defRelease (rpmRelease flags)-      revision = show $ maybe (0::Int) read (lookup "x-revision" (customFieldsPD pkgDesc))+      revision = lookup "x-revision" (customFieldsPD pkgDesc)   putHdr "Name" (if binlib then "%{pkg_name}" else basename)   putHdr "Version" version   when hasSubpkgs $@@ -244,10 +244,8 @@   putHdr "Url" $ "https://hackage.haskell.org/package" </> pkg_name   putHdr "Source0" $ sourceUrl pkgver   mapM_ (\ (n,p) -> putHdr ("Source" ++ n) (sourceUrl p)) $ number subpkgs-  when (revision /= "0") $-    if distro == SUSE-    then putHdr "Source1" $ "https://hackage.haskell.org/package" </> pkgver </> "revision" </> revision ++ ".cabal#" </> pkg_name ++ ".cabal"-    else putStrLn "Warning: this is a revised .cabal file"+  when (isJust revision) $+    putHdr "Source1" $ "https://hackage.haskell.org/package" </> pkgver </> pkg_name <.> "cabal" ++ "#" </> pkgver <.> "cabal"   case distro of     Fedora -> return ()     _ -> putHdr "BuildRoot" "%{_tmppath}/%{name}-%{version}-build"@@ -334,8 +332,8 @@   put "%prep"   put $ "%setup -q" ++ (if pkgname /= name then " -n" +-+ pkgver else "") +-+     (if hasSubpkgs then unwords (map (("-a" ++) . fst) $ number subpkgs) else  "")-  when (distro == SUSE && revision /= "0") $-    put $ "cp -p %{SOURCE1}" +-+ pkg_name ++ ".cabal"+  when (isJust revision) $+    put $ "cp -p %{SOURCE1}" +-+ pkg_name <.> "cabal"   sectionNewline    put "%build"@@ -491,7 +489,7 @@ #endif  sourceUrl :: String -> String-sourceUrl pv = "https://hackage.haskell.org/package" </> pv </> pv ++ ".tar.gz"+sourceUrl pv = "https://hackage.haskell.org/package" </> pv </> pv <.> ".tar.gz"  -- http://rosettacode.org/wiki/Word_wrap#Haskell wordwrap :: Int -> String -> String@@ -519,9 +517,8 @@ getsubpkgMacro :: RpmFlags -> String -> IO (String, String) getsubpkgMacro flags pkg = do   let name = filter (/= '-') pkg-  pkgver <- latestPackage (rpmHackage flags) pkg-  let (n,v) = nameVersion pkgver-  copyTarball n v False "."+  pkgver <- latestPackage (rpmStream flags) pkg+  bringTarball pkgver False   return (name, pkgver)  number :: [a] -> [(String,a)]
src/Commands/Update.hs view
@@ -20,61 +20,68 @@ import Distro (detectDistro, Distro(..)) import FileUtils (withTempDirectory) import Options (RpmFlags (..))-import PackageUtils (PackageData (..), bringTarball, isGitDir, latestPackage,-                     packageName, packageVersion, patchSpec, prepare,-                     removePrefix)-import SysCmd (cmd_, grep_, (+-+))+import PackageUtils (PackageData (..), bringTarball, getRevisedCabal, isGitDir,+                     latestPackage, packageName, packageVersion, patchSpec,+                     prepare, removePrefix)+import SysCmd (cmd_, die, grep_, (+-+)) #if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,2)) #else import Control.Applicative ((<$>)) #endif import Control.Monad (unless, when)+import Data.Maybe (isJust) import Distribution.PackageDescription (PackageDescription (..))-import Distribution.Simple.Utils (die)-import Data.Maybe (fromMaybe) import System.Directory (createDirectory, getCurrentDirectory,                          setCurrentDirectory)+import System.FilePath ((<.>))  update :: PackageData -> RpmFlags -> Maybe String -> IO () update pkgdata flags mpkgver =   case specFilename pkgdata of     Nothing -> die "No (unique) .spec file in directory."     Just spec -> do-      let pkg = package $ packageDesc pkgdata+      let pkgDesc = packageDesc pkgdata+          pkg = package pkgDesc           name = packageName pkg           ver = packageVersion pkg           current = name ++ "-" ++ ver+          revised = isJust $ lookup "x-revision" (customFieldsPD pkgDesc)       latest <- case mpkgver of                   Just pv -> return pv-                  Nothing -> latestPackage (rpmHackage flags) name-      if current == latest-        then putStrLn $ current +-+ "is already latest version."-        else do-        bringTarball latest+                  Nothing -> latestPackage (rpmStream flags) name+      let updated = current /= latest+      getRevisedCabal latest+      unless updated $+        putStrLn $ current +-+ "is already latest version."+      when (not revised || updated) $ do         gitDir <- getCurrentDirectory >>= isGitDir         rwGit <- if gitDir then grep_ "url = ssh://" ".git/config" else return False-        when rwGit $-            cmd_ "fedpkg" ["new-sources", latest ++ ".tar.gz"]+        when updated $ do+          bringTarball latest False+          when rwGit $+            cmd_ "fedpkg" ["new-sources", latest <.> "tar.gz"]         withTempDirectory $ \cwd -> do-          curspec <- createSpecVersion current spec-          newspec <- createSpecVersion latest spec+          curspec <- createSpecVersion current spec revised+          newspec <- createSpecVersion latest spec True           patchSpec (Just cwd) curspec newspec           setCurrentDirectory cwd           distro <- maybe detectDistro return (rpmDistribution flags)           let suffix = if distro == SUSE then "" else "%{?dist}"           subpkg <- grep_ "%{subpkgs}" spec-          unless (subpkg || rpmSubpackage flags) $+          unless (subpkg || rpmSubpackage flags || not updated) $             cmd_ "sed" ["-i", "-e s/^\\(Release:        \\).*/\\10" ++ suffix ++ "/", spec]-          let newver = removePrefix (name ++ "-") latest-          if distro == SUSE-            then cmd_ "sed" ["-i", "-e s/^\\(Version:        \\).*/\\1" ++ newver ++ "/", spec]-            else cmd_ "rpmdev-bumpspec" ["-c", "update to" +-+ newver, spec]-          when rwGit $-            cmd_ "git" ["commit", "-a", "-m", "update to" +-+ newver]+          when updated $ do+            let newver = removePrefix (name ++ "-") latest+            if distro == SUSE+              then cmd_ "sed" ["-i", "-e s/^\\(Version:        \\).*/\\1" ++ newver ++ "/", spec]+              else cmd_ "rpmdev-bumpspec" ["-c", "update to" +-+ newver, spec]+            when rwGit $+              cmd_ "git" ["commit", "-a", "-m", "update to" +-+ newver]   where-    createSpecVersion :: String -> String -> IO FilePath-    createSpecVersion ver spec = do-      pkgdata' <- prepare flags (Just ver)+    createSpecVersion :: String -> String -> Bool -> IO FilePath+    createSpecVersion pkgver spec revise = do+      pkgdata' <- prepare flags (Just pkgver) revise       let pkgdata'' = pkgdata' { specFilename = Just spec }-      createDirectory ver-      createSpecFile pkgdata'' flags (Just ver)+          dir = pkgver <.> if revise then "" else "orig"+      createDirectory dir+      createSpecFile pkgdata'' flags (Just dir)
src/Dependencies.hs view
@@ -65,6 +65,7 @@ #endif                                         ) import System.Directory (doesDirectoryExist, doesFileExist)+import System.FilePath ((<.>)) import System.IO (hPutStrLn, stderr) import System.Posix.User (getEffectiveUserID) @@ -125,7 +126,7 @@ resolveLib lib = do   lib64 <- doesDirectoryExist "/usr/lib64"   let libsuffix = if lib64 then "64" else ""-  let lib_path = "/usr/lib" ++ libsuffix ++ "/lib" ++ lib ++ ".so"+  let lib_path = "/usr/lib" ++ libsuffix ++ "/lib" ++ lib <.> "so"   libInst <- doesFileExist lib_path   if libInst     then rpmqueryFile Rpm lib_path
src/Main.hs view
@@ -32,7 +32,7 @@ main :: IO () main = do   (opts, cmd, mpkg) <- getArgs >>= parseArgs-  pkgdata <- prepare opts mpkg+  pkgdata <- prepare opts mpkg False   case cmd of     "spec"        -> createSpecFile_ pkgdata opts Nothing     "srpm"        -> rpmBuild_ pkgdata opts Source@@ -48,7 +48,7 @@     "missingdeps" -> depends pkgdata Missing     "update"      -> update pkgdata opts mpkg     "rpm"         -> do-      putStrLn "* Warning the 'rpm' command has been renamed to 'local':"+      putStrLn "* Warning the 'rpm' command has been renamed to 'build':"       putStrLn "* this alias may be removed in a future release."       rpmBuild_ pkgdata opts Binary     c -> error $ "Unknown cmd: " ++ c
src/Options.hs view
@@ -56,7 +56,7 @@     , rpmBinary              :: Bool     , rpmStrict              :: Bool     , rpmSubpackage          :: Bool-    , rpmHackage             :: Bool+    , rpmStream              :: Maybe String     , rpmMissing             :: Bool     , rpmRelease             :: Maybe String     , rpmCompilerId          :: Maybe CompilerId@@ -74,7 +74,7 @@     , rpmBinary = False     , rpmStrict = False     , rpmSubpackage = False-    , rpmHackage = False+    , rpmStream = Nothing     , rpmMissing = False     , rpmRelease = Nothing     , rpmCompilerId = Nothing@@ -94,8 +94,8 @@     "Force Haskell package name to be base package name"   , Option "" ["force"] (NoArg (\x -> x { rpmForce = True }))     "Overwrite existing spec file."-  , Option "" ["hackage"] (NoArg (\x -> x { rpmHackage = True }))-    "Use Hackage to get package version instead of Stackage."+  , Option "s" ["stream"] (ReqArg (\s x -> x { rpmStream = Just s }) "STREAM")+    "Stackage stream (default 'lts') or 'hackage' used to get package version."   , Option "" ["missing"] (NoArg (\x -> x { rpmMissing = True }))     "Comment out missing BuildRequires packages."   , Option "" ["strict"] (NoArg (\x -> x { rpmStrict = True }))
src/PackageUtils.hs view
@@ -16,7 +16,7 @@ module PackageUtils (   bringTarball,   cabal_,-  copyTarball,+  getRevisedCabal,   getPkgName,   isGitDir,   latestPackage,@@ -37,10 +37,10 @@   ) where  import FileUtils (filesWithExtension, fileWithExtension,-                  getDirectoryContents_, mktempdir)+                  getDirectoryContents_, mktempdir, withTempDirectory) import Options (RpmFlags (..))-import SysCmd (cmd, cmd_, cmdIgnoreErr, cmdSilent, (+-+),-               optionalProgram, requireProgram, sudo)+import SysCmd (cmd, cmd_, cmdIgnoreErr, cmdSilent, die, (+-+),+               grep_, optionalProgram, requireProgram, sudo)  import Stackage (latestStackage) @@ -68,9 +68,16 @@                                        , mkFlagAssignment #endif                                        )+#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)+import Distribution.PackageDescription.Configuration (finalizePD)+import Distribution.Types.ComponentRequestedSpec (defaultComponentRequestedSpec)+#else import Distribution.PackageDescription.Configuration (finalizePackageDescription)+#endif #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,2,0) import Distribution.PackageDescription.Parsec (readGenericPackageDescription)+#elif defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)+import Distribution.PackageDescription.Parse (readGenericPackageDescription) #else import Distribution.PackageDescription.Parse (readPackageDescription) #endif@@ -89,12 +96,16 @@     configCompiler #endif     )+#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)+import Distribution.Simple.Program   (defaultProgramDb)+#else import Distribution.Simple.Program   (defaultProgramConfiguration)-import Distribution.Simple.Utils (die+#endif+import Distribution.Simple.Utils ( #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,20,0)-    , tryFindPackageDesc+    tryFindPackageDesc #else-    , findPackageDesc+    findPackageDesc #endif     ) @@ -129,10 +140,12 @@                          -> IO (PackageDescription, [FilePath], [FilePath]) simplePackageDescription cabalfile opts = do   let verbose = rpmVerbosity opts-#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,2,0)+#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0) #else   let readGenericPackageDescription = readPackageDescription+      defaultProgramDb = defaultProgramConfiguration #endif+   genPkgDesc <- readGenericPackageDescription verbose cabalfile   compiler <- case rpmCompilerId opts of                 Just cid -> return@@ -147,7 +160,7 @@ #else                               (compiler, _) <- configCompiler #endif-                                (Just GHC) Nothing Nothing defaultProgramConfiguration verbose+                                (Just GHC) Nothing Nothing defaultProgramDb verbose #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,22,0)                               return (compilerInfo compiler) #else@@ -157,6 +170,9 @@ #else   let mkFlagAssignment = id #endif+#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)+  let finalizePackageDescription flags = finalizePD flags defaultComponentRequestedSpec+#endif   case finalizePackageDescription (mkFlagAssignment $ rpmConfigurationsFlags opts)        (const True) (Platform buildArch buildOS)        compiler@@ -166,6 +182,7 @@       (docs, licensefiles) <- findDocsLicenses (dropFileName cabalfile) pd       return (pd, docs, licensefiles) + findDocsLicenses :: FilePath -> PackageDescription -> IO ([FilePath], [FilePath]) findDocsLicenses dir pkgDesc = do   contents <- getDirectoryContents dir@@ -191,8 +208,8 @@ tryFindPackageDesc = findPackageDesc #endif -cabalFromSpec :: FilePath -> IO (FilePath, Maybe FilePath)-cabalFromSpec specFile = do+cabalFromSpec :: FilePath -> Bool -> IO (FilePath, Maybe FilePath)+cabalFromSpec specFile revise = do   -- no rpmspec command in RHEL 5 and 6   namever <- removePrefix "ghc-" . head . lines <$> cmd "rpm" ["-q", "--qf", "%{name}-%{version}\n", "--specfile", specFile]   dExists <- doesDirectoryExist namever@@ -201,28 +218,75 @@     specTime <- modificationTime <$> getFileStatus specFile     dirTime <- accessTime <$> getFileStatus namever     when (specTime > dirTime) $ do-      bringTarball namever+      bringTarball namever revise       rpmbuild Prep True Nothing specFile     cabalfile <- tryFindPackageDesc namever     return (cabalfile, Nothing)     else do     tmpdir <- mktempdir-    bringTarball namever+    bringTarball namever revise     rpmbuild Prep True (Just tmpdir) specFile     cabalfile <- tryFindPackageDesc $ tmpdir </> namever     return (cabalfile, Just tmpdir) -bringTarball :: FilePath -> IO ()-bringTarball nv = do-  srcdir <- do+bringTarball :: FilePath -> Bool -> IO ()+bringTarball nv revise = do+  srcdir <- getSourceDir+  fExists <- doesFileExist $ srcdir </> tarfile+  unless fExists $+    copyTarball False srcdir+ where+  tarfile = nv <.> "tar.gz"++  copyTarball :: Bool -> FilePath -> IO ()+  copyTarball ranFetch dir = do+    let dest = dir </> tarfile+    cabalUpdate+    home <- getEnv "HOME"+    let cacheparent = home </> ".cabal" </> "packages"+        (n,v) = nameVersion nv+    haveLocalCabal <- doesFileExist $ dir </> nv <.> "cabal"+    when (not haveLocalCabal && revise) $+      getRevisedCabal nv+    already <- doesFileExist dest+    unless already $ do+      remotes <- getDirectoryContents_ cacheparent++      let tarpath = n </> v </> tarfile+          paths = map (\ repo -> cacheparent </> repo </> tarpath) remotes+      -- if more than one tarball, should maybe warn if they are different+      tarballs <- filterM doesFileExist paths+      if null tarballs+        then if ranFetch+             then error $ "No" +-+ tarfile +-+ "found"+             else do+             cabal_ "fetch" ["-v0", "--no-dependencies", nv]+             copyTarball True dir+        else do+        createDirectoryIfMissing True dir+        copyFile (head tarballs) dest+        -- cabal-1.18 fetch creates tarballs with mode 0600+        stat <- getFileStatus dest+        when (fileMode stat /= 0o100644) $+          setFileMode dest 0o0644++getSourceDir :: IO FilePath+getSourceDir = do     cwd <- getCurrentDirectory     git <- isGitDir cwd     if git then return cwd else cmd "rpm" ["--eval", "%{_sourcedir}"]-  fExists <- doesFileExist $ srcdir </> nv <.> "tar.gz"-  unless fExists $-    let (n, v) = nameVersion nv in-    copyTarball n v False srcdir +getRevisedCabal :: String -> IO ()+getRevisedCabal nv = do+  let (n,_) = nameVersion nv+      file = n <.> "cabal"+  dir <- getSourceDir+  withTempDirectory $ \ _ -> do+    cmd_ "wget" ["--quiet", "https://hackage.haskell.org/package" </> nv </> file]+    revised <- grep_ "x-revision" file+    when revised $+      cmd_ "mv" [file, dir </> nv <.> "cabal"]+ nameVersion :: String -> (String, String) nameVersion nv =   if '-' `notElem` nv@@ -285,8 +349,8 @@   cabalUpdate   cmd_ "cabal" (c:args) -tryUnpack :: String -> IO (FilePath, Maybe FilePath)-tryUnpack pkgver = do+tryUnpack :: String -> Bool -> IO (FilePath, Maybe FilePath)+tryUnpack pkgver revise = do   isdir <- doesDirectoryExist pkgver   if isdir     then do@@ -296,20 +360,18 @@     cwd <- getCurrentDirectory     tmpdir <- mktempdir     setCurrentDirectory tmpdir-    cabal_ "unpack" ["-v0", pkgver]+    cabal_ "unpack" $ ["-v0"] ++ ["--pristine" | not revise] ++ [pkgver]     pth <- tryFindPackageDesc pkgver     setCurrentDirectory cwd     return (tmpdir </> pth, Just tmpdir) -latestPackage :: Bool -> String -> IO String-latestPackage hackage pkg =-  if hackage-    then latestHackage pkg-    else do-    stk <- latestStackage pkg-    case stk of-      Just pv -> return pv-      Nothing -> latestHackage pkg+latestPackage :: Maybe String -> String -> IO String+latestPackage (Just "hackage") pkg = latestHackage pkg+latestPackage mstr pkg = do+  stk <- latestStackage mstr pkg+  case stk of+    Just pv -> return pv+    Nothing -> latestHackage pkg  latestHackage :: String -> IO String latestHackage pkg = do@@ -394,34 +456,6 @@ --   exists <- doesFileExist specfile --   return (specfile, exists) -copyTarball :: String -> String -> Bool -> FilePath -> IO ()-copyTarball n v ranFetch dir = do-  let tarfile = n ++ "-" ++ v <.> "tar.gz"-      dest = dir </> tarfile-  already <- doesFileExist dest-  unless already $ do-    cabalUpdate-    home <- getEnv "HOME"-    let cacheparent = home </> ".cabal" </> "packages"-        tarpath = n </> v </> tarfile-    remotes <- getDirectoryContents_ cacheparent-    let paths = map (\ repo -> cacheparent </> repo </> tarpath) remotes-    -- if more than one tarball, should maybe warn if they are different-    tarballs <- filterM doesFileExist paths-    if null tarballs-      then if ranFetch-           then error $ "No" +-+ tarfile +-+ "found"-           else do-             cabal_ "fetch" ["-v0", "--no-dependencies", n ++ "-" ++ v]-             copyTarball n v True dir-      else do-        createDirectoryIfMissing True dir-        copyFile (head tarballs) dest-        -- cabal-1.18 fetch creates tarballs with mode 0600-        stat <- getFileStatus dest-        when (fileMode stat /= 0o100644) $-          setFileMode dest 0o0644- data PackageData =   PackageData { specFilename :: Maybe FilePath               , docFilenames :: [FilePath]@@ -431,13 +465,13 @@  -- Nothing implies existing packaging in cwd -- Something implies either new packaging or some existing spec file in dir-prepare :: RpmFlags -> Maybe String -> IO PackageData-prepare flags mpkgver = do+prepare :: RpmFlags -> Maybe String -> Bool -> IO PackageData+prepare flags mpkgver revise = do   let mpkg = stripVersion <$> mpkgver   mspec <- checkForSpecFile mpkg   case mspec of     Just spec -> do-      (cabalfile, mtmp) <- cabalFromSpec spec+      (cabalfile, mtmp) <- cabalFromSpec spec revise       (pkgDesc, docs, licenses) <- simplePackageDescription cabalfile flags       maybe (return ()) removeDirectoryRecursive mtmp       return $ PackageData mspec docs licenses pkgDesc@@ -445,7 +479,7 @@       case mpkgver of         Nothing -> do           cwd <- getCurrentDirectory-          prepare flags (Just $ takeFileName cwd)+          prepare flags (Just $ takeFileName cwd) revise         Just pkgmver -> do           mcabal <- checkForCabalFile pkgmver           case mcabal of@@ -454,9 +488,9 @@               return $ PackageData Nothing docs licenses pkgDesc             Nothing -> do               pkgver <- if stripVersion pkgmver == pkgmver-                        then latestPackage (rpmHackage flags) pkgmver+                        then latestPackage (rpmStream flags) pkgmver                         else return pkgmver-              (cabalfile, mtmp) <- tryUnpack pkgver+              (cabalfile, mtmp) <- tryUnpack pkgver revise               (pkgDesc, docs, licenses) <- simplePackageDescription cabalfile flags               maybe (return ()) removeDirectoryRecursive mtmp               return $ PackageData Nothing docs licenses pkgDesc
src/Stackage.hs view
@@ -20,16 +20,16 @@   ) where  -import Control.Monad (when)-import Data.Maybe (isJust, fromJust)+import Control.Monad (when, unless)+import Data.Maybe (isJust, fromJust, fromMaybe)+import Data.List (isPrefixOf)  #ifdef HTTPS import qualified Data.ByteString.Char8 as B-import Data.List-import Data.Maybe+import Data.Maybe (mapMaybe) import Network.HTTP.Client import Network.HTTP.Client.TLS-import System.FilePath+import System.FilePath (takeFileName) import SysCmd ((+-+)) #else #if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,2))@@ -68,11 +68,12 @@     return Nothing #endif -latestStackage :: String -> IO (Maybe String)-latestStackage pkg = do-  let stream = "lts"+latestStackage :: Maybe String -> String -> IO (Maybe String)+latestStackage mstr pkg = do+  let stream = fromMaybe "lts" mstr+  unless (any (`isPrefixOf` stream) ["nightly", "lts"]) $+    putStrLn $ "Unknown Stackage stream:" +-+ stream   mpkg <- stackageList stream pkg   when (isJust mpkg) $     putStrLn $ fromJust mpkg +-+ "in Stackage" +-+ stream   return mpkg-
src/SysCmd.hs view
@@ -22,6 +22,7 @@   cmdMaybe,   cmdQuiet,   cmdSilent,+  die,   grep_,   notNull,   optionalProgram,@@ -41,7 +42,11 @@ #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,18,0) import Distribution.Simple.Program.Find (defaultProgramSearchPath,                                          findProgramOnSearchPath)+#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)+import Distribution.Simple.Utils (dieNoVerbosity)+#else import Distribution.Simple.Utils (die)+#endif #else import Distribution.Simple.Utils (die, findProgramLocation) #endif@@ -49,6 +54,11 @@  import System.Process (readProcess, readProcessWithExitCode, rawSystem) import System.Exit (ExitCode(..))++#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)+die :: String -> IO a+die = dieNoVerbosity+#endif  findProgram :: FilePath -> IO (Maybe FilePath) findProgram =