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 +21/−1
- Makefile +0/−6
- TODO +7/−15
- cabal-rpm.cabal +2/−1
- src/Commands/Diff.hs +12/−13
- src/Commands/Install.hs +2/−2
- src/Commands/Refresh.hs +7/−5
- src/Commands/RpmBuild.hs +7/−7
- src/Commands/Spec.hs +64/−44
- src/Commands/Update.hs +21/−20
- src/Dependencies.hs +30/−13
- src/Main.hs +7/−4
- src/PackageUtils.hs +59/−18
- src/Stackage.hs +12/−10
- src/SysCmd.hs +3/−9
- src/Types.hs +4/−4
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