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 +5/−0
- README.md +1/−0
- cabal-rpm.cabal +7/−6
- src/Commands/Depends.hs +4/−3
- src/Commands/Diff.hs +4/−4
- src/Commands/Install.hs +2/−2
- src/Commands/Refresh.hs +3/−4
- src/Commands/RpmBuild.hs +4/−6
- src/Commands/Spec.hs +13/−16
- src/Commands/Update.hs +35/−28
- src/Dependencies.hs +2/−1
- src/Main.hs +2/−2
- src/Options.hs +4/−4
- src/PackageUtils.hs +100/−66
- src/Stackage.hs +10/−9
- src/SysCmd.hs +10/−0
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 @@ [](http://hackage.haskell.org/package/cabal-rpm) [](http://stackage.org/lts/package/cabal-rpm) [](http://stackage.org/nightly/package/cabal-rpm)+[](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 =