packages feed

cabal-rpm 2.0.5.1 → 2.0.6

raw patch · 16 files changed

+258/−172 lines, 16 filesdep +extra

Dependencies added: extra

Files

ChangeLog view
@@ -1,6 +1,26 @@+# 2.0.6 (2020-06-28) Fedora 33+- spec: use packager's name in %changelog+- spec: default package versions to Stackage LTS 16+- spec now also leaves newly prepped source tree around+- spec: handle testsuite tool deps separately+- spec, refresh, update: more care about whether to revise or not+- diff: ignore release field+- prep: be quiet+- spec: add a comment for missing testsuite deps+- only allow specifying major Stackage LTS versions (not minor):+  for more progressive updating logic (lts-n -> lts-(n+1) -> nightly -> Hackage)+- spec: don't warn "spec exists" explicitly+- spec: take specified stream into account for subpackaging+- update: finally run prep to check update okay+- prep/srpm --verbose and local --quiet options+- spec: move chmod for docs to %prep+- spec: check existing .spec file for detecting dropped deps and executable deps+- update: also commit revised .cabal file when no update+- fix copying of cached tarballs (longstanding defect)+ # 2.0.5.1 (2020-06-11) - spec: fix grep breakage in 2.0.5 release-- spec, refresh and update now leave newly prepped source tree around+- refresh and update now leave newly prepped source tree around - spec: dropped deprecated %post and %postun scriptlets  # 2.0.5 (2020-06-10)
Makefile view
@@ -4,8 +4,6 @@ 	pandoc -s -t man $< > $@  stack-all:-	stack --resolver nightly --stack-yaml stack-ghc810.yaml build-	@echo 	stack --resolver nightly build 	@echo 	stack --resolver lts build@@ -21,7 +19,3 @@ 	stack --resolver lts-11 --stack-yaml stack-lts11.yaml build 	@echo 	stack --resolver lts-10 --stack-yaml stack-lts11.yaml build-	@echo-	stack --resolver lts-9 --stack-yaml stack-lts9.yaml build-	@echo-	stack --resolver lts-8 --stack-yaml stack-lts9.yaml build
TODO view
@@ -1,17 +1,19 @@+- installmissing' only installs libs+- cblrpm local gi-ibus fails looking for ghc-haskell-gi-overloading-prof+  - need unified handling of deps+- depsort subpkgs+- check for cabal-install - read cabal-tweak-flag for correct deps-- spec: use user's email+ - spec --force does not work (file busy) - use tmp workspace for duration of executation to reference prep(are) etc-- guess user email address - lts downgrades for older branches - support internal libs: eg dns-internal - fix lts package version check to ignore old snapshot results (eg old nightly) - diff misses flags in subpackages: eg skylighting-core-- cabal-tweak-drop-dep "ignored" by update etc - switch to v2 commands - subpackage deps for testsuite: eg QuickCheck's splitmix - if not revised then update .orig should not be revised-- revised not revise! (always assume revise) - use .Cblrpm/ for refresh? - delete unrevised .cabal? - changelog for subpkg bumps@@ -28,20 +30,15 @@   - refresh: avoid checking subpackaging versions   - spec: fixed/static subpackage versions (when checking for their deps) - spec: cdeps for subpackages (example package?)-- tests tools dep going into deps (eg hspec-discover for network)  - for bin package --subpackage should add Prof deps for Devel deps   (testcase: git-annex subpackage needs base-prof etc)  - local --stream: ignores stream -- hsp fragile - catch failure with clearer error- * builddep repeats looking for versions of missing packages   https://github.com/juhp/cabal-rpm/issues/60 -- `cblrpm update -s lts` runs cabal update, even when already latest!- * switch to Cabal 2 for better License handling  * drop dummy deps like fail, bytestring-builder and mtl-compat@@ -50,20 +47,17 @@  - add rpmlint command -- only "cabal update" when needed- - support --without-prof and --without-haddock  - merge refresh and update specs generation  - spec --bounds - rework "BR: ghc-*-static" with %{?_isa}-- move Main to app? - check for cabal executable - revisions of subpackages - use Set for deps? -wrote the complete spec file atomically+write the complete spec file atomically  ## Misc ? run "cabal update" if package-version not found@@ -100,7 +94,6 @@ - warm about new missing deps - reverse deps and rebuilds - update subpkg sources-- depsort sources  ## depends - dependency graphs or sorted recursive deps@@ -117,4 +110,3 @@ - ignore whitespace option - diff two versions - --ignore-- --ignore-common (Release:, etc)
cabal-rpm.cabal view
@@ -1,5 +1,5 @@ Name:                cabal-rpm-Version:             2.0.5.1+Version:             2.0.6 Synopsis:            RPM packaging tool for Haskell Cabal-based packages Description:     This package provides a RPM packaging tool for Haskell Cabal-based packages.@@ -45,6 +45,7 @@     Build-depends: base < 5,                    Cabal > 1.10 && < 3.3,                    directory,+                   extra,                    filepath,                    optparse-applicative,                    process,
src/Commands/Diff.hs view
@@ -21,17 +21,18 @@  import Commands.Spec (createSpecFile) import FileUtils (mktempdir)-import PackageUtils (PackageData (..), prepare)-import SysCmd (die, optionalProgram)+import PackageUtils (dropChangelog, editSpecField, getSpecField,+                     PackageData (..), prepare)+import SysCmd (die) import Types -import SimpleCmd (grep_, pipe_, pipe3_)- #if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,0)) #else import Control.Applicative ((<$>)) #endif+import Control.Monad import Distribution.Verbosity (silent)+import SimpleCmd (grep_, pipe) import System.Directory (removeDirectoryRecursive) import System.FilePath ((<.>)) import System.Posix.Env (getEnvDefault)@@ -44,15 +45,13 @@     Just spec -> do       subpkg <- grep_ "%{subpkgs}" spec       tmpdir <- mktempdir-      speccblrpm <- createSpecFile False silent flags False False pkgtype (if subpkg then Just Nothing else Nothing) (Just tmpdir) mpvs+      speccblrpm <- createSpecFile False True silent flags False False pkgtype (if subpkg then Just Nothing else Nothing) (Just tmpdir) mpvs+      currel <- getSpecField "Release" spec+      let suffix = "%{?dist}"+      editSpecField "Release" (currel ++ suffix) speccblrpm       diffcmd <- words <$> getEnvDefault "CBLRPM_DIFF" "diff -u"-      hawk <- optionalProgram "hawk"-      if hawk-        then-        pipe3_ (head diffcmd, tail diffcmd ++ [spec, speccblrpm])-          ("sed", ["-e", "s%" ++ speccblrpm ++ "%" ++ spec <.> "cblrpm" ++ "%"])-          ("hawk", ["-d''", "-a", "takeWhile (/= [\"%changelog\"])"])-        else-        pipe_ (head diffcmd, tail diffcmd ++ [spec, speccblrpm])+      out <- dropChangelog <$> pipe (head diffcmd, tail diffcmd ++ [spec, speccblrpm])         ("sed", ["-e", "s%" ++ speccblrpm ++ "%" ++ spec <.> "cblrpm" ++ "%"])+      unless (null out) $+        putStrLn out       removeDirectoryRecursive tmpdir
src/Commands/Install.hs view
@@ -48,11 +48,11 @@   case mspec of     Nothing ->       withTempDirectory $ \ _ -> do-      spec <- rpmBuild Binary flags pkgtype subpackage mpvs+      spec <- rpmBuild Binary False flags pkgtype subpackage mpvs       rpmdir <- rpmEval "%{_rpmdir}"       rpmspec [] (fmap (</> "%{arch}/%{name}-%{version}-%{release}.%{arch}.rpm") rpmdir) spec >>= rpmInstall False     Just spec -> do-      rpmBuild_ Binary flags pkgtype subpackage mpvs+      rpmBuild_ Binary False flags pkgtype subpackage mpvs       rpmdir <- rpmEval "%{_rpmdir}"       rpmspec [] (fmap (</> "%{arch}/%{name}-%{version}-%{release}.%{arch}.rpm") rpmdir) spec >>= rpmInstall False 
src/Commands/Refresh.hs view
@@ -17,14 +17,13 @@   refresh   ) where -import Paths_cabal_rpm (version) import Commands.Spec (createSpecFile) import FileUtils (withTempDirectory) import Header (headerVersion, withSpecHead)-import PackageUtils (PackageData (..), cabal_, patchSpec,-                     prepare)+import PackageUtils (PackageData (..), cabal_, patchSpec, prepare) import SysCmd (die, optionalProgram) import Types+import Paths_cabal_rpm (version)  import SimpleCmd (cmd, cmd_, grep_) import SimpleCmd.Git (rwGitDir)@@ -34,8 +33,10 @@ import Control.Applicative ((<$>)) #endif import Control.Monad (unless, when)+import Data.Maybe import Data.Version (showVersion) import Distribution.Verbosity (silent)+import SimpleCabal (customFieldsPD) import System.Directory (copyFile, createDirectoryIfMissing, doesFileExist,                          renameFile, setCurrentDirectory) import System.Environment (getEnv)@@ -52,7 +53,7 @@       when rwGit $ do         local <- cmd "git" ["diff"] :: IO String         unless (null local) $-          putStrLn "Working dir contain local changes!"+          putStrLn "Working dir contains local changes!"           -- exitSuccess       withSpecHead spec $ \ headerwords -> do         let cblrpmver = headerVersion headerwords@@ -64,8 +65,9 @@                   DefaultPkg | "--standalone" `elem` headerwords -> StandalonePkg                   _ -> pkgtype           subpkg <- grep_ "%{subpkgs}" spec+          let wasrevised = isJust $ lookup "x-revision" $ customFieldsPD (packageDesc pkgdata)           oldspec <- createOldSpec subpkg cblrpmver spec-          newspec <- createSpecFile True silent [] False False spectype (if subpkg then Just Nothing else Nothing) Nothing mpvs+          newspec <- createSpecFile True wasrevised silent [] False False spectype (if subpkg then Just Nothing else Nothing) Nothing mpvs           patchSpec dryrun Nothing oldspec newspec --          setCurrentDirectory cwd --          when rwGit $
src/Commands/RpmBuild.hs view
@@ -37,24 +37,24 @@ import Control.Monad (void, when) import Distribution.Verbosity (normal) -rpmBuild :: RpmStage -> Flags -> PackageType -> Bool+rpmBuild :: RpmStage -> Bool -> Flags -> PackageType -> Bool          -> Maybe PackageVersionSpecifier -> IO FilePath-rpmBuild stage flags pkgtype subpackage mpvs = do+rpmBuild stage quiet flags pkgtype subpackage mpvs = do   pkgdata <- prepare flags mpvs True False   when (stage == Binary) $     void $ pkgInstallMissing' pkgdata   let pkgDesc = packageDesc pkgdata       mspec = specFilename pkgdata-  specFile <- maybe (createSpecFile False normal flags False False pkgtype (if subpackage then Just Nothing else Nothing) Nothing mpvs)+  specFile <- maybe (createSpecFile False True normal flags False False pkgtype (if subpackage then Just Nothing else Nothing) Nothing mpvs)               (\ s -> putStrLn ("Using existing" +-+ s) >> return s)               mspec   let pkgid = package pkgDesc   bringTarball pkgid True (Just specFile)-  rpmbuild stage specFile+  rpmbuild quiet stage specFile    return specFile -rpmBuild_ :: RpmStage -> Flags -> PackageType -> Bool+rpmBuild_ :: RpmStage -> Bool -> Flags -> PackageType -> Bool           -> Maybe PackageVersionSpecifier -> IO ()-rpmBuild_ stage flags pkgtype subpackage mpvs =-  void $ rpmBuild stage flags pkgtype subpackage mpvs+rpmBuild_ stage quiet flags pkgtype subpackage mpvs =+  void $ rpmBuild stage quiet flags pkgtype subpackage mpvs
src/Commands/Spec.hs view
@@ -28,11 +28,16 @@ import PackageUtils (bringTarball, latestPackage, PackageData (..), prepare) import SimpleCabal (buildable, mkPackageName, PackageDescription (..),                     PackageIdentifier(..), PackageName, showVersion)-import SimpleCmd ((+-+), cmdMaybe, grep_, removePrefix)+import SimpleCmd ((+-+),+#if MIN_VERSION_simple_cmd(0,2,2)+                  grep,+#endif+                  cmdMaybe,+                  grep_, removePrefix) import Stackage (defaultLTS) import Types -import Control.Monad    (filterM, forM_, unless, void, when, (>=>))+import Control.Monad.Extra  #if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,0)) #else@@ -40,8 +45,7 @@ #endif  import Data.Char        (toUpper)-import Data.List        (groupBy, intercalate, intersect, isPrefixOf,-                         nub, sort, (\\))+import Data.List.Extra import Data.Maybe       (isJust, fromMaybe, fromJust) import Data.Time.Clock  (getCurrentTime) import Data.Time.Format (formatTime)@@ -85,21 +89,18 @@ #endif  -rstrip :: (Char -> Bool) -> String -> String-rstrip p = reverse . dropWhile p . reverse- #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0) #else unUnqualComponentName :: String -> String unUnqualComponentName = id #endif -createSpecFile :: Bool -> Verbosity -> Flags -> Bool -> Bool -> PackageType-               -> Maybe (Maybe Stream) -> Maybe FilePath+createSpecFile :: Bool -> Bool -> Verbosity -> Flags -> Bool -> Bool+               -> PackageType -> Maybe (Maybe Stream) -> Maybe FilePath                -> Maybe PackageVersionSpecifier                -> IO FilePath-createSpecFile keep verbose flags testsuite force pkgtype subpkgStream mdest mpvs = do-  pkgdata <- prepare flags mpvs True keep+createSpecFile keep revise verbose flags testsuite force pkgtype subpkgStream mdest mpvs = do+  pkgdata <- prepare flags mpvs revise keep   let mspec = case pkgtype of                 SpecFile f -> Just f                 _ -> specFilename pkgdata@@ -152,15 +153,17 @@   targetSpecAlreadyExists <- doesFileExist targetSpecFile   -- run commands before opening file to prevent empty file on error   -- maybe shell commands should be in a monad or something-  droppedDeps <- if targetSpecAlreadyExists then do-      map (mkPackageName . removePrefix "cabal-tweak-drop-dep ") <$> grep "^cabal-tweak-drop-dep" targetSpecFile+  let topSpecFile = pkgname <.> "spec"+  topSpecExists <- doesFileExist topSpecFile+  droppedDeps <- if topSpecExists then+      map (mkPackageName . removePrefix "cabal-tweak-drop-dep ") <$> grep "^cabal-tweak-drop-dep " topSpecFile       else return []   pkgdeps <- do     alldeps <- packageDependencies pkgDesc     return $ alldeps {buildDeps = buildDeps alldeps \\ droppedDeps}   let outputFile = targetSpecFile ++ if not force && targetSpecAlreadyExists then ".cblrpm" else ""   if targetSpecAlreadyExists-    then warn verbose $ targetSpecFile +-+ "exists:" +-+ (if force then "forcing overwrite" else "creating") +-+ outputFile+    then warn verbose $ (if force then "overwriting" else "creating") +-+ outputFile     else do     let realdir dir = "cblrpm." `isPrefixOf` takeBaseName dir     when (maybe True realdir mdest) $@@ -204,7 +207,7 @@   let syn' = if null syn              then "Haskell" +-+ name +-+ "package"              else (unwords . lines . initialCapital) syn-  let summary = rstrip (== '.') syn'+  let summary = dropWhileEnd (== '.') syn'   when (length ("Summary     : " ++ syn') > 79) $     warn verbose "this package has a long synopsis." @@ -249,7 +252,7 @@     miss <- if subpackage || standalone then missingLibraries pkgDesc else return []     return $ nub (subs ++ miss) \\ droppedDeps   subpkgs <- if subpackage then-    mapM (getsubpkgMacro (fromMaybe mstream subpkgStream) mspec >=>+    mapM (getsubpkgMacro (streamSubpackage mstream subpkgStream) mspec >=>           \(m,pv) -> global m (display pv) >> return ("%{" ++ m ++ "}")) missingLibs     else return []   let hasSubpkgs = subpkgs /= []@@ -257,23 +260,26 @@     global "subpkgs" $ unwords subpkgs     putNewline -  let testsuiteDeps = testsuiteDependencies' pkgDesc+  let (testsuiteDeps,testsuiteTools) = testsuiteDependencies' pkgDesc   missTestDeps <- filterM (notSrcOrInst . RpmHsLib Devel) testsuiteDeps-  let testable = not (null testsuiteDeps) && (null missTestDeps || testsuite)+  let testable = notNull testsuiteDeps && (null missTestDeps || testsuite)   if testable then do     put "%bcond_without tests"     putNewline-    else unless (null testsuiteDeps) $-         warn verbose $ "testsuite ignored due to missing deps: " ++ unwords (map display missTestDeps)+    else unless (null testsuiteDeps) $ do+         put $ "# testsuite missing deps: " ++ unwords (map display missTestDeps)+         putNewline   let version = display $ pkgVersion pkgid       release = "1"   revised <-     if isJust $ lookup "x-revision" (customFieldsPD pkgDesc)     then return True     else do-      let local = display pkgid <.> "cabal"-      have <- doesFileExist local-      if have then grep_ "x-revision" local else return False+      if revise then do+        let local = display pkgid <.> "cabal"+        have <- doesFileExist local+        if have then grep_ "x-revision" local else return False+      else return False   putHdr "Name" (if binlib then "%{pkg_name}" else basename)   putHdr "Version" version   when hasSubpkgs $@@ -295,7 +301,7 @@   put "# End cabal-rpm sources"   putNewline   put "# Begin cabal-rpm deps:"-  when (mkPackageName "Cabal" `notElem` buildDeps pkgdeps || not hasLib || not (null (setupDeps pkgdeps))) $ do+  when (mkPackageName "Cabal" `notElem` buildDeps pkgdeps || not hasLib || notNull (setupDeps pkgdeps)) $ do --    put "# Setup"     when (mkPackageName "Cabal" `notElem` buildDeps pkgdeps) $       putHdr "BuildRequires" "ghc-Cabal-devel"@@ -317,10 +323,10 @@     -- when (epel7 &&     --       any (\ d -> d `elem` map showDep ["template-haskell", "hamlet"]) deps) $     --   putHdr "ExclusiveArch" "%{ghc_arches_with_ghci}"-  let testDeps = sort $ testsuiteDeps \\ (mkPackageName "Cabal" : (buildDeps pkgdeps ++ setupDeps pkgdeps))-  when (testable && not (null testDeps)) $ do+  let testDeps = testsuiteDeps \\ (mkPackageName "Cabal" : (buildDeps pkgdeps ++ setupDeps pkgdeps))+  when (testable && notNull testDeps) $ do     put "%if %{with tests}"-    mapM_ (putHdr "BuildRequires" . showRpm . RpmHsLib Devel) testDeps+    mapM_ (putHdr "BuildRequires") $ (sort . map showRpm) (map (RpmHsLib Devel) testDeps ++ map RpmOther testsuiteTools)     put "%endif"    let common = binlib && datafiles /= [] && not standalone@@ -334,7 +340,7 @@       putStrLn "checking for deps of missing dependencies:"       let deptype = if standalone then Devel else Prof       forM_ missingLibs $ \ pkg -> do-        more <- packageDeps flags (fromMaybe mstream subpkgStream) pkg+        more <- packageDeps flags (streamSubpackage mstream subpkgStream) pkg         let moredeps = sort $ more \\ (buildDeps pkgdeps ++ missingLibs)         unless (null moredeps) $ do           put $ "# for missing dep '" ++ display pkg ++ "':"@@ -431,6 +437,22 @@     (if hasSubpkgs then unwords (map (("-a" ++) . fst) $ number subpkgs) else  "")   when revised $     put $ "cp -bp %{SOURCE" ++ show (1 + length subpkgs) ++ "}" +-+ pkg_name <.> "cabal"+  let extrasourcedocs = sort $ filter (`elem` docs) $ extraSrcFiles pkgDesc+  unless (null extrasourcedocs) $ do+    let pkgdir = display pkgid+    havePrep <- doesDirectoryExist pkgdir+    if havePrep then do+      executabledocs <- do+        exedocs <- filterM (fmap executable . getPermissions . (pkgdir </>)) extrasourcedocs+        if notNull exedocs then+          return exedocs+          else do+          if topSpecExists then do+            ((words . removePrefix "chmod a-x ") =<<) <$> grep "^chmod a-x " topSpecFile+          else return []+      unless (null executabledocs) $+        put $ "chmod a-x" +-+ unwords executabledocs+      else warn verbose $ "Check file permissions of" +-+ unwords extrasourcedocs   put "# End cabal-rpm setup"   sectionNewline @@ -477,16 +499,6 @@     put "find %{buildroot}%{_libdir} -name 'libHS%{pkgver}-*.so' -delete"     put "rm -r %{buildroot}%{ghclibdir}" -  let extrasourcedocs = sort $ filter (`elem` docs) $ extraSrcFiles pkgDesc-  unless (null extrasourcedocs) $ do-    let pkgdir = display pkgid-    havePrep <- doesDirectoryExist pkgdir-    if havePrep then do-      executabledocs <- filterM (fmap executable . getPermissions . (pkgdir </>)) extrasourcedocs-      unless (null executabledocs) $-        put $ "chmod a-x" +-+ unwords executabledocs-      else warn verbose $ "Check file permissions of" +-+ unwords extrasourcedocs-   put "# End cabal-rpm install"   sectionNewline @@ -560,7 +572,8 @@   put "%changelog"   now <- getCurrentTime   let date = formatTime defaultTimeLocale "%a %b %e %Y" now-  put $ "*" +-+ date +-+ "Fedora Haskell SIG <haskell@lists.fedoraproject.org> - " ++ version ++ "-" ++ release+  packager <- fromMaybe "Fedora Haskell SIG <haskell@lists.fedoraproject.org>" <$> cmdMaybe "rpmdev-packager" []+  put $ "*" +-+ date +-+ packager ++ " - " ++ version ++ "-" ++ release   put $ "- spec file generated by cabal-rpm-" ++ V.showVersion Paths_cabal_rpm.version   hClose h   return outputFile@@ -568,7 +581,7 @@ createSpecFile_ :: Verbosity -> Flags -> Bool -> Bool -> PackageType                 -> Maybe (Maybe Stream) -> Maybe PackageVersionSpecifier -> IO () createSpecFile_ verbose flags testsuite force pkgtype subpkgStream mpvs =-  void (createSpecFile False verbose flags testsuite force pkgtype subpkgStream Nothing mpvs)+  void (createSpecFile True True verbose flags testsuite force pkgtype subpkgStream Nothing mpvs)  isBuildable :: Executable -> Bool isBuildable exe = buildable $ buildInfo exe@@ -640,9 +653,6 @@ number :: [a] -> [(String,a)] number = zip (map show [(1::Int)..]) -notNull :: [a] -> Bool-notNull = not . null- getPkgName :: Maybe FilePath -> PackageDescription -> Bool -> IO (String, Bool) getPkgName (Just spec) pkgDesc binary = do   let name = display . pkgName $ package pkgDesc@@ -659,8 +669,18 @@ quoteMacros "" = "" quoteMacros (c:cs) = (if c == '%' then "%%" else [c]) ++ quoteMacros cs --- use simple-cmd > 0.2.1+#if !MIN_VERSION_simple_cmd(0,2,2) grep :: String -> FilePath -> IO [String] grep pat file = do   mres <- cmdMaybe "grep" [pat, file]   return $ maybe [] lines mres+#endif++streamSubpackage :: Maybe Stream -> Maybe (Maybe Stream) -> Maybe Stream+streamSubpackage _ (Just (Just stream)) = Just stream+streamSubpackage mstream _ = mstream++#if !MIN_VERSION_extra(1,6,8)+notNull :: [a] -> Bool+notNull = not . null+#endif
src/Commands/Update.hs view
@@ -20,14 +20,14 @@  import Commands.Spec (createSpecFile) import Header (headerOption, withSpecHead)-import PackageUtils (PackageData (..), bringTarball, editSpecField,-                     getRevisedCabal, getSpecField, latestPackage,-                     patchSpec, pkgSpecPkgData, prepare)+import PackageUtils (PackageData (..), RpmStage(Prep), bringTarball,+                     editSpecField, getRevisedCabal, getSpecField, latestPackage,+                     patchSpec, pkgSpecPkgData, rpmbuild) import Stackage (defaultLTS) import SysCmd (die) import Types -import SimpleCabal (PackageDescription (customFieldsPD, package),+import SimpleCabal (customFieldsPD, package,                     PackageIdentifier (..), showVersion) import SimpleCmd (cmd_, error', grep_, shell_, (+-+)) import SimpleCmd.Git (grepGitConfig, rwGitDir)@@ -89,12 +89,12 @@         then putStrLn $ "current" +-+ display oldver +-+ "is newer!"         else do         newrev <- getRevisedCabal newPkgId-        unless updated $+        when (newver == oldver) $           putStrLn "Package is already latest version."         when (newrev || updated) $ do           subpkg <- grep_ "%{subpkgs}" spec-          (curspec, _) <- createSpecVersion oldPkgId spec wasrevised (if subpkg then Just Nothing else Nothing)-          (newspec, newrevised) <- createSpecVersion newPkgId spec True (if subpkg then Just mstream else Nothing)+          curspec <- createSpecVersion oldPkgId spec wasrevised (if subpkg then Just Nothing else Nothing)+          newspec <- createSpecVersion newPkgId spec True (if subpkg then Just mstream else Nothing)           currel <- getSpecField "Release" spec           let suffix = "%{?dist}"               defrelease = "1"@@ -106,38 +106,39 @@           if updated && not subpkg             then editSpecField "Release" (defrelease ++ suffix) spec             else editSpecField "Release" (currel ++ suffix) spec+          rwGit <- rwGitDir           when updated $ do             -- FIXME reset when all subpkgs updated             unless subpkg $               editSpecField "Release" ("0" ++ suffix) spec             cmd_ "rpmdev-bumpspec" ["-c", "update to" +-+ showVersion newver, spec]-            rwGit <- rwGitDir             when (rwGit && subpkg) $ do               cmd_ "cp" ["-p", "sources", "sources.cblrpm"]               cmd_ "sed" ["-i", "/" ++ display oldPkgId <.> "tar.gz" ++ "/d", "sources.cblrpm"]             bringTarball newPkgId False (Just spec)-            distgit <- grepGitConfig "\\(pkgs\\|src\\)."-            when (rwGit && distgit) $ do+          distgit <- grepGitConfig "\\(pkgs\\|src\\)."+          when (rwGit && distgit) $ do+            when updated $ do               cmd_ "fedpkg" ["new-sources", display newPkgId <.> "tar.gz"]               when subpkg $ do                 shell_ $ "cat sources >>" +-+ "sources.cblrpm"                 renameFile "sources.cblrpm" "sources"-              when newrevised $-                cmd_ "git" ["add", display newPkgId <.> "cabal"]               when wasrevised $                 cmd_ "git" ["rm", display oldPkgId <.> "cabal"]+            when newrev $+              cmd_ "git" ["add", display newPkgId <.> "cabal"]+            if updated then               cmd_ "git" ["commit", "-a", "-m", "update to" +-+ showVersion newver]+              else+              when newrev $+              cmd_ "git" ["commit", "-a", "-m", "revised .cabal file"]+          rpmbuild True Prep spec   where     -- Just Nothing is default stream-    createSpecVersion :: PackageIdentifier -> String -> Bool -> Maybe (Maybe Stream) -> IO (FilePath, Bool)+    createSpecVersion :: PackageIdentifier -> String -> Bool -> Maybe (Maybe Stream) -> IO FilePath     createSpecVersion pkgid spec revise subpkgStream = do-      pd <- prepare [] (streamPkgToPVS Nothing (Just pkgid)) revise True-      let pkgdata = pd { specFilename = Just spec }-          dir = ".Cblrpm/" ++ display pkgid ++ if revise then ".revised" else ".orig"+      let dir = ".Cblrpm/" ++ display pkgid ++ if revise then ".revised" else ".orig"       direxists <- doesDirectoryExist dir       when direxists $ removeDirectoryRecursive dir       createDirectoryIfMissing True dir-      newspec <- createSpecFile True silent [] False False (SpecFile spec) subpkgStream (Just dir) (streamPkgToPVS Nothing (Just pkgid))-      let newrevised =-            isJust $ lookup "x-revision" (customFieldsPD (packageDesc pkgdata))-      return (newspec, newrevised)+      createSpecFile True revise silent [] False False (SpecFile spec) subpkgStream (Just dir) (streamPkgToPVS Nothing (Just pkgid))
src/Dependencies.hs view
@@ -43,7 +43,9 @@                     exeDepName,                     PackageDescription (package),                     PackageName, pkgcfgDepName, pkgName,-                    setupDependencies, testsuiteDependencies)+                    setupDependencies, testsuiteDependencies,+                    unPackageName+                   ) import SimpleCmd (cmd, cmdBool, removePrefix, removeSuffix, warning, (+-+)) import SimpleCmd.Rpm (rpmspec) @@ -57,8 +59,10 @@ import Data.Maybe (catMaybes, fromJust, isNothing, mapMaybe)  import Distribution.Text (display)-import Distribution.PackageDescription (allBuildInfo, BuildInfo (..),  hasLibs)-+import Distribution.PackageDescription (allLibraries, buildInfo, BuildInfo (..),+                                        executables, hasLibs, Library(..),+                                        testBuildInfo, testSuites)+import Distribution.Types.ExeDependency (ExeDependency(..)) import System.Directory (doesDirectoryExist, doesFileExist) import System.FilePath ((<.>), (</>)) @@ -79,7 +83,10 @@     let self = pkgName $ package pkgDesc         deps = filter excludedPkgs $ buildDependencies pkgDesc         setup = filter excludedPkgs $ setupDependencies pkgDesc-        buildinfo = allBuildInfo pkgDesc+        buildinfo = [ bi | lib <- allLibraries pkgDesc+                         , let bi = libBuildInfo lib ] +++                    [ bi | exe <- executables pkgDesc+                         , let bi = buildInfo exe ]         tools =  nub $ map exeDepName (concatMap buildTools buildinfo)         pkgcfgs = nub $ map pkgcfgDepName $ concatMap pkgconfigDepends buildinfo         clibs = nub $ concatMap extraLibs buildinfo@@ -132,12 +139,6 @@ packageDependencies pkgDesc = do     let (deps, setup, tools', clibs', pkgcfgs) = dependencies pkgDesc         excludedTools n = n `notElem` ["ghc", "hsc2hs", "perl"]-        mapTools "cabal" = "cabal-install"-        mapTools "gtk2hsC2hs" = "gtk2hs-buildtools"-        mapTools "gtk2hsHookGenerator" = "gtk2hs-buildtools"-        mapTools "gtk2hsTypeGen" = "gtk2hs-buildtools"-        mapTools "hspec-discover" = "ghc-hspec-discover-devel"-        mapTools tool = tool         tools = filter excludedTools $ nub $ map mapTools tools'     clibsWithErrors <- mapM resolveLib clibs' @@ -147,9 +148,25 @@     let showPkgCfg p = "pkgconfig(" ++ p ++ ")"     return $ PackageDepends deps setup tools (nub clibs) (map showPkgCfg pkgcfgs) -testsuiteDependencies' :: PackageDescription -> [PackageName]-testsuiteDependencies' =-  filter excludedPkgs . testsuiteDependencies+mapTools :: String -> String+mapTools "cabal" = "cabal-install"+mapTools "gtk2hsC2hs" = "gtk2hs-buildtools"+mapTools "gtk2hsHookGenerator" = "gtk2hs-buildtools"+mapTools "gtk2hsTypeGen" = "gtk2hs-buildtools"+mapTools "hspec-discover" = "ghc-hspec-discover-devel"+mapTools tool = tool++testsuiteDependencies' :: PackageDescription -> ([PackageName],[String])+testsuiteDependencies' pkgDesc =+  let self = pkgName $ package pkgDesc in+  ((filter excludedPkgs . testsuiteDependencies) pkgDesc,+   map mapTools ((delete (display self) . nub) (testTools ++ testToolDeps)))+  where+    tests = map testBuildInfo $ testSuites pkgDesc+    testTools = map exeDepName $ concatMap buildTools tests+    testToolDeps = map prettyShow $ concatMap buildToolDepends tests++    prettyShow (ExeDependency pn _ _) = unPackageName pn  missingPackages :: PackageDescription -> IO [RpmPackage] missingPackages pkgDesc = do
src/Main.hs view
@@ -57,13 +57,13 @@     [ Subcommand "spec" "Generate a spec file" $       createSpecFile_ <$> quietOpt <*> flags <*> testsuite <*> force <*> pkgtype <*> fmap toSubpkgStream subpackage <*> pkgVerSpecifier     , Subcommand "srpm" "Generate an srpm" $-      rpmBuild_ Source <$> flags <*> pkgtype <*> subpackage <*> pkgVerSpecifier+      rpmBuild_ Source <$> verboseRpmbuild <*> flags <*> pkgtype <*> subpackage <*> pkgVerSpecifier     , Subcommand "prep" "Unpack source" $-      rpmBuild_ Prep <$> flags <*> pkgtype <*> subpackage <*> pkgVerSpecifier+      rpmBuild_ Prep <$> verboseRpmbuild <*> flags <*> pkgtype <*> subpackage <*> pkgVerSpecifier     , Subcommand "local" "Build rpm package locally" $-      rpmBuild_ Binary <$> flags <*> pkgtype <*> subpackage <*> pkgVerSpecifier+      rpmBuild_ Binary <$> quietRpmbuild <*> flags <*> pkgtype <*> subpackage <*> pkgVerSpecifier     , Subcommand "build" "Alias for 'local' - builds rpm locally" $-      rpmBuild_ Binary <$> flags <*> pkgtype <*> subpackage <*> pkgVerSpecifier+      rpmBuild_ Binary <$> quietRpmbuild <*> flags <*> pkgtype <*> subpackage <*> pkgVerSpecifier     , Subcommand "builddep" "Install build dependencies with dnf" $       builddep <$> flags <*> pkgVerSpecifier     , Subcommand "install" "Build and install recursively" $@@ -92,6 +92,9 @@      flags :: Parser Flags     flags = optionalWith auto 'f' "flag" "[(String,Bool)]" "Set or disable Cabal flags" []++    quietRpmbuild = switchWith 'q' "quiet" "Quiet rpmbuild output"+    verboseRpmbuild = flagWith True False 'v' "verbose" "Verbose rpmbuild output"      testsuite :: Parser Bool     testsuite = switchWith 'T' "tests" "Force enabling the test-suite (even if deps missing)"
src/PackageUtils.hs view
@@ -19,6 +19,7 @@   bringTarball,   cabal_,   checkForSpecFile,+  dropChangelog,   editSpecField,   getRevisedCabal,   getSpecField,@@ -40,11 +41,19 @@ import SimpleCabal (finalPackageDescription, licenseFiles, mkPackageName,                     PackageDescription, PackageIdentifier(..), PackageName,                     tryFindPackageDesc)-import SimpleCmd (cmd, cmd_, cmdBool, cmdIgnoreErr, cmdLines, error', grep_,-                  removePrefix, sudo, sudo_, (+-+))+import SimpleCmd (cmd, cmd_, cmdBool, cmdIgnoreErr, cmdLines,+#if MIN_VERSION_simple_cmd(0,2,2)+                  cmdStderrToStdout,+#else+                  cmdSilent,+#endif+                  error', grep_, removePrefix, sudo, sudo_, (+-+)) import SimpleCmd.Git (isGitDir, grepGitConfig) import SimpleCmd.Rpm (rpmspec) import SysCmd (optionalProgram, requireProgram, rpmEval)+#if MIN_VERSION_simple_cmd(0,2,2)+import System.Exit (ExitCode (..))+#endif import Stackage (defaultLTS, latestStackage) import Types @@ -55,7 +64,7 @@ import Control.Monad    (filterM, unless, void, when)  import Data.Char (toLower)-import Data.List (isPrefixOf, isSuffixOf, nub, sort)+import Data.List import Data.Maybe import Data.Time.Clock (diffUTCTime, getCurrentTime) @@ -67,8 +76,7 @@                          removeDirectoryRecursive, renameFile,                          setCurrentDirectory) import System.Environment (getEnv)-import System.FilePath ((</>), (<.>), dropFileName, takeBaseName, takeExtensions,-                        takeFileName)+import System.FilePath import System.IO (hIsTerminalDevice, stdout) import System.Posix.Files (accessTime, fileMode, getFileStatus,                            modificationTime, setFileMode)@@ -97,6 +105,7 @@  bringTarball :: PackageIdentifier -> Bool -> Maybe FilePath -> IO () bringTarball pkgid revise mspec = do+  let tarfile = display pkgid <.> "tar.gz"   havespec <- case mspec of                 Nothing -> return False                 Just spec -> doesFileExist spec@@ -121,8 +130,6 @@     when (not allExist' && havespec) $       cmd_ "spectool" ["-g", "-S", "-C", srcdir, fromJust mspec]  where-  tarfile = display pkgid <.> "tar.gz"-   sourceFieldFile :: String -> FilePath   sourceFieldFile field =     if null field then@@ -142,7 +149,12 @@       unless havecache cabalUpdate       remotes <- getDirectoryContents_ cacheparent -      let tarpath = display (pkgName pkgid) </> display (pkgVersion pkgid) </> tarfile+      let pkgid' =+            fromMaybe (error' $ "Parse failed for:" +-+ dropExtensions file) $+            simpleParse (dropExtensions file)+          tarfile = display pkgid' <.> "tar.gz"+          tarpath =+              display (pkgName pkgid') </> display (pkgVersion pkgid') </> tarfile           paths = map (\ repo -> cacheparent </> repo </> tarpath) remotes       -- if more than one tarball, should maybe warn if they are different       tarballs <- filterM doesFileExist paths@@ -150,7 +162,7 @@         then if ranFetch              then error $ "no" +-+ tarfile +-+ "found"              else do-             cabal_ "fetch" ["-v0", "--no-dependencies", display pkgid]+             cabal_ "fetch" ["-v0", "--no-dependencies", display pkgid']              copyTarball True dir file         else do         createDirectoryIfMissing True dir@@ -172,6 +184,7 @@   let file = display (pkgName pkgid) <.> "cabal"   dir <- getSourceDir   withTempDirectory $ \ _ -> do+    -- FIXME use cabal-file     dl <- cmdBool "wget" ["--quiet", "https://hackage.haskell.org/package" </> display pkgid </> file]     if not dl       then return False@@ -184,8 +197,8 @@  data RpmStage = Binary | Source | Prep deriving Eq -rpmbuild :: RpmStage -> FilePath -> IO ()-rpmbuild mode spec = do+rpmbuild :: Bool -> RpmStage -> FilePath -> IO ()+rpmbuild quiet mode spec = do   let rpmCmd = case mode of         Binary -> "a"         Source -> "s"@@ -195,10 +208,29 @@   let rpmdirs_override =         [ "--define="++ mcr +-+ cwd | gitDir,           mcr <- ["_builddir", "_rpmdir", "_srcrpmdir", "_sourcedir"]]-  cmd_ "rpmbuild" $ ["-b" ++ rpmCmd] ++-    ["--nodeps" | mode == Prep] ++-    rpmdirs_override ++-    [spec]+  let args = ["-b" ++ rpmCmd] ++ ["--nodeps" | mode == Prep] +++             rpmdirs_override ++ [spec]+  if not quiet then+    cmd_ "rpmbuild" args+    else do+    putStr "Running rpmbuild: "+#if MIN_VERSION_simple_cmd(0,2,2)+    -- may hang for build+    (ret, out) <- cmdStderrToStdout "rpmbuild" args+    case ret of+      ExitSuccess -> putStrLn "done"+      ExitFailure _ -> error' $ "\n" ++ dropToPrefix "+ /usr/bin/chmod -Rf" out+  where+    dropToPrefix :: String -> String -> String+    dropToPrefix _ "" = ""+    dropToPrefix prefix cs =+      let ls = lines cs+          rest = dropWhile (not . (prefix `isPrefixOf`)) ls+      in unlines (if null rest then tail ls else tail rest)+#else+    cmdSilent "rpmbuild" args+    putStrLn "done"+#endif  cabalUpdate :: IO () cabalUpdate = do@@ -364,11 +396,11 @@             specTime <- modificationTime <$> getFileStatus specFile             dirTime <- accessTime <$> getFileStatus namever             when (specTime > dirTime) $ do-              rpmbuild Prep specFile+              rpmbuild True Prep specFile               dExists' <- doesDirectoryExist namever               when dExists' $ cmd_ "touch" [namever]             else-            rpmbuild Prep specFile+            rpmbuild True Prep specFile           tryFindPackageDesc namever  -- findSpecFile :: PackageDescription -> RpmFlags -> IO (FilePath, Bool)@@ -440,9 +472,10 @@ -- redundant mdir was earlier for update patchSpec :: Bool -> Maybe FilePath -> FilePath -> FilePath -> IO () patchSpec dryrun mdir oldspec newspec = do-  diff <- cmdIgnoreErr "diff" ["-u2", "-I", "- spec file generated by cabal-rpm", "-I", "Fedora Haskell SIG <haskell@lists.fedoraproject.org>", oldspec, newspec] "" >>= cmdIgnoreErr "sed" ["-e", "s%.Cblrpm/%%", "-e", "s/.cblrpm//"]+  diff <- cmdIgnoreErr "diff" ["-u2", "-I", "- spec file generated by cabal-rpm", "-I", "Fedora Haskell SIG <haskell@lists.fedoraproject.org>", oldspec, newspec] "" >>= cmdIgnoreErr "sed" ["-e", "s%.Cblrpm/%%", "-e", "s/.cblrpm//"] . dropChangelog   putStrLn diff   unless dryrun $ do+    putStrLn ""     out <- cmdIgnoreErr "patch" opts diff     putStrLn out   where@@ -450,6 +483,14 @@      count :: Eq a => a -> [a] -> Int     count x =  length . filter (==x)++dropChangelog :: String -> String+dropChangelog cs =+  let ls = lines cs in+  if " %changelog" `elem` ls then+    let rest = (dropWhileEnd ("@@ " `isPrefixOf`) . dropWhileEnd (== " ") . takeWhile (/= " %changelog")) ls in+      if length rest > 2 then unlines rest else ""+    else cs  packageManager :: IO String packageManager = do
src/Stackage.hs view
@@ -41,10 +41,10 @@ import Types  defaultLTS :: Stream-defaultLTS = LTS "14"+defaultLTS = LTS 16  latestLTS :: Stream-latestLTS = LTS "15"+latestLTS = LTS 16  stackageList :: Stream -> PackageName -> IO (Maybe PackageIdentifier) stackageList stream pkg = do@@ -82,11 +82,13 @@     Just pkgid -> do       putStrLn $ display pkgid +-+ "in Stackage" +-+ showStream stream       return mpkgid-    Nothing -> case mstream of-      Nothing -> if defaultLTS == latestLTS then return Nothing-                 else latestStackage (Just LatestLTS) pkg-      Just s -> case s of-        LTS n | LTS n < latestLTS -> latestStackage (Just LatestLTS) pkg-        LTS n | LTS n >= latestLTS -> latestStackage (Just LatestNightly) pkg-        LatestLTS -> latestStackage (Just LatestNightly) pkg-        _ -> return Nothing+    Nothing ->+      maybe (return Nothing) (\ nstream -> latestStackage (Just nstream) pkg) $ newerStream stream+  where+    newerStream :: Stream -> Maybe Stream+    newerStream (LTS n) =+      if LTS n < latestLTS+        then Just (LTS (n+1))+        else Just LatestNightly+    newerStream LatestLTS = Just LatestNightly+    newerStream _ = Nothing
src/SysCmd.hs view
@@ -20,14 +20,14 @@   die,   optionalProgram,   requireProgram,-  rpmEval,-  trySystem) where+  rpmEval+  ) where  #if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,0)) #else import Control.Applicative ((<$>)) #endif-import Control.Monad    (void, when)+import Control.Monad import Data.Maybe       (isJust, isNothing)  #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)@@ -37,7 +37,6 @@ #endif  import System.Directory (findExecutable)-import System.Process (rawSystem)  import SimpleCmd (cmd) @@ -54,11 +53,6 @@ optionalProgram :: String -> IO Bool optionalProgram c =   isJust <$> findExecutable c--trySystem :: String -> [String] -> IO ()-trySystem c args = do-  requireProgram c-  void $ rawSystem c args  -- can't live in PackageUtils due to circular dep with Distro rpmEval :: String -> IO (Maybe String)
src/Types.hs view
@@ -89,14 +89,14 @@ --   where tagWithValue ('-':name) = (mkFlagName (map toLower name), False) --         tagWithValue name       = (mkFlagName (map toLower name), True) -data Stream = LTS String | LatestLTS | Nightly String | LatestNightly | Hackage+data Stream = LTS Int | LatestLTS | Nightly String | LatestNightly | Hackage   deriving (Eq, Ord)  showStream :: Stream -> String showStream LatestNightly = "nightly" showStream LatestLTS = "lts" showStream (Nightly date) = "nightly-" <> date-showStream (LTS ver) = "lts-" <> ver+showStream (LTS ver) = "lts-" <> show ver showStream Hackage = "hackage"  instance Read Stream where@@ -107,8 +107,8 @@     let (date,rest) = span (\ c -> isDigit c || c == '-') $ removePrefix "nightly-" input in        [(Nightly date,rest)]   readsPrec _ input | "lts-" `isPrefixOf` input =-    let (ver,rest) = span (\ c -> isDigit c || c == '.') $ removePrefix "lts-" input in-      [(LTS ver,rest)]+    let (ver,rest) = span isDigit $ removePrefix "lts-" input in+      [(LTS (read ver),rest)]   readsPrec _ _ = []  removePrefix :: String -> String-> String