cabal-rpm 2.0.11.1 → 2.1.0
raw patch · 16 files changed
+327/−302 lines, 16 filesdep ~filepathdep ~simple-cmd
Dependency ranges changed: filepath, simple-cmd
Files
- ChangeLog +21/−0
- cabal-rpm.cabal +8/−8
- src/Commands/Depends.hs +2/−3
- src/Commands/Diff.hs +15/−18
- src/Commands/Install.hs +2/−6
- src/Commands/Refresh.hs +10/−13
- src/Commands/RpmBuild.hs +3/−7
- src/Commands/Spec.hs +117/−99
- src/Commands/Update.hs +5/−22
- src/Dependencies.hs +3/−3
- src/FileUtils.hs +9/−14
- src/Main.hs +65/−18
- src/PackageUtils.hs +60/−80
- src/Stackage.hs +3/−4
- src/SysCmd.hs +1/−2
- src/Types.hs +3/−5
ChangeLog view
@@ -1,3 +1,24 @@+# 2.1.0 (2023-02-15)+- spec: list out ghc-*-prof BRs separately from ghc-*-devel+- spec: output SPDX license tags+- spec: for standalone f36+ cabal-install needs %ghc_set_gcc_flags"+- spec: handle '.' paragraph separator lines in description+- spec: initial support for --with-ghc version to build with ghcX.Y+- spec: check if deps of missing deps available+- spec: for --standalone define %cabal_install for cabal+- Stackage: default to latest lts-20 stream+- refresh: build cabal-rpm in tempdir+- PackageUtils rpmbuild: no longer override _builddir, _rpmdir, _srcrpmdir+- PackageUtils tryUnpack: now into %_builddir+- PackageUtils patchSpec: show .rej if patch fails+- PackageUtils: handle tools like ghc-tags which are not a library+- always assume revised .cabal is wanted/used+- remove all the keep logic for tmpdir processing+- allow Cabal-3.8+- GH action: add 9.4 and bump actions versions+- Diff: use extra withTempDir+- simplify withTempDirectory with withCurrentDirectory+ # 2.0.11.1 (2022-03-28) - support building with Cabal 3.6
cabal-rpm.cabal view
@@ -1,5 +1,5 @@ Name: cabal-rpm-Version: 2.0.11.1+Version: 2.1.0 Synopsis: RPM packaging tool for Haskell Cabal-based packages Description: This package provides a RPM packaging tool for Haskell Cabal-based packages.@@ -20,15 +20,15 @@ Bryan O'Sullivan <bos@serpentine.com> Maintainer: Jens Petersen <petersen@fedoraproject.org> Copyright: 2007-2008 Bryan O'Sullivan <bos@serpentine.com>,- 2012-2022 Jens Petersen <juhpetersen@gmail.com>+ 2012-2023 Jens Petersen <juhpetersen@gmail.com> Category: Distribution Build-type: Simple Extra-doc-files: ChangeLog README.md TODO Extra-source-files: man/cabal-rpm.1.md Cabal-version: 1.18-Tested-with: GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.3,- GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.4,- GHC == 8.6.5, GHC == 8.8.4, GHC == 8.10.5+Tested-with: GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.4,+ GHC == 8.6.5, GHC == 8.8.4, GHC == 8.10.7,+ GHC == 9.0.2, GHC == 9.2.5 source-repository head type: git@@ -45,14 +45,14 @@ Executable cabal-rpm Main-is: Main.hs Build-depends: base < 5,- Cabal > 1.10 && < 3.7,+ Cabal > 1.10 && < 3.9, directory, extra,- filepath,+ filepath >= 1.4, optparse-applicative, process, simple-cabal >= 0.1.3,- simple-cmd >= 0.2.0,+ simple-cmd >= 0.2.3, simple-cmd-args >= 0.1.6, unix if flag(old-locale)
src/Commands/Depends.hs view
@@ -25,8 +25,7 @@ import PackageUtils (PackageData (..), prepare) import Types -#if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,0))-#else+#if !MIN_VERSION_base(4,8,0) import Control.Applicative ((<$>)) #endif import Control.Monad (filterM, unless, void)@@ -39,7 +38,7 @@ depends :: Depends -> Flags -> Maybe PackageVersionSpecifier -> IO () depends action flags mpvs = do- pkgdata <- prepare flags mpvs False False+ pkgdata <- prepare flags mpvs let pkgDesc = packageDesc pkgdata case action of Depends -> do
src/Commands/Diff.hs view
@@ -20,39 +20,36 @@ ) where import Commands.Spec (createSpecFile)-import FileUtils (mktempdir) import PackageUtils (dropChangelog, editSpecField, getSpecField, PackageData (..), prepare) import Types -#if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,0))-#else+#if !MIN_VERSION_base(4,8,0) import Control.Applicative ((<$>)) #endif import Control.Monad import Distribution.Verbosity (silent) import SimpleCmd (grep_, error', pipe)-import System.Directory (removeDirectoryRecursive) import System.FilePath ((<.>))+import System.IO.Extra (withTempDir) import System.Posix.Env (getEnvDefault) diff :: Flags -> PackageType -> Maybe PackageVersionSpecifier -> IO () diff flags pkgtype mpvs = do- pkgdata <- prepare flags mpvs True False+ pkgdata <- prepare flags mpvs case specFilename pkgdata of Nothing -> error' "No (unique) .spec file in directory." Just spec -> do subpkg <- grep_ "%{subpkgs}" spec- tmpdir <- mktempdir- speccblrpm <- createSpecFile False True False 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"- out <- dropChangelog <$> pipe (head diffcmd, tail diffcmd ++ [spec, speccblrpm])- ---- was for %autorelease:- -- out <- pipe (head diffcmd, tail diffcmd ++ [spec, speccblrpm])- ("sed", ["-e", "s%" ++ speccblrpm ++ "%" ++ spec <.> "cblrpm" ++ "%"])- unless (null out) $- putStrLn out- removeDirectoryRecursive tmpdir+ withTempDir $ \tmpdir -> do+ speccblrpm <- createSpecFile False silent flags False False pkgtype (if subpkg then Just Nothing else Nothing) Nothing (Just tmpdir) mpvs+ currel <- getSpecField "Release" spec+ let suffix = "%{?dist}"+ editSpecField "Release" (currel ++ suffix) speccblrpm+ diffcmd <- words <$> getEnvDefault "CBLRPM_DIFF" "diff -u"+ out <- dropChangelog <$> pipe (head diffcmd, tail diffcmd ++ [spec, speccblrpm])+ ---- was for %autorelease:+ -- out <- pipe (head diffcmd, tail diffcmd ++ [spec, speccblrpm])+ ("sed", ["-e", "s%" ++ speccblrpm ++ "%" ++ spec <.> "cblrpm" ++ "%"])+ unless (null out) $+ putStrLn out
src/Commands/Install.hs view
@@ -30,10 +30,6 @@ import SimpleCmd (cmd_, (+-+)) import SimpleCmd.Rpm (rpmspec) -#if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,0))-#else---import Control.Applicative ((<$>))-#endif import Control.Monad (unless, when) import Distribution.Text (display) import System.FilePath ((</>))@@ -47,7 +43,7 @@ mspec <- checkForSpecFile (pvsPackage =<< mpvs) case mspec of Nothing ->- withTempDirectory $ \ _ -> do+ withTempDirectory $ do spec <- rpmBuild Binary False flags pkgtype subpackage mpvs rpmdir <- rpmEval "%{_rpmdir}" rpmspec [] (fmap (</> "%{arch}/%{name}-%{version}-%{release}.%{arch}.rpm") rpmdir) spec >>= rpmInstall False@@ -61,6 +57,6 @@ noPkg <- notInstalled $ RpmHsLib Prof pkg when noPkg $ do let dep = display pkg- withTempDirectory $ \ _ -> do+ withTempDirectory $ do putStrLn $ "Running cabal-rpm install" +-+ dep cmd_ "cabal-rpm" ["install", dep]
src/Commands/Refresh.hs view
@@ -27,23 +27,19 @@ import SimpleCmd (cmd, cmd_, error', grep_) import SimpleCmd.Git (rwGitDir) -#if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,0))-#else-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 (createDirectoryIfMissing, doesFileExist, renameFile)+import System.Directory (createDirectoryIfMissing, doesFileExist,+ renameFile, withCurrentDirectory) import System.Environment (getEnv) --import System.Exit (exitSuccess) import System.FilePath ((</>), (<.>))+import System.IO.Extra (withTempDir) refresh :: Bool -> PackageType -> Maybe PackageVersionSpecifier -> IO () refresh dryrun pkgtype mpvs = do- pkgdata <- prepare [] mpvs True True+ pkgdata <- prepare [] mpvs case specFilename pkgdata of Nothing -> error' "No (unique) .spec file in directory." Just spec -> do@@ -63,9 +59,8 @@ 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 wasrevised False silent [] False False spectype (if subpkg then Just Nothing else Nothing) Nothing mpvs+ newspec <- createSpecFile False silent [] False False spectype (if subpkg then Just Nothing else Nothing) Nothing Nothing mpvs patchSpec dryrun Nothing oldspec newspec -- setCurrentDirectory cwd -- when rwGit $@@ -91,7 +86,9 @@ haveExe <- doesFileExist $ bindir </> cblrpmver unless haveExe $ do createDirectoryIfMissing True bindir- cabal_ "install" ["--enable-executable-stripping",- "--installdir=" ++ bindir, cblrpmver]- renameFile (bindir </> "cabal-rpm") (bindir </> cblrpmver)+ withTempDir $ \tmpdir ->+ withCurrentDirectory tmpdir $ do+ cabal_ "install" ["--enable-executable-stripping",+ "--installdir=" ++ bindir, cblrpmver]+ renameFile (bindir </> "cabal-rpm") (bindir </> cblrpmver) cmd_ (bindir </> cblrpmver) $ "spec" : "--quiet" : ["--subpackage" | subpkg]
src/Commands/RpmBuild.hs view
@@ -30,26 +30,22 @@ import SimpleCabal (package) import SimpleCmd ((+-+)) -#if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,0))-#else---import Control.Applicative ((<$>))-#endif import Control.Monad (void, when) import Distribution.Verbosity (normal) rpmBuild :: RpmStage -> Bool -> Flags -> PackageType -> Bool -> Maybe PackageVersionSpecifier -> IO FilePath rpmBuild stage quiet flags pkgtype subpackage mpvs = do- pkgdata <- prepare flags mpvs True False+ pkgdata <- prepare flags mpvs when (stage == Binary) $ void $ pkgInstallMissing' pkgdata let pkgDesc = packageDesc pkgdata mspec = specFilename pkgdata- specFile <- maybe (createSpecFile False True False normal flags False False pkgtype (if subpackage then Just Nothing else Nothing) Nothing mpvs)+ specFile <- maybe (createSpecFile False normal flags False False pkgtype (if subpackage then Just Nothing else Nothing) Nothing Nothing mpvs) (\ s -> putStrLn ("Using existing" +-+ s) >> return s) mspec let pkgid = package pkgDesc- bringTarball pkgid True (Just specFile)+ bringTarball pkgid (Just specFile) rpmbuild quiet stage specFile return specFile
src/Commands/Spec.hs view
@@ -27,14 +27,12 @@ import Header (headerOption, withSpecHead) import PackageUtils (bringTarball, latestPackage, PackageData (..), prepare) import SimpleCabal (buildable, mkPackageName, PackageDescription (..),- PackageIdentifier(..), PackageName, showVersion)-import SimpleCmd ((+-+),-#if MIN_VERSION_simple_cmd(0,2,2)- grep,+ PackageIdentifier(..), PackageName+#if !MIN_VERSION_Cabal(2,2,0)+ , showVersion #endif- cmd,- cmdMaybe,- grep_, removePrefix)+ )+import SimpleCmd ((+-+), cmd, cmdMaybe, grep, grep_, removePrefix) import Stackage (defaultLTS) import Types @@ -46,36 +44,36 @@ import Data.Char (toUpper) import Data.List.Extra-import Data.Maybe (isJust, fromMaybe, fromJust)+import Data.Maybe (isJust, isNothing, fromMaybe, fromJust) import Data.Time.Clock (getCurrentTime) import Data.Time.Format (formatTime) import qualified Data.Version as V -import Distribution.Text (display)-import Distribution.License (License (..)-#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,2,0)- , licenseFromSPDX+#if !MIN_VERSION_Cabal(2,2,0)+import Distribution.License (License (..)) #endif- )- import Distribution.PackageDescription ( Executable (buildInfo), Library (exposedModules), exeName, hasExes, hasLibs,-#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,2,0)+#if MIN_VERSION_Cabal(2,2,0) license, #endif )+#if MIN_VERSION_Cabal(2,2,0)+import Distribution.Pretty (prettyShow)+#endif import Distribution.Simple.Utils (warn)+import Distribution.Text (display) -#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)+#if MIN_VERSION_Cabal(2,0,0) import Distribution.Types.UnqualComponentName (unUnqualComponentName) #endif import Distribution.Verbosity (Verbosity) import System.Directory (doesFileExist) import System.IO (IOMode (..), hClose, hPutStrLn, openFile)-#if defined(MIN_VERSION_time) && MIN_VERSION_time(1,5,0)+#if MIN_VERSION_time(1,5,0) import Data.Time.Format (defaultTimeLocale) #else import System.Locale (defaultTimeLocale)@@ -84,24 +82,23 @@ import qualified Paths_cabal_rpm (version) -#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(3,2,0)+#if MIN_VERSION_Cabal(3,2,0) import qualified Distribution.Utils.ShortText as ST (fromShortText) #endif -#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0)-#else+#if !MIN_VERSION_Cabal(2,0,0) unUnqualComponentName :: String -> String unUnqualComponentName = id #endif -- FIXME use datatype for options-createSpecFile :: Bool -> Bool -> Bool -> Verbosity -> Flags -> Bool -> Bool- -> PackageType -> Maybe (Maybe Stream) -> Maybe FilePath- -> Maybe PackageVersionSpecifier+createSpecFile :: Bool -> Verbosity -> Flags -> Bool -> Bool+ -> PackageType -> Maybe (Maybe Stream) -> Maybe V.Version+ -> Maybe FilePath -> Maybe PackageVersionSpecifier -> IO FilePath-createSpecFile keep revise ignoreMissing verbose flags testsuite force pkgtype subpkgStream mdest mpvs = do- pkgdata <- prepare flags mpvs revise keep+createSpecFile ignoreMissing verbose flags testsuite force pkgtype subpkgStream mwithghc mdest mpvs = do+ pkgdata <- prepare flags mpvs let mspec = case pkgtype of SpecFile f -> Just f _ -> specFilename pkgdata@@ -151,11 +148,15 @@ hasLibPkg = hasLib && not standalone dupdocs = docs `intersect` dataFiles pkgDesc datafiles = dataFiles pkgDesc \\ dupdocs- (pkgname, binlib) <- getPkgName mspec pkgDesc (pkgtype == BinaryPkg || standalone)+ ghc_name = if isJust mwithghc then "%{ghc_name}" else "ghc"+ majorVer = V.showVersion . V.makeVersion . take 2 . V.versionBranch+ ghcname = "ghc" ++ maybe "" majorVer mwithghc+ -- FIXME is binlib misnamed?+ (pkgname, binlib) <- getPkgName mspec ghcname pkgDesc (pkgtype == BinaryPkg || standalone) let pkg_name = if pkgname == name then "%{name}" else "%{pkg_name}" basename | binlib = "%{pkg_name}" | hasExecPkg = name- | otherwise = "ghc-%{pkg_name}"+ | otherwise = ghc_name ++ "-%{pkg_name}" targetSpecFile = fromMaybe "" mdest </> pkgname <.> "spec" hasExecPkg = binlib || (hasExec && not hasLibPkg) targetSpecAlreadyExists <- doesFileExist targetSpecFile@@ -196,16 +197,20 @@ sectionNewline = putNewline >> putNewline put = hPutStrLn h global m v = put $ "%global" +-+ m +-+ v- subpkgParam lt = if binlib then "-n ghc-%{name}" ++ pkgSuffix lt else show lt+ subpkgParam lt = if binlib then "-n" +-+ ghc_name ++ "-%{name}" ++ pkgSuffix lt else show lt put $ "# generated by cabal-rpm-" ++ V.showVersion Paths_cabal_rpm.version +-+ unwords (["--standalone" | standalone] ++ ["--stream " ++ showStream (fromJust mstream) | isJust mstream, mstream /= Just defaultLTS] ++ ["--subpackage" | subpackage]) put "# https://docs.fedoraproject.org/en-US/packaging-guidelines/Haskell/" putNewline + when (isJust mwithghc) $ do+ global "ghc_name" ghcname+ putNewline+ -- Some packages conflate the synopsis and description fields. Ugh. let syn =-#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(3,2,0)+#if MIN_VERSION_Cabal(3,2,0) ST.fromShortText $ #endif synopsis pkgDesc@@ -221,13 +226,15 @@ warn verbose "this package has a long synopsis." let descr =-#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(3,2,0)+#if MIN_VERSION_Cabal(3,2,0) ST.fromShortText $ #endif description pkgDesc when (null descr) $ warn verbose "this package has no description."- let descLines = (formatParagraphs . initialCapital . filterSymbols . finalPeriod) $ if null descr then syn' else descr+ let descLines = (formatParagraphs . initialCapital . filterSymbols . finalPeriod . paragraphPeriods) $ if null descr then syn' else descr+ paragraphPeriods =+ unlines . map (\l -> if l == "." then "" else l) . lines finalPeriod cs = case last cs of '.' -> cs '\n' -> finalPeriod $ init cs@@ -274,7 +281,7 @@ let (testsuiteDeps,testsuiteTools) = testsuiteDependencies' pkgDesc missTestDeps <- filterM (notSrcOrInst . RpmHsLib Devel) testsuiteDeps- let testable = notNull testsuiteDeps && not standalone && (null missTestDeps || testsuite)+ let testable = notNull testsuiteDeps && not standalone && (null missTestDeps || testsuite) && isNothing mwithghc if testable then do put "%bcond_without tests" putNewline@@ -287,11 +294,9 @@ if isJust $ lookup "x-revision" (customFieldsPD pkgDesc) then return True else do- 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+ let local = display pkgid <.> "cabal"+ have <- doesFileExist local+ if have then grep_ "x-revision" local else return False revisedDOS <- if revised then do filetype <- cmd "file" ["-b", display pkgid <.> "cabal"] return $ "CRLF" `isInfixOf` filetype@@ -307,11 +312,7 @@ putHdr "Release" $ release ++ "%{?dist}" putHdr "Summary" summary putNewline-#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,2,0)-#else- let licenseFromSPDX = id-#endif- putHdr "License" $ (showLicense . licenseFromSPDX . license) pkgDesc+ putHdr "License" $ (prettyShow . license) pkgDesc putHdr "Url" $ "https://hackage.haskell.org/package" </> pkg_name put "# Begin cabal-rpm sources:" putHdr "Source0" $ sourceUrl pkgver@@ -325,31 +326,38 @@ 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"+ putHdr "BuildRequires" $ ghc_name ++ "-Cabal-devel" mapM_ (\ d -> (if d `elem` missingLibs then putHdrComment else putHdr) "BuildRequires" (showRpm (RpmHsLib Devel d))) $ setupDeps pkgdeps putHdr "BuildRequires" $ "ghc-rpm-macros" ++ (if hasSubpkgs then "-extra" else "") unless (null (buildDeps pkgdeps)) $ do -- put "# Build"+ when (isJust mwithghc) $ do+ put "%if %{defined ghc_name}"+ putHdr "BuildRequires" $ "%{ghc_name}" ++ "-devel"+ putHdr "BuildRequires" $ "%{ghc_name}" ++ "-prof"+ put "%else"+ let metaPackages = map mkPackageName ["haskell-gi-overloading"]- ghcLibDep d | d `elem` metaPackages = RpmHsLib Devel d- | otherwise = (RpmHsLib $ if standalone then Devel else if hasLibPkg then Prof else Static) d- mapM_ (\ d -> (if d `elem` missingLibs then putHdrComment else putHdr) "BuildRequires" (showRpm (ghcLibDep d))) $ sort $ buildDeps pkgdeps+ mapM_ (\ d -> (if d `elem` missingLibs then putHdrComment else putHdr) "BuildRequires" (showRpm (RpmHsLib Devel d))) $ sort $ buildDeps pkgdeps+ when hasLibPkg $ do+ put "%if %{with ghc_prof}"+ mapM_ (\ d -> (if d `elem` missingLibs then putHdrComment else putHdr) "BuildRequires" (showRpm (RpmHsLib Prof d))) $ sort $ buildDeps pkgdeps \\ metaPackages+ put "%endif" let otherdeps = sort $ toolDeps pkgdeps ++ clibDeps pkgdeps ++ pkgcfgDeps pkgdeps unless (null otherdeps) $ do -- put "# Other" missingOthers <- missingOtherPkgs pkgDesc mapM_ (\ d -> (if d `elem` missingOthers then putHdrComment else putHdr) "BuildRequires" d) otherdeps- -- -- for ghc < 7.8:- -- when (epel7 &&- -- any (\ d -> d `elem` map showDep ["template-haskell", "hamlet"]) deps) $- -- putHdr "ExclusiveArch" "%{ghc_arches_with_ghci}" let testDeps = testsuiteDeps \\ (mkPackageName "Cabal" : (buildDeps pkgdeps ++ setupDeps pkgdeps)) when (testable && notNull testDeps) $ do put "%if %{with tests}" mapM_ (putHdr "BuildRequires") $ (sort . map showRpm) (map (RpmHsLib Devel) testDeps ++ map RpmOther (testsuiteTools \\ toolDeps pkgdeps)) put "%endif" + when (isJust mwithghc) $+ put "%endif"+ let common = binlib && datafiles /= [] && not standalone versionRelease = " = %{version}-%{release}" when common $@@ -359,13 +367,21 @@ putHdr "BuildRequires" "cabal-install > 1.18" unless (null missingLibs || ignoreMissing) $ do putStrLn "checking for deps of missing dependencies:"- let deptype = if standalone then Devel else Prof+ -- let deptype = if standalone then Devel else Prof+ when (isJust mwithghc) $+ put "%if %{undefined ghc_name}" forM_ missingLibs $ \ pkg -> do more <- packageDeps flags (streamSubpackage mstream subpkgStream) pkg let moredeps = sort $ more \\ (buildDeps pkgdeps ++ missingLibs) unless (null moredeps) $ do put $ "# for missing dep '" ++ display pkg ++ "':"- mapM_ (\ d -> (if d `elem` missingLibs then putHdrComment else putHdr) "BuildRequires" (showRpm (RpmHsLib deptype d))) moredeps+ missingMore <- filterM (notSrcOrInst . RpmHsLib Devel) moredeps+ mapM_ (\ d -> (if d `elem` missingMore then putHdrComment else putHdr) "BuildRequires" (showRpm (RpmHsLib Devel d))) moredeps+ put "%if %{with ghc_prof}"+ mapM_ (\ d -> (if d `elem` missingMore then putHdrComment else putHdr) "BuildRequires" (showRpm (RpmHsLib Prof d))) moredeps+ put "%endif"+ when (isJust mwithghc) $+ put "%endif" put "# End cabal-rpm deps" putNewline @@ -389,7 +405,7 @@ -- but libraries wihout exposedModules should be useless/redundant) let hasModules = hasLib && (isJust (library pkgDesc) && (notNull . exposedModules . fromJust . library) pkgDesc || mkPackageName "haskell-gi" `elem` (buildDeps pkgdeps ++ setupDeps pkgdeps))- baselibpkg = if binlib then "ghc-%{name}" else "%{name}"+ baselibpkg = if binlib then ghc_name ++ "-%{name}" else "%{name}" when hasLibPkg $ do when (binlib && hasModules) $ do@@ -408,7 +424,7 @@ putHdr "Provides" $ baselibpkg ++ "-static" ++ versionRelease putHdr "Provides" $ baselibpkg ++ "-static" ++ isa ++ versionRelease put "%if %{defined ghc_version}"- putHdr "Requires" "ghc-compiler = %{ghc_version}"+ putHdr "Requires" $ ghc_name ++ "-compiler = %{ghc_version}" put "%endif" when hasModules $ putHdr "Requires" $ baselibpkg ++ isa ++ versionRelease@@ -425,7 +441,7 @@ put $ "%package" +-+ subpkgParam Doc putHdr "Summary" $ "Haskell" +-+ pkg_name +-+ "library documentation" putHdr "BuildArch" "noarch"- putHdr "Requires" "ghc-filesystem"+ putHdr "Requires" $ ghc_name ++ "-filesystem" putNewline put $ "%description" +-+ subpkgParam Doc put $ wrapGenDesc $ "This package provides the Haskell" +-+ pkg_name +-+ "library documentation."@@ -436,7 +452,7 @@ put $ "%package" +-+ subpkgParam Prof putHdr "Summary" $ "Haskell" +-+ pkg_name +-+ "profiling library" putHdr "Requires" $ baselibpkg ++ "-devel" ++ isa ++ versionRelease- putHdr "Supplements" $ "(" ++ baselibpkg ++ "-devel and ghc-prof)"+ putHdr "Supplements" $ "(" ++ baselibpkg ++ "-devel and" +-+ ghc_name ++ "-prof)" putNewline put $ "%description" +-+ subpkgParam Prof put $ wrapGenDesc $ "This package provides the Haskell" +-+ pkg_name +-+ "profiling library."@@ -469,10 +485,12 @@ put "%build" put "# Begin cabal-rpm build:" if standalone then do- put "cabal update"+ global "cabal_install" "%{_bindir}/cabal"+ put "%cabal_install update" put "%if 0%{?rhel} && 0%{?rhel} < 9"- put "cabal sandbox init"- put "cabal install"+ put "%cabal_install sandbox init"+ -- FIXME support mwithghc?+ put "%cabal_install install" put "%endif" else do when hasSubpkgs $@@ -487,7 +505,10 @@ if standalone then do put "mkdir -p %{buildroot}%{_bindir}" put "%if 0%{?fedora} >= 33 || 0%{?rhel} > 8"- put "cabal install --install-method=copy --enable-executable-stripping --installdir=%{buildroot}%{_bindir}"+ put "%if 0%{?fedora} >= 36"+ put "%ghc_set_gcc_flags"+ put "%endif"+ put $ "%cabal_install install" +-+ maybe "" (\v -> "-w ghc-" ++ V.showVersion v) mwithghc +-+ "--install-method=copy --enable-executable-stripping --installdir=%{buildroot}%{_bindir}" put "%else" put "for i in .cabal-sandbox/bin/*; do" put "strip -s -o %{buildroot}%{_bindir}/$(basename $i) $i"@@ -607,41 +628,44 @@ return outputFile createSpecFile_ :: Bool -> Verbosity -> Flags -> Bool -> Bool -> PackageType- -> Maybe (Maybe Stream) -> Maybe PackageVersionSpecifier -> IO ()-createSpecFile_ ignoreMissing verbose flags testsuite force pkgtype subpkgStream mpvs =- void (createSpecFile True True ignoreMissing verbose flags testsuite force pkgtype subpkgStream Nothing mpvs)+ -> Maybe (Maybe Stream) -> Maybe V.Version+ -> Maybe PackageVersionSpecifier -> IO ()+createSpecFile_ ignoreMissing verbose flags testsuite force pkgtype subpkgStream mwithghc mpvs =+ void (createSpecFile ignoreMissing verbose flags testsuite force pkgtype subpkgStream mwithghc Nothing mpvs) isBuildable :: Executable -> Bool isBuildable exe = buildable $ buildInfo exe -showLicense :: License -> String-showLicense (GPL Nothing) = "GPL+"-showLicense (GPL (Just ver)) = "GPLv" ++ showVersion ver ++ "+"-showLicense (LGPL Nothing) = "LGPLv2+"-showLicense (LGPL (Just ver)) = "LGPLv" ++ [head $ showVersion ver] ++ "+"-showLicense BSD3 = "BSD"-showLicense BSD4 = "BSD"-showLicense MIT = "MIT"-showLicense PublicDomain = "Public Domain"-showLicense AllRightsReserved = "Proprietary"-showLicense OtherLicense = "Unknown"-showLicense (UnknownLicense l) = removePrefix "LicenseRef" l -- FIXME-#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,16,0)-showLicense (Apache Nothing) = "ASL ?"-showLicense (Apache (Just ver)) = "ASL" +-+ showVersion ver+#if !MIN_VERSION_Cabal(2,2,0)+prettyShow :: License -> String+prettyShow (GPL Nothing) = "GPL+"+prettyShow (GPL (Just ver)) = "GPLv" ++ showVersion ver ++ "+"+prettyShow (LGPL Nothing) = "LGPLv2+"+prettyShow (LGPL (Just ver)) = "LGPLv" ++ [head $ showVersion ver] ++ "+"+prettyShow BSD3 = "BSD"+prettyShow BSD4 = "BSD"+prettyShow MIT = "MIT"+prettyShow PublicDomain = "Public Domain"+prettyShow AllRightsReserved = "Proprietary"+prettyShow OtherLicense = "Unknown"+prettyShow (UnknownLicense l) = removePrefix "LicenseRef" l -- FIXME+#if MIN_VERSION_Cabal(1,16,0)+prettyShow (Apache Nothing) = "ASL ?"+prettyShow (Apache (Just ver)) = "ASL" +-+ showVersion ver #endif-#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,18,0)-showLicense (AGPL Nothing) = "AGPLv?"-showLicense (AGPL (Just ver)) = "AGPLv" ++ showVersion ver+#if MIN_VERSION_Cabal(1,18,0)+prettyShow (AGPL Nothing) = "AGPLv?"+prettyShow (AGPL (Just ver)) = "AGPLv" ++ showVersion ver #endif-#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,20,0)-showLicense BSD2 = "BSD"-showLicense (MPL ver) = "MPLv" ++ showVersion ver+#if MIN_VERSION_Cabal(1,20,0)+prettyShow BSD2 = "BSD"+prettyShow (MPL ver) = "MPLv" ++ showVersion ver #endif-#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,22,0)-showLicense ISC = "ISC"-showLicense UnspecifiedLicense = "Unspecified license!"+#if MIN_VERSION_Cabal(1,22,0)+prettyShow ISC = "ISC"+prettyShow UnspecifiedLicense = "Unspecified license!" #endif+#endif sourceUrl :: String -> String sourceUrl pv = "https://hackage.haskell.org/package" </> pv </> pv <.> ".tar.gz"@@ -674,34 +698,28 @@ getsubpkgMacro mstream mspec pkg = do let macro = filter (/= '-') $ display pkg pkgid <- latestPackage mstream pkg- bringTarball pkgid False mspec+ bringTarball pkgid mspec return (macro, pkgid) number :: [a] -> [(String,a)] number = zip (map show [(1::Int)..]) -getPkgName :: Maybe FilePath -> PackageDescription -> Bool -> IO (String, Bool)-getPkgName (Just spec) pkgDesc binary = do+getPkgName :: Maybe FilePath -> String -> PackageDescription -> Bool+ -> IO (String, Bool)+getPkgName (Just spec) _ pkgDesc binary = do let name = display . pkgName $ package pkgDesc pkgname = takeBaseName spec hasLib = hasLibs pkgDesc return $ if name == pkgname || binary then (name, hasLib) else (pkgname, False)-getPkgName Nothing pkgDesc binary = do+getPkgName Nothing ghcname pkgDesc binary = do let name = display . pkgName $ package pkgDesc hasExec = hasExes pkgDesc hasLib = hasLibs pkgDesc- return $ if binary || hasExec && not hasLib then (name, hasLib) else ("ghc-" ++ name, False)+ return $ if binary || hasExec && not hasLib then (name, hasLib) else (ghcname ++ "-" ++ name, False) quoteMacros :: String -> String quoteMacros "" = "" quoteMacros (c:cs) = (if c == '%' then "%%" else [c]) ++ quoteMacros cs--#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
src/Commands/Update.hs view
@@ -29,16 +29,8 @@ import SimpleCabal (customFieldsPD, package, PackageIdentifier (..), showVersion) import SimpleCmd-#if MIN_VERSION_simple_cmd(0,2,1)- hiding (ifM,whenM)-#endif-import SimpleCmd.Git (grepGitConfig, rwGitDir,-#if MIN_VERSION_simple_cmd(0,2,2)- gitBool-#endif- )-#if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,0))-#else+import SimpleCmd.Git (gitBool, grepGitConfig, rwGitDir)+#if !MIN_VERSION_base(4,8,0) import Control.Applicative ((<$>)) #endif import Control.Monad.Extra@@ -54,7 +46,7 @@ -- FIXME check kerberos before new-sources update :: Maybe PackageVersionSpecifier -> IO () update mpvs = do- pkgdata <- pkgSpecPkgData [] (pvsPackage =<< mpvs) True True+ pkgdata <- pkgSpecPkgData [] (pvsPackage =<< mpvs) case specFilename pkgdata of Nothing -> error' "No (unique) .spec file in directory." Just spec -> do@@ -129,7 +121,7 @@ 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)+ bringTarball newPkgId (Just spec) distgit <- grepGitConfig "\\(pkgs\\|src\\)." when (rwGit && distgit) $ do when updated $ do@@ -161,16 +153,7 @@ direxists <- doesDirectoryExist dir when direxists $ removeDirectoryRecursive dir createDirectoryIfMissing True dir- createSpecFile True revise False silent [] False False (SpecFile spec) subpkgStream (Just dir) (streamPkgToPVS Nothing (Just pkgid))--#if !MIN_VERSION_simple_cmd(0,2,2)--- | @gitBool c args@ runs git command and return result-gitBool :: String -- ^ git command- -> [String] -- ^ arguments- -> IO Bool -- ^ result-gitBool c args =- cmdBool "git" (c:args)-#endif+ createSpecFile False silent [] False False (SpecFile spec) subpkgStream Nothing (Just dir) (streamPkgToPVS Nothing (Just pkgid)) krbTicket :: IO () krbTicket = do
src/Dependencies.hs view
@@ -253,7 +253,7 @@ pkgInstallMissing :: Flags -> Maybe PackageVersionSpecifier -> IO [PackageName] pkgInstallMissing flags mpvs = do- pkgdata <- prepare flags mpvs True False+ pkgdata <- prepare flags mpvs pkgInstallMissing' pkgdata pkgInstallMissing' :: PackageData -> IO [PackageName]@@ -310,7 +310,7 @@ where missingDepsPkg :: PackageName -> IO [RpmPackage] missingDepsPkg pkg = do- pkgdata <- prepare flags (streamPkgToPVS mstream (Just (unversionedPkgId pkg))) False False+ pkgdata <- prepare flags (streamPkgToPVS mstream (Just (unversionedPkgId pkg))) missingPackages (packageDesc pkgdata) >>= filterM notAvail putMissing :: [RpmPackage] -> IO ()@@ -331,7 +331,7 @@ packageDeps :: Flags -> Maybe Stream -> PackageName -> IO [PackageName] packageDeps flags mstream pkg = do- pkgdata <- prepare flags (streamPkgToPVS mstream (Just (unversionedPkgId pkg))) False False+ pkgdata <- prepare flags (streamPkgToPVS mstream (Just (unversionedPkgId pkg))) let pkgDesc = packageDesc pkgdata (deps, setup, _, _, _) = dependencies pkgDesc return $ nub $ (deps ++ setup) \\ [pkg]
src/FileUtils.hs view
@@ -26,8 +26,7 @@ withCurrentDirectory, withTempDirectory) where -#if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,0))-#else+#if !MIN_VERSION_base(4,8,0) import Control.Applicative ((<$>)) #endif import Control.Exception (bracket)@@ -35,13 +34,15 @@ import Data.List import Data.Maybe (isJust) import SimpleCmd-import System.Directory (getCurrentDirectory, listDirectory,- setCurrentDirectory, removeDirectoryRecursive,-#if (defined(MIN_VERSION_directory) && MIN_VERSION_directory(1,2,3))+import System.Directory (listDirectory,+ removeDirectoryRecursive,+#if MIN_VERSION_directory(1,2,3) withCurrentDirectory #endif )+#if !MIN_VERSION_simple_cmd(0,2,4) || !MIN_VERSION_filepath(1,4,2) import System.FilePath+#endif import System.Posix.Files (fileSize, getFileStatus) #if !MIN_VERSION_simple_cmd(0,2,4)@@ -67,24 +68,18 @@ mktempdir :: IO FilePath mktempdir = cmd "mktemp" ["-d", "--tmpdir", "cblrpm.XXXXXXXXXX"] -withTempDirectory :: (FilePath -> IO a) -> IO a+withTempDirectory :: IO a -> IO a withTempDirectory run = bracket mktempdir removeDirectoryRecursive- (\ tmpdir -> do- cwd <- getCurrentDirectory- setCurrentDirectory tmpdir- res <- run cwd- setCurrentDirectory cwd- return res)+ (`withCurrentDirectory` run) -- listDirectory without hidden files listDirectory' :: FilePath -> IO [FilePath] listDirectory' dir = filter (not . isPrefixOf ".") <$> listDirectory dir -#if (defined(MIN_VERSION_directory) && MIN_VERSION_directory(1,2,3))-#else+#if !MIN_VERSION_directory(1,2,3) withCurrentDirectory :: FilePath -> IO a -> IO a withCurrentDirectory dir action = bracket getCurrentDirectory setCurrentDirectory $ \ _ -> do
src/Main.hs view
@@ -18,15 +18,14 @@ module Main where -#if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,13,0))-#else+#if !MIN_VERSION_base(4,13,0) import Control.Applicative ((<|>)-#if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,0))-#else+#if !MIN_VERSION_base(4,8,0) , (<$>), (<*>) #endif ) #endif+import Data.Version.Extra (readVersion) import Distribution.Text (simpleParse) import Distribution.Verbosity (normal, silent) #if !MIN_VERSION_simple_cmd_args(0,1,7)@@ -45,7 +44,7 @@ import PackageUtils (RpmStage (..)) import Paths_cabal_rpm (version)-import Types+import Types hiding (readVersion) import SimpleCabal (PackageIdentifier(..)) import SimpleCmdArgs@@ -57,33 +56,81 @@ "RPM package tool for Haskell Stackage/Hackage packages" $ subcommands [ Subcommand "spec" "Generate a spec file" $- createSpecFile_ <$> ignoreMissing <*> quietOpt <*> flags <*> testsuite <*> force <*> pkgtype <*> fmap toSubpkgStream subpackage <*> pkgVerSpecifier+ createSpecFile_+ <$> ignoreMissing+ <*> quietOpt+ <*> flags+ <*> testsuite+ <*> force+ <*> pkgtype+ <*> fmap toSubpkgStream subpackage+ <*> optional (readVersion <$> strOptionWith 'w' "with-ghc" "VERSION" "ghc compiler version")+ <*> pkgVerSpecifier , Subcommand "srpm" "Generate an srpm" $- rpmBuild_ Source <$> verboseRpmbuild <*> flags <*> pkgtype <*> subpackage <*> pkgVerSpecifier+ rpmBuild_ Source+ <$> verboseRpmbuild+ <*> flags+ <*> pkgtype+ <*> subpackage+ <*> pkgVerSpecifier , Subcommand "prep" "Unpack source" $- rpmBuild_ Prep <$> verboseRpmbuild <*> flags <*> pkgtype <*> subpackage <*> pkgVerSpecifier+ rpmBuild_ Prep+ <$> verboseRpmbuild+ <*> flags+ <*> pkgtype+ <*> subpackage+ <*> pkgVerSpecifier , Subcommand "local" "Build rpm package locally" $- rpmBuild_ Binary <$> quietRpmbuild <*> flags <*> pkgtype <*> subpackage <*> pkgVerSpecifier+ rpmBuild_ Binary+ <$> quietRpmbuild+ <*> flags+ <*> pkgtype+ <*> subpackage+ <*> pkgVerSpecifier , Subcommand "build" "Alias for 'local' - builds rpm locally" $- rpmBuild_ Binary <$> quietRpmbuild <*> flags <*> pkgtype <*> subpackage <*> pkgVerSpecifier+ rpmBuild_ Binary+ <$> quietRpmbuild+ <*> flags+ <*> pkgtype+ <*> subpackage+ <*> pkgVerSpecifier , Subcommand "builddep" "Install build dependencies with dnf" $- builddep <$> flags <*> pkgVerSpecifier+ builddep+ <$> flags+ <*> pkgVerSpecifier , Subcommand "install" "Build and install recursively" $- install <$> flags <*> pkgtype <*> subpackage <*> pkgVerSpecifier+ install+ <$> flags+ <*> pkgtype+ <*> subpackage+ <*> pkgVerSpecifier -- should be (optional versionArg) not pkgid , Subcommand "diff" "Diff with pristine generated spec file" $- diff <$> flags <*> pkgtype <*> pkgVerSpecifier+ diff+ <$> flags+ <*> pkgtype+ <*> pkgVerSpecifier , Subcommand "depends" "List Haskell dependencies" $- depends Depends <$> flags <*> pkgVerSpecifier+ depends Depends+ <$> flags+ <*> pkgVerSpecifier , Subcommand "requires" "List buildrequires for package" $- depends Requires <$> flags <*> pkgVerSpecifier+ depends Requires+ <$> flags+ <*> pkgVerSpecifier , Subcommand "missingdeps" "List dependencies not available" $- depends Missing <$> flags <*> pkgVerSpecifier+ depends Missing+ <$> flags+ <*> pkgVerSpecifier -- should be just Maybe PackageName , Subcommand "refresh" "Refresh spec file to latest packaging" $- refresh <$> dryrun <*> pkgtype <*> pkgVerSpecifier+ refresh+ <$> dryrun+ <*> pkgtype+ <*> pkgVerSpecifier , Subcommand "update" "Update package to latest version" $- update <$> pkgVerSpecifier+ update+ <$> pkgVerSpecifier ] where pkgId :: Parser (Maybe PackageIdentifier)
src/PackageUtils.hs view
@@ -36,24 +36,16 @@ ) where import FileUtils (assertFileNonEmpty, filesWithExtension, fileWithExtension,- listDirectory', mktempdir,- withTempDirectory)+ listDirectory', withTempDirectory) import SimpleCabal (finalPackageDescription, licenseFiles, mkPackageName, PackageDescription, PackageIdentifier(..), PackageName, tryFindPackageDesc) import SimpleCmd (cmd, cmd_, cmdBool, cmdIgnoreErr, cmdLines,-#if MIN_VERSION_simple_cmd(0,2,2)- cmdStderrToStdout,-#else- cmdSilent,-#endif- error', grep_, removePrefix, sudo, sudo_, (+-+))+ cmdStderrToStdoutIn,+ error', grep_, removePrefix, shell_, 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 @@ -103,8 +95,8 @@ likely names name = any (`isPrefixOf` lower name) names unlikely name = not $ any (`isSuffixOf` name) ["~", ".cabal"] -bringTarball :: PackageIdentifier -> Bool -> Maybe FilePath -> IO ()-bringTarball pkgid revise mspec = do+bringTarball :: PackageIdentifier -> Maybe FilePath -> IO ()+bringTarball pkgid mspec = do let tarfile = display pkgid <.> "tar.gz" havespec <- case mspec of Nothing -> return False@@ -124,7 +116,7 @@ createDirectoryIfMissing True srcdir mapM_ (copyTarball False srcdir) sources haveLocalCabal <- doesFileExist $ srcdir </> display pkgid <.> "cabal"- when (not haveLocalCabal && revise) $+ unless haveLocalCabal $ void $ getRevisedCabal pkgid allExist' <- and <$> mapM (doesFileExist . (srcdir </>)) sources when (not allExist' && havespec) $@@ -180,17 +172,14 @@ else fromJust <$> rpmEval "%{_sourcedir}" getBuildDir :: IO FilePath-getBuildDir = do- git <- isGitDir "."- if git- then getCurrentDirectory- else fromJust <$> rpmEval "%{_builddir}"+getBuildDir =+ fromJust <$> rpmEval "%{_builddir}" getRevisedCabal :: PackageIdentifier -> IO Bool getRevisedCabal pkgid = do let file = display (pkgName pkgid) <.> "cabal" dir <- getSourceDir- withTempDirectory $ \ _ -> do+ withTempDirectory $ do -- FIXME use cabal-file dl <- cmdBool "wget" ["--quiet", "https://hackage.haskell.org/package" </> display pkgid </> file] if not dl@@ -219,20 +208,18 @@ cwd <- getCurrentDirectory gitDir <- isGitDir "." let rpmdirs_override =- [ "--define="++ mcr +-+ cwd | gitDir,- mcr <- ["_builddir", "_rpmdir", "_srcrpmdir", "_sourcedir"]]+ [ "--define="++ mcr +-+ cwd | gitDir, mcr <- ["_sourcedir"]] let args = ["-b" ++ rpmCmd] ++ ["--nodeps" | mode == Prep] ++ rpmdirs_override ++ [spec] if not quiet then cmd_ "rpmbuild" args else do putStr $ "rpmbuild" +-+ show mode ++ ": "-#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+ (ok, out) <- cmdStderrToStdoutIn "rpmbuild" args ""+ if ok+ then putStrLn "done"+ else error' $ "\n" ++ dropToPrefix "+ /usr/bin/chmod -Rf" out where dropToPrefix :: String -> String -> String dropToPrefix _ "" = ""@@ -240,10 +227,6 @@ 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@@ -281,30 +264,22 @@ cmd_ "cabal" (c:args) -tryUnpack :: PackageIdentifier -> Bool -> Bool- -> IO (FilePath, Maybe FilePath) -- (cabalfile, mtmpdir)-tryUnpack pkgid revise keep = do- let dir = display pkgid+tryUnpack :: PackageIdentifier -> IO FilePath+tryUnpack pkgid = do+ builddir <- getBuildDir+ let dir = builddir </> display pkgid isdir <- doesDirectoryExist dir if isdir then do mcabal <- withCurrentDirectory dir $ checkForCabalFile (Just (pkgName pkgid))- if isJust mcabal then do- pth <- tryFindPackageDesc dir- return (pth, Nothing)- else- error $ "could not find" +-+ display (pkgName pkgid) <.> "cabal"+ if isJust mcabal+ then tryFindPackageDesc dir+ else error $ "could not find" +-+ display (pkgName pkgid) <.> "cabal" else do- cwd <- getCurrentDirectory- mtmpdir <- if keep then return Nothing- else do- tmpdir <- mktempdir- setCurrentDirectory tmpdir- return $ Just tmpdir- cabal_ "unpack" $ ["-v0"] ++ ["--pristine" | not revise] ++ [display pkgid]- pth <- tryFindPackageDesc dir- setCurrentDirectory cwd- return (fromMaybe "" mtmpdir </> pth, mtmpdir)+ createDirectoryIfMissing True builddir+ withCurrentDirectory builddir $ do+ cabal_ "unpack" ["-v0", display pkgid]+ tryFindPackageDesc dir latestPackage :: Maybe Stream -> PackageName -> IO PackageIdentifier latestPackage (Just Hackage) pkg = latestHackage pkg@@ -336,7 +311,7 @@ checkForSpecFile mpkg = do allSpecs <- filesWithExtension "." ".spec" -- emacs makes ".#*.spec" tmp files- let predicate = maybe ((/= '.') . head) (\ pkg -> (`elem` [pkg <.> "spec", "ghc-" ++ pkg <.> "spec"])) (display <$> mpkg)+ let predicate = maybe ((/= '.') . head) ((\ pkg -> (`elem` [pkg <.> "spec", "ghc-" ++ pkg <.> "spec"])) . display) mpkg specs = filter predicate allSpecs when (specs /= allSpecs && isNothing mpkg) $ putStrLn "Warning: dir contains a hidden spec file"@@ -348,7 +323,7 @@ checkForCabalFile :: Maybe PackageName -> IO (Maybe FilePath) checkForCabalFile mpkg = do allCabals <- filesWithExtension "." ".cabal"- let predicate = maybe (const True) (\ pkg -> (== pkg <.> "cabal")) (display <$> mpkg)+ let predicate = maybe (const True) ((\ pkg -> (== pkg <.> "cabal")) . display) mpkg cabals = filter predicate allCabals case cabals of [one] -> return $ Just one@@ -368,8 +343,8 @@ then fileWithExtension (display pkgid) ".cabal" else return Nothing -pkgSpecPkgData :: Flags -> Maybe PackageName -> Bool -> Bool -> IO PackageData-pkgSpecPkgData flags mpkg revise keep = do+pkgSpecPkgData :: Flags -> Maybe PackageName -> IO PackageData+pkgSpecPkgData flags mpkg = do mspec <- checkForSpecFile mpkg case mspec of Just spec -> specPackageData spec@@ -381,12 +356,12 @@ return $ PackageData Nothing docs licenses pkgDesc Nothing -> case mpkg of- Just pkg -> prepStreamPkg flags Nothing defaultLTS pkg revise keep+ Just pkg -> prepStreamPkg flags Nothing defaultLTS pkg Nothing -> do cwd <- getCurrentDirectory case simpleParse (takeFileName cwd) of Just pdir ->- prepare flags (streamPkgToPVS Nothing (Just pdir)) revise keep+ prepare flags (streamPkgToPVS Nothing (Just pdir)) Nothing -> error' "package not found for directory" where specPackageData :: FilePath -> IO PackageData@@ -398,10 +373,14 @@ where cabalFromSpec :: FilePath -> IO FilePath cabalFromSpec specFile = do- namever <- removePrefix "ghc-" . head <$> rpmspec ["--srpm"] (Just "%{name}-%{version}") specFile+ -- FIXME handle ghcX.Y+ havePkgname <- grep_ "%{pkg_name}" specFile+ -- handle bin packages starting with ghc, like "ghc-tags"+ namever <- (if havePkgname then removePrefix "ghc-" else id) . head+ <$> rpmspec ["--srpm"] (Just "%{name}-%{version}") specFile case simpleParse namever of Nothing -> error "pkgid could not be parsed"- Just pkgid -> bringTarball pkgid revise (Just specFile)+ Just pkgid -> bringTarball pkgid (Just specFile) builddir <- getBuildDir let pkgsrcdir = builddir </> namever dExists <- doesDirectoryExist pkgsrcdir@@ -431,33 +410,31 @@ , packageDesc :: PackageDescription } -prepPkgId :: Flags -> Maybe FilePath -> PackageIdentifier -> Bool -> Bool- -> IO PackageData-prepPkgId flags mspec pkgid revise keep = do- (cabalfile, mtmp) <- tryUnpack pkgid revise keep+prepPkgId :: Flags -> Maybe FilePath -> PackageIdentifier -> IO PackageData+prepPkgId flags mspec pkgid = do+ void $ getRevisedCabal pkgid+ cabalfile <- tryUnpack pkgid (pkgDesc, docs, licenses) <- simplePackageDescription flags cabalfile- unless keep $ maybe (return ()) removeDirectoryRecursive mtmp return $ PackageData mspec docs licenses pkgDesc -prepStreamPkg :: Flags -> Maybe FilePath -> Stream -> PackageName -> Bool -> Bool+prepStreamPkg :: Flags -> Maybe FilePath -> Stream -> PackageName -> IO PackageData-prepStreamPkg flags mspec stream pkg revise keep = do+prepStreamPkg flags mspec stream pkg = do pkgid <- latestPackage (Just stream) pkg mcabal <- checkForPkgCabalFile pkgid case mcabal of Just cabalfile -> do (pkgDesc, docs, licenses) <- simplePackageDescription flags cabalfile return $ PackageData mspec docs licenses pkgDesc- Nothing -> prepPkgId flags mspec pkgid revise keep+ Nothing -> prepPkgId flags mspec pkgid -- Nothing means package in cwd-prepare :: Flags -> Maybe PackageVersionSpecifier -> Bool -> Bool- -> IO PackageData-prepare flags Nothing revise keep = pkgSpecPkgData flags Nothing revise keep+prepare :: Flags -> Maybe PackageVersionSpecifier -> IO PackageData+prepare flags Nothing = pkgSpecPkgData flags Nothing -- Something implies either new packaging or some existing spec file in dir-prepare flags (Just pvs) revise keep =+prepare flags (Just pvs) = case pvs of- PVPackageName pkg -> pkgSpecPkgData flags (Just pkg) revise keep+ PVPackageName pkg -> pkgSpecPkgData flags (Just pkg) PVPackageId pkgid -> do mspec <- checkForSpecFile $ Just (pkgName pkgid) mcabal <- checkForPkgCabalFile pkgid@@ -465,7 +442,7 @@ Just cabalfile -> do (pkgDesc, docs, licenses) <- simplePackageDescription flags cabalfile return $ PackageData mspec docs licenses pkgDesc- Nothing -> prepPkgId flags mspec pkgid revise keep+ Nothing -> prepPkgId flags mspec pkgid PVStreamPackage stream Nothing -> do mspec <- checkForSpecFile Nothing case mspec of@@ -474,24 +451,27 @@ let trydir = simpleParse (takeFileName cwd) case trydir of Just pdir | pkgVersion pdir == nullVersion ->- prepare flags (streamPkgToPVS (Just stream) trydir) revise keep+ prepare flags (streamPkgToPVS (Just stream) trydir) _ -> error' "package not found" Just spec -> do let pkg = mkPackageName $ removePrefix "ghc-" $ takeBaseName spec- prepStreamPkg flags (Just spec) stream pkg revise keep+ prepStreamPkg flags (Just spec) stream pkg PVStreamPackage stream (Just pkg) -> do mspec <- checkForSpecFile (Just pkg)- prepStreamPkg flags mspec stream pkg revise keep+ prepStreamPkg flags mspec stream pkg -- 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//"] . dropChangelog- putStrLn diff- unless dryrun $ do- putStrLn ""- out <- cmdIgnoreErr "patch" opts diff- putStrLn out+ unless (null diff) $ do+ putStrLn diff+ unless dryrun $ do+ putStrLn ""+ (ok,out) <- cmdStderrToStdoutIn "patch" opts (diff ++ "\n")+ putStrLn out+ unless ok $+ shell_ "echo *.rej; cat *.rej" where opts = ["--fuzz=1"] ++ ["-p" ++ show n | let n = count '/' (removePrefix ".Cblrpm/" newspec)] ++ maybe [] (\ d -> ["-d", d]) mdir
src/Stackage.hs view
@@ -24,8 +24,7 @@ #ifdef CURL import Network.Curl-#if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,0))-#else+#if !MIN_VERSION_base(4,8,0) import Control.Applicative ((<$>)) #endif #else@@ -41,10 +40,10 @@ import Types defaultLTS :: Stream-defaultLTS = LTS 18+defaultLTS = LTS 20 latestLTS :: Stream-latestLTS = LTS 18+latestLTS = LTS 20 stackageList :: Stream -> PackageName -> IO (Maybe PackageIdentifier) stackageList stream pkg = do
src/SysCmd.hs view
@@ -22,8 +22,7 @@ rpmEval ) where -#if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,0))-#else+#if !MIN_VERSION_base(4,8,0) import Control.Applicative ((<$>)) #endif import Control.Monad
src/Types.hs view
@@ -34,13 +34,12 @@ import Data.Char (isDigit {--, toLower--}) import Data.List import Data.Maybe (fromMaybe)-#if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,11,0))-#else+#if !MIN_VERSION_base(4,11,0) import Data.Semigroup ((<>)) #endif import Distribution.Text (display) import Distribution.Version (-#if (defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0))+#if MIN_VERSION_Cabal(2,0,0) Version, mkVersion, nullVersion@@ -128,8 +127,7 @@ unversionedPkgId :: PackageName -> PackageIdentifier unversionedPkgId pn = PackageIdentifier pn nullVersion -#if (defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(2,0,0))-#else+#if !MIN_VERSION_Cabal(2,0,0) mkVersion :: [Int] -> Version mkVersion is = Version is []