Hello community, here is the log from the commit of package cabal-rpm for openSUSE:Factory checked in at 2017-04-12 17:34:41 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/cabal-rpm (Old) and /work/SRC/openSUSE:Factory/.cabal-rpm.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "cabal-rpm" Wed Apr 12 17:34:41 2017 rev:18 rq:485098 version:0.11.1 Changes: -------- --- /work/SRC/openSUSE:Factory/cabal-rpm/cabal-rpm.changes 2017-03-14 10:04:00.205987484 +0100 +++ /work/SRC/openSUSE:Factory/.cabal-rpm.new/cabal-rpm.changes 2017-04-12 18:01:20.772112110 +0200 @@ -1,0 +2,5 @@ +Mon Mar 27 12:39:27 UTC 2017 - [email protected] + +- Update to version 0.11.1 with cabal2obs. + +------------------------------------------------------------------- Old: ---- cabal-rpm-0.11.tar.gz New: ---- cabal-rpm-0.11.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ cabal-rpm.spec ++++++ --- /var/tmp/diff_new_pack.eUg5wQ/_old 2017-04-12 18:01:21.440017676 +0200 +++ /var/tmp/diff_new_pack.eUg5wQ/_new 2017-04-12 18:01:21.444017111 +0200 @@ -17,7 +17,7 @@ Name: cabal-rpm -Version: 0.11 +Version: 0.11.1 Release: 0 Summary: RPM packaging tool for Haskell Cabal-based packages License: GPL-3.0+ ++++++ cabal-rpm-0.11.tar.gz -> cabal-rpm-0.11.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cabal-rpm-0.11/ChangeLog new/cabal-rpm-0.11.1/ChangeLog --- old/cabal-rpm-0.11/ChangeLog 2017-01-27 14:18:23.000000000 +0100 +++ new/cabal-rpm-0.11.1/ChangeLog 2017-03-13 16:12:42.000000000 +0100 @@ -1,3 +1,12 @@ +* 0.11.1 (2017-03-13) +- support building meta (compat) packages +- invocation of optional stackage-query to update to LTS now works +- initial --subpackage support for %{subpkgs} of missing deps: + including downloading, but update is not properly implemented yet +- new %{pkgver} macro +- (+-+) absorbs extra space +- update no longer resets release for %{subpkgs} + * 0.11 (2017-01-27) - refresh command now reads the cabal-rpm version header in the spec file and installs that version of cabal-rpm under ~/.cblrpm/ and uses it to make patch diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cabal-rpm-0.11/cabal-rpm.cabal new/cabal-rpm-0.11.1/cabal-rpm.cabal --- old/cabal-rpm-0.11/cabal-rpm.cabal 2017-01-27 14:18:23.000000000 +0100 +++ new/cabal-rpm-0.11.1/cabal-rpm.cabal 2017-03-13 16:12:42.000000000 +0100 @@ -1,5 +1,5 @@ Name: cabal-rpm -Version: 0.11 +Version: 0.11.1 Synopsis: RPM packaging tool for Haskell Cabal-based packages Description: This package provides a RPM packaging tool for Haskell Cabal-based packages. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cabal-rpm-0.11/src/Commands/Depends.hs new/cabal-rpm-0.11.1/src/Commands/Depends.hs --- old/cabal-rpm-0.11/src/Commands/Depends.hs 2017-01-27 14:18:23.000000000 +0100 +++ new/cabal-rpm-0.11.1/src/Commands/Depends.hs 2017-03-13 16:12:42.000000000 +0100 @@ -19,8 +19,8 @@ import Dependencies (dependencies, missingPackages, packageDependencies) import Options (quiet) -import PackageUtils (PackageData (..), prepare, stripPkgDevel) -import SysCmd (repoquery, (+-+)) +import PackageUtils (PackageData (..), prepare, repoquery, stripPkgDevel) +import SysCmd ((+-+)) #if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,2)) #else diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cabal-rpm-0.11/src/Commands/Install.hs new/cabal-rpm-0.11.1/src/Commands/Install.hs --- old/cabal-rpm-0.11/src/Commands/Install.hs 2017-01-27 14:18:23.000000000 +0100 +++ new/cabal-rpm-0.11.1/src/Commands/Install.hs 2017-03-13 16:12:42.000000000 +0100 @@ -20,14 +20,15 @@ import Commands.RpmBuild (rpmBuild) import Dependencies (missingPackages, notInstalled) import Options (RpmFlags (..)) -import PackageUtils (PackageData (..), RpmStage (..), stripPkgDevel) -import SysCmd (cmd, cmd_, pkgInstall, rpmInstall, (+-+)) +import PackageUtils (PackageData (..), pkgInstall, rpmInstall, RpmStage (..), stripPkgDevel) +import SysCmd (cmd, cmd_, (+-+)) #if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,2)) #else import Control.Applicative ((<$>)) #endif -import Control.Monad (unless, when) +import Control.Monad (filterM, unless, when) +import System.Directory (doesFileExist) import System.FilePath ((</>)) install :: PackageData -> RpmFlags -> IO () @@ -45,7 +46,8 @@ rpmdir <- cmd "rpm" ["--eval", "%{_rpmdir}"] rpms <- (map (\ p -> rpmdir </> arch </> p ++ ".rpm") . lines) <$> cmd "rpmspec" ["-q", spec] - rpmInstall rpms + -- metapkgs don't have base package + filterM doesFileExist rpms >>= rpmInstall installMissing :: String -> IO () installMissing pkg = do diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cabal-rpm-0.11/src/Commands/Refresh.hs new/cabal-rpm-0.11.1/src/Commands/Refresh.hs --- old/cabal-rpm-0.11/src/Commands/Refresh.hs 2017-01-27 14:18:23.000000000 +0100 +++ new/cabal-rpm-0.11.1/src/Commands/Refresh.hs 2017-03-13 16:12:42.000000000 +0100 @@ -15,22 +15,25 @@ refresh ) where +import Paths_cabal_rpm (version) import Commands.Spec (createSpecFile) import FileUtils (withTempDirectory) import Options (RpmFlags (..)) -import PackageUtils (PackageData (..), removePrefix) -import SysCmd (cmd_, optionalProgram, shell, (+-+)) +import PackageUtils (PackageData (..), isGitDir, patchSpec, removePrefix) +import SysCmd (cmd, cmd_, grep_, notNull, optionalProgram) #if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,2)) #else import Control.Applicative ((<$>)) #endif -import Control.Monad (unless) +import Control.Monad (unless, when) import Data.List (isPrefixOf) +import Data.Version (showVersion) import Distribution.Simple.Utils (die) import System.Directory (copyFile, createDirectoryIfMissing, doesFileExist, - setCurrentDirectory) + getCurrentDirectory, setCurrentDirectory) import System.Environment (getEnv) +--import System.Exit (exitSuccess) import System.FilePath ((</>)) refresh :: PackageData -> RpmFlags -> IO () @@ -38,14 +41,24 @@ case specFilename pkgdata of Nothing -> die "No (unique) .spec file in directory." Just spec -> do + gitDir <- getCurrentDirectory >>= isGitDir + rwGit <- if gitDir then grep_ "url = ssh://" ".git/config" else return False + when rwGit $ do + local <- cmd "git" ["diff"] + when (notNull local) $ + putStrLn "Working dir contain local changes!" + -- exitSuccess first <- head . lines <$> readFile spec - if "# generated by cabal-rpm-" `isPrefixOf` first - then do - let cblrpmver = removePrefix "# generated by cabal-rpm-" first + do + let cblrpmver = + if "# generated by cabal-rpm-" `isPrefixOf` first + then removePrefix "# generated by cabal-rpm-" first + else "0.9.11" + when (cblrpmver == showVersion version) $ + error "Packaging is up to date" oldspec <- createOldSpec cblrpmver spec newspec <- createSpecFile pkgdata flags Nothing - shell $ "diff -u2 -I \"- spec file generated by cabal-rpm\" -I \"Fedora Haskell SIG <[email protected]>\"" +-+ oldspec +-+ newspec +-+ "| sed -e 's/.cblrpm//' | patch" +-+ "|| :" - else putStrLn $ "No cabal-rpm header line in" +-+ spec + patchSpec Nothing oldspec newspec -- setCurrentDirectory cwd -- when rwGit $ -- cmd_ "git" ["commit", "-a", "-m", "update to" +-+ newver] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cabal-rpm-0.11/src/Commands/RpmBuild.hs new/cabal-rpm-0.11.1/src/Commands/RpmBuild.hs --- old/cabal-rpm-0.11/src/Commands/RpmBuild.hs 2017-01-27 14:18:23.000000000 +0100 +++ new/cabal-rpm-0.11.1/src/Commands/RpmBuild.hs 2017-03-13 16:12:42.000000000 +0100 @@ -23,8 +23,8 @@ import Dependencies (missingPackages) import Options (RpmFlags (..)) import PackageUtils (copyTarball, isScmDir, PackageData (..), packageName, - packageVersion, rpmbuild, RpmStage (..)) -import SysCmd (cmd, pkgInstall, (+-+)) + packageVersion, rpmbuild, pkgInstall, RpmStage (..)) +import SysCmd (cmd, (+-+)) --import Control.Exception (bracket) import Control.Monad (unless, void, when) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cabal-rpm-0.11/src/Commands/Spec.hs new/cabal-rpm-0.11.1/src/Commands/Spec.hs --- old/cabal-rpm-0.11/src/Commands/Spec.hs 2017-01-27 14:18:23.000000000 +0100 +++ new/cabal-rpm-0.11.1/src/Commands/Spec.hs 2017-03-13 16:12:42.000000000 +0100 @@ -20,23 +20,24 @@ createSpecFile, createSpecFile_ ) where -import Dependencies (notInstalled, packageDependencies, showDep, - testsuiteDependencies) +import Dependencies (notInstalled, missingPackages, packageDependencies, + showDep, testsuiteDependencies) import Distro (Distro(..), detectDistro) import Options (RpmFlags (..)) -import PackageUtils (getPkgName, isScmDir, PackageData (..), - packageName, packageVersion) -import SysCmd ((+-+)) +import PackageUtils (copyTarball, getPkgName, isScmDir, latestPackage, + nameVersion, PackageData (..), packageName, + packageVersion, stripPkgDevel) +import SysCmd ((+-+), notNull) #if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,2)) #else import Control.Applicative ((<$>)) #endif -import Control.Monad (filterM, unless, void, when) +import Control.Monad (filterM, unless, void, when, (>=>)) import Data.Char (toLower, toUpper) import Data.List (groupBy, intercalate, intersect, isPrefixOf, isSuffixOf, sort, (\\)) -import Data.Maybe (fromMaybe) +import Data.Maybe (fromMaybe, fromJust) import Data.Time.Clock (getCurrentTime) import Data.Time.Format (formatTime) import Data.Version (showVersion) @@ -47,7 +48,7 @@ import Distribution.PackageDescription (BuildInfo (..), PackageDescription (..), Executable (..), FlagName (..), - exeName, hasExes, hasLibs) + Library (..), exeName, hasExes, hasLibs) --import Distribution.Version (VersionRange, foldVersionRange') @@ -112,10 +113,10 @@ h <- openFile specFile' WriteMode let putHdr hdr val = hPutStrLn h (hdr ++ ":" ++ padding hdr ++ val) padding hdr = replicate (14 - length hdr) ' ' ++ " " + putHdrComment hdr val = putHdr ('#':hdr) (' ':val) putNewline = hPutStrLn h "" sectionNewline = putNewline >> putNewline put = hPutStrLn h - putDef v s = put $ "%global" +-+ v +-+ s ghcPkg = if binlib then "-n ghc-%{name}" else "" ghcPkgDevel = if binlib then "-n ghc-%{name}-devel" else "devel" @@ -170,7 +171,21 @@ _ -> c: filterSymbols cs filterSymbols [] = [] when hasLib $ do - putDef "pkg_name" name + put $ "%global pkg_name" +-+ name + put "%global pkgver %{pkg_name}-%{version}" + putNewline + + let pkgver = if hasLib then "%{pkgver}" else pkg_name ++ "-%{version}" + + -- FIXME sort by build order + missing <- if rpmSubpackage flags then missingPackages pkgDesc else return [] + subpackages <- + mapM ((getsubpkgMacro >=> + \(m,pv) -> put ("%global" +-+ m +-+ pv) >> return ("%{" ++ m ++ "}")) + . stripPkgDevel) missing + let hasSubpkgs = notNull subpackages + when hasSubpkgs $ do + put $ "%global subpkgs" +-+ unwords subpackages putNewline unless (null testsuiteDeps) $ do @@ -181,7 +196,7 @@ -- let lCsources = concatMap (cSources . libBuildInfo) $ maybeToList $ library pkgDesc -- when (null $ eCsources ++ lCsources) $ do -- put "# no useful debuginfo for Haskell packages without C sources" - -- putDef "debug_package" "%{nil}" + -- put $ "%global debug_package" +-+ "%{nil}" -- putNewline defRelease <- defaultRelease cabalPath distro @@ -190,6 +205,8 @@ revision = show $ maybe (0::Int) read (lookup "x-revision" (customFieldsPD pkgDesc)) putHdr "Name" (if binlib then "%{pkg_name}" else basename) putHdr "Version" version + when hasSubpkgs $ + put "# can only be reset when all subpkgs bumped" putHdr "Release" $ release ++ (if distro == SUSE then [] else "%{?dist}") putHdr "Summary" summary case distro of @@ -199,25 +216,26 @@ _ -> return () putNewline putHdr "License" $ (showLicense distro . license) pkgDesc - putHdr "Url" $ "https://hackage.haskell.org/package/" ++ pkg_name - putHdr "Source0" $ "https://hackage.haskell.org/package/" ++ pkg_name ++ "-%{version}/" ++ pkg_name ++ "-%{version}.tar.gz" + putHdr "Url" $ "https://hackage.haskell.org/package" </> pkg_name + putHdr "Source0" $ sourceUrl pkgver + mapM_ (\ (n,p) -> putHdr ("Source" ++ n) (sourceUrl p)) $ number subpackages when (revision /= "0") $ if distro == SUSE - then putHdr "Source1" $ "https://hackage.haskell.org/package/" ++ pkg_name ++ "-%{version}/revision/" ++ revision ++ ".cabal#/" ++ pkg_name ++ ".cabal" + then putHdr "Source1" $ "https://hackage.haskell.org/package" </> pkgver </> "revision" </> revision ++ ".cabal#" </> pkg_name ++ ".cabal" else putStrLn "Warning: this is a revised .cabal file" case distro of Fedora -> return () _ -> putHdr "BuildRoot" "%{_tmppath}/%{name}-%{version}-build" putNewline putHdr "BuildRequires" "ghc-Cabal-devel" - putHdr "BuildRequires" "ghc-rpm-macros" + putHdr "BuildRequires" $ "ghc-rpm-macros" ++ (if hasSubpkgs then "-extra" else "") let isa = if distro == SUSE then "" else "%{?_isa}" let alldeps = sort $ deps ++ tools ++ map (++ isa) clibs ++ pkgcfgs let extraTestDeps = sort $ testsuiteDeps \\ deps unless (null $ alldeps ++ extraTestDeps) $ do put "# Begin cabal-rpm deps:" - mapM_ (putHdr "BuildRequires") alldeps + mapM_ (\ d -> (if d `elem` missing then putHdrComment else putHdr) "BuildRequires" d) alldeps -- for ghc < 7.8 when (distro `notElem` [Fedora, SUSE] && any (\ d -> d `elem` map showDep ["template-haskell", "hamlet"]) deps) $ @@ -236,8 +254,11 @@ let wrapGenDesc = wordwrap (79 - max 0 (length pkgname - length pkg_name)) + let exposesModules = + hasLib && (notNull . exposedModules . fromJust . library) pkgDesc + when hasLib $ do - when binlib $ do + when (binlib && exposesModules) $ do put $ "%package" +-+ ghcPkg putHdr "Summary" $ "Haskell" +-+ pkg_name +-+ "library" case distro of @@ -259,23 +280,38 @@ putHdr "Requires" "ghc-compiler = %{ghc_version}" putHdr "Requires(post)" "ghc-compiler = %{ghc_version}" putHdr "Requires(postun)" "ghc-compiler = %{ghc_version}" - putHdr "Requires" $ (if binlib then "ghc-%{name}" else "%{name}") ++ isa +-+ "= %{version}-%{release}" + when exposesModules $ + putHdr "Requires" $ (if binlib then "ghc-%{name}" else "%{name}") ++ isa +-+ "= %{version}-%{release}" unless (null $ clibs ++ pkgcfgs) $ do put "# Begin cabal-rpm deps:" - mapM_ (putHdr "Requires") $ sort $ map (++ isa) clibs ++ pkgcfgs ++ ["pkgconfig" | distro == SUSE, not $ null pkgcfgs] + mapM_ (putHdr "Requires") $ sort $ map (++ isa) clibs ++ pkgcfgs ++ ["pkgconfig" | distro == SUSE, notNull pkgcfgs] put "# End cabal-rpm deps" putNewline put $ "%description" +-+ ghcPkgDevel put $ wrapGenDesc $ "This package provides the Haskell" +-+ pkg_name +-+ "library development files." + -- previous line ends in an extra newline putNewline + when hasSubpkgs $ do + put "%global main_version %{version}" + putNewline + put "%if %{defined ghclibdir}" + mapM_ (\p -> put $ "%ghc_lib_subpackage" +-+ p) subpackages + put "%endif" + putNewline + put "%global version %{main_version}" + sectionNewline + put "%prep" - put $ "%setup -q" ++ (if pkgname /= name then " -n %{pkg_name}-%{version}" else "") + put $ "%setup -q" ++ (if pkgname /= name then " -n" +-+ pkgver else "") +-+ + (if hasSubpkgs then unwords (map (("-a" ++) . fst) $ number subpackages) else "") when (distro == SUSE && revision /= "0") $ put $ "cp -p %{SOURCE1}" +-+ pkg_name ++ ".cabal" sectionNewline put "%build" + when hasSubpkgs $ + put "%ghc_libs_build %{subpkgs}" when (distro == SUSE && rpmConfigurationsFlags flags /= []) $ do let cabalFlags = [ "-f" ++ (if b then "" else "-") ++ n | (FlagName n, b) <- rpmConfigurationsFlags flags ] put $ "%define cabal_configure_options " ++ unwords cabalFlags @@ -284,11 +320,12 @@ sectionNewline put "%install" + when hasSubpkgs $ + put "%ghc_libs_install %{subpkgs}" put $ "%ghc_" ++ pkgType ++ "_install" - when selfdep $ do - putNewline - put $ "%ghc_fix_rpath" +-+ "%{pkg_name}-%{version}" + when selfdep $ + put $ "%ghc_fix_rpath" +-+ pkgver let licensefiles = #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,20,0) @@ -301,15 +338,22 @@ docs <- sort <$> findDocs cabalPath licensefiles let datafiles = dataFiles pkgDesc dupdocs = docs `intersect` datafiles + datafiles' = datafiles \\ dupdocs unless (null dupdocs) $ do putNewline putStrLn $ "Warning: doc files found in datadir:" +-+ unwords dupdocs unless (distro == SUSE) $ - put $ "rm %{buildroot}%{_datadir}/" ++ pkg_name ++ "-%{version}/" ++ + put $ "rm %{buildroot}%{_datadir}" </> pkgver </> case length dupdocs of 1 -> head dupdocs _ -> "{" ++ intercalate "," dupdocs ++ "}" + when (hasLib && not exposesModules) $ + put "mv %{buildroot}%{_ghcdocdir}{,-devel}" + + when selfdep $ + put "mv %{buildroot}%{_ghcdocdir}/{,ghc-}%{name}" + sectionNewline unless (null testsuiteDeps) $ do @@ -337,29 +381,32 @@ mapM_ (\ l -> put $ license_macro +-+ l) licensefiles unless (null docs) $ put $ "%doc" +-+ unwords docs - mapM_ (\ p -> put $ "%{_bindir}/" ++ (if p == name then "%{name}" else p)) execs - unless (null datafiles) $ - put $ "%{_datadir}/" ++ pkg_name ++ "-%{version}" + mapM_ (\ p -> put $ "%{_bindir}" </> (if p == name then "%{name}" else p)) execs + when (notNull datafiles' && not selfdep) $ + put $ "%{_datadir}" </> pkgver sectionNewline when hasLib $ do let baseFiles = if binlib then "-f ghc-%{name}.files" else "-f %{name}.files" develFiles = if binlib then "-f ghc-%{name}-devel.files" else "-f %{name}-devel.files" - put $ "%files" +-+ ghcPkg +-+ baseFiles - when (distro /= Fedora) $ put "%defattr(-,root,root,-)" - mapM_ (\ l -> put $ license_macro +-+ l) licensefiles - when (distro == SUSE && not binlib) $ - mapM_ (\ p -> put $ "%{_bindir}/" ++ (if p == name then "%{pkg_name}" else p)) execs - unless (null datafiles || binlib) $ - put $ "%{_datadir}/" ++ pkg_name ++ "-%{version}" - sectionNewline + when exposesModules $ do + put $ "%files" +-+ ghcPkg +-+ baseFiles + when (distro /= Fedora) $ put "%defattr(-,root,root,-)" + mapM_ (\ l -> put $ license_macro +-+ l) licensefiles + when (distro == SUSE && not binlib) $ + mapM_ (\ p -> put $ "%{_bindir}" </> (if p == name then "%{pkg_name}" else p)) execs + when (notNull datafiles' && (selfdep || not binlib)) $ + put $ "%{_datadir}" </> pkgver + sectionNewline put $ "%files" +-+ ghcPkgDevel +-+ develFiles when (distro /= Fedora) $ put "%defattr(-,root,root,-)" + unless exposesModules $ + mapM_ (\ l -> put $ license_macro +-+ l) licensefiles unless (null docs) $ put $ "%doc" +-+ unwords docs when (distro /= SUSE && not binlib) $ - mapM_ (\ p -> put $ "%{_bindir}/" ++ (if p == name then "%{pkg_name}" else p)) execs + mapM_ (\ p -> put $ "%{_bindir}" </> (if p == name then "%{pkg_name}" else p)) execs sectionNewline put "%changelog" @@ -433,6 +480,9 @@ showLicense _ UnspecifiedLicense = "Unspecified license!" #endif +sourceUrl :: String -> String +sourceUrl pv = "https://hackage.haskell.org/package" </> pv </> pv ++ ".tar.gz" + -- http://rosettacode.org/wiki/Word_wrap#Haskell wordwrap :: Int -> String -> String wordwrap maxlen = wrap_ 0 False . words @@ -454,4 +504,15 @@ -- from http://stackoverflow.com/questions/930675/functional-paragraphs -- using split would be: map unlines . (Data.List.Split.splitWhen null) paragraphs :: [String] -> [String] - paragraphs = map (unlines . filter (not . null)) . groupBy (const $ not . null) + paragraphs = map (unlines . filter notNull) . groupBy (const notNull) + +getsubpkgMacro :: String -> IO (String, String) +getsubpkgMacro pkg = do + let name = filter (/= '-') pkg + pkgver <- latestPackage pkg + let (n,v) = nameVersion pkgver + copyTarball n v False "." + return (name, pkgver) + +number :: [a] -> [(String,a)] +number = zip (map show [(1::Int)..]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cabal-rpm-0.11/src/Commands/Update.hs new/cabal-rpm-0.11.1/src/Commands/Update.hs --- old/cabal-rpm-0.11/src/Commands/Update.hs 2017-01-27 14:18:23.000000000 +0100 +++ new/cabal-rpm-0.11.1/src/Commands/Update.hs 2017-03-13 16:12:42.000000000 +0100 @@ -21,13 +21,14 @@ import FileUtils (withTempDirectory) import Options (RpmFlags (..)) import PackageUtils (PackageData (..), bringTarball, isGitDir, latestPackage, - packageName, packageVersion, prepare, removePrefix) -import SysCmd (cmd_, cmdBool, cmdIgnoreErr, (+-+)) + packageName, packageVersion, patchSpec, prepare, + removePrefix) +import SysCmd (cmd_, grep_, (+-+)) #if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,2)) #else import Control.Applicative ((<$>)) #endif -import Control.Monad (when) +import Control.Monad (unless, when) import Distribution.PackageDescription (PackageDescription (..)) import Distribution.Simple.Utils (die) import Data.Maybe (fromMaybe) @@ -47,24 +48,23 @@ Just pv -> return pv Nothing -> latestPackage name if current == latest - then error $ current +-+ "is already latest version." + then putStrLn $ current +-+ "is already latest version." else do bringTarball latest gitDir <- getCurrentDirectory >>= isGitDir - rwGit <- if gitDir then cmdBool "grep -q 'url = ssh://' .git/config" else return False + rwGit <- if gitDir then grep_ "url = ssh://" ".git/config" else return False when rwGit $ cmd_ "fedpkg" ["new-sources", latest ++ ".tar.gz"] withTempDirectory $ \cwd -> do curspec <- createSpecVersion current spec newspec <- createSpecVersion latest spec - patch <- cmdIgnoreErr "diff" ["-u2", "-I - spec file generated by cabal-rpm", "-I Fedora Haskell SIG <[email protected]>", curspec, newspec] "" - putStrLn patch - out <- cmdIgnoreErr "patch" ["-d", cwd, "-p1" ] patch - putStrLn out + patchSpec (Just cwd) curspec newspec setCurrentDirectory cwd distro <- fromMaybe detectDistro (return <$> rpmDistribution flags) let suffix = if distro == SUSE then "" else "%{?dist}" - cmd_ "sed" ["-i", "-e s/^\\(Release: \\).*/\\10" ++ suffix ++ "/", spec] + subpkg <- grep_ "%{subpkgs}" spec + unless (subpkg || rpmSubpackage flags) $ + cmd_ "sed" ["-i", "-e s/^\\(Release: \\).*/\\10" ++ suffix ++ "/", spec] let newver = removePrefix (name ++ "-") latest if distro == SUSE then cmd_ "sed" ["-i", "-e s/^\\(Version: \\).*/\\1" ++ newver ++ "/", spec] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cabal-rpm-0.11/src/Dependencies.hs new/cabal-rpm-0.11.1/src/Dependencies.hs --- old/cabal-rpm-0.11/src/Dependencies.hs 2017-01-27 14:18:23.000000000 +0100 +++ new/cabal-rpm-0.11.1/src/Dependencies.hs 2017-03-13 16:12:42.000000000 +0100 @@ -24,8 +24,8 @@ testsuiteDependencies ) where -import PackageUtils (packageName) -import SysCmd (cmd, cmdBool, repoquery, (+-+)) +import PackageUtils (packageName, repoquery) +import SysCmd (cmd, cmdBool, (+-+)) #if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,2)) #else @@ -152,7 +152,7 @@ notInstalled :: String -> IO Bool notInstalled dep = - fmap not $ cmdBool $ "rpm -q --whatprovides" +-+ shellQuote dep + not <$> cmdBool "rpm" ["-q", "--whatprovides", shellQuote dep] where shellQuote :: String -> String shellQuote (c:cs) = (if c `elem` "()" then (['\\', c] ++) else (c:)) (shellQuote cs) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cabal-rpm-0.11/src/Options.hs new/cabal-rpm-0.11.1/src/Options.hs --- old/cabal-rpm-0.11/src/Options.hs 2017-01-27 14:18:23.000000000 +0100 +++ new/cabal-rpm-0.11.1/src/Options.hs 2017-03-13 16:12:42.000000000 +0100 @@ -49,6 +49,7 @@ , rpmHelp :: Bool , rpmBinary :: Bool , rpmStrict :: Bool + , rpmSubpackage :: Bool , rpmRelease :: Maybe String , rpmCompilerId :: Maybe CompilerId , rpmDistribution :: Maybe Distro @@ -64,6 +65,7 @@ , rpmHelp = False , rpmBinary = False , rpmStrict = False + , rpmSubpackage = False , rpmRelease = Nothing , rpmCompilerId = Nothing , rpmDistribution = Nothing @@ -84,6 +86,8 @@ "Overwrite existing spec file." , Option "" ["strict"] (NoArg (\x -> x { rpmStrict = True })) "Fail rather than produce an incomplete spec file." + , Option "" ["subpackage"] (NoArg (\x -> x { rpmSubpackage = True })) + "Subpackage missing dependencies." , Option "V" ["version"] (NoArg (\x -> x { rpmVersion = True })) "Show version number" , Option "f" ["flags"] (ReqArg (\flags x -> x { rpmConfigurationsFlags = rpmConfigurationsFlags x ++ flagList flags }) "FLAGS") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cabal-rpm-0.11/src/PackageUtils.hs new/cabal-rpm-0.11.1/src/PackageUtils.hs --- old/cabal-rpm-0.11/src/PackageUtils.hs 2017-01-27 14:18:23.000000000 +0100 +++ new/cabal-rpm-0.11.1/src/PackageUtils.hs 2017-03-13 16:12:42.000000000 +0100 @@ -20,12 +20,17 @@ isGitDir, isScmDir, latestPackage, + nameVersion, PackageData (..), packageName, packageVersion, + patchSpec, + pkgInstall, prepare, removePrefix, + repoquery, rpmbuild, + rpmInstall, RpmStage (..), simplePackageDescription, stripPkgDevel @@ -34,7 +39,8 @@ import FileUtils (filesWithExtension, fileWithExtension, getDirectoryContents_, mktempdir) import Options (RpmFlags (..)) -import SysCmd (cmd, cmd_, cmdSilent, (+-+), optionalProgram) +import SysCmd (cmd, cmd_, cmdIgnoreErr, cmdMaybe, cmdSilent, (+-+), + notNull, optionalProgram, requireProgram, sudo, trySystem) #if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,2)) #else @@ -43,8 +49,8 @@ import Control.Monad (filterM, unless, when) import Data.Char (isDigit) -import Data.List (isPrefixOf, stripPrefix) -import Data.Maybe (fromMaybe, isJust) +import Data.List (isPrefixOf, stripPrefix, (\\)) +import Data.Maybe (fromMaybe, isJust, fromJust) import Data.Version (showVersion) import Distribution.Compiler @@ -57,20 +63,26 @@ import Distribution.Simple.Compiler ( #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,22,0) - compilerInfo + compilerInfo #else - Compiler (..) + Compiler (..) #endif - ) + ) import Distribution.Simple.Configure ( #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,18,0) - configCompilerEx + configCompilerEx #else - configCompiler + configCompiler #endif - ) + ) import Distribution.Simple.Program (defaultProgramConfiguration) -import Distribution.Simple.Utils (die, findPackageDesc) +import Distribution.Simple.Utils (die +#if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,20,0) + , tryFindPackageDesc +#else + , findPackageDesc +#endif + ) import Distribution.System (Platform (..), buildArch, buildOS) @@ -81,6 +93,7 @@ import System.FilePath ((</>), (<.>), takeBaseName, takeFileName) import System.Posix.Files (accessTime, fileMode, getFileStatus, modificationTime, setFileMode) +import System.Posix.User (getEffectiveUserID) -- returns path to .cabal file and possibly tmpdir to be removed --findCabalFile :: Verbosity -> FilePath -> IO (FilePath, Maybe FilePath) @@ -124,15 +137,10 @@ Left e -> die $ "finalize failed: " ++ show e Right (pd, _) -> return pd -findPackageDesc' :: FilePath -> IO FilePath #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,20,0) -findPackageDesc' pth = do - res <- findPackageDesc pth - case res of - Left err -> error err - Right cbl -> return cbl #else -findPackageDesc' = findPackageDesc +tryFindPackageDesc :: FilePath -> IO FilePath +tryFindPackageDesc = findPackageDesc #endif cabalFromSpec :: FilePath -> IO (FilePath, Maybe FilePath) @@ -147,13 +155,13 @@ when (specTime > dirTime) $ do bringTarball namever rpmbuild Prep True Nothing specFile - cabal <- findPackageDesc' namever + cabal <- tryFindPackageDesc namever return (cabal, Nothing) else do tmpdir <- mktempdir bringTarball namever rpmbuild Prep True (Just tmpdir) specFile - cabal <- findPackageDesc' $ tmpdir </> namever + cabal <- tryFindPackageDesc $ tmpdir </> namever return (cabal, Just tmpdir) bringTarball :: FilePath -> IO () @@ -217,14 +225,14 @@ isdir <- doesDirectoryExist pkgver if isdir then do - pth <- findPackageDesc' pkgver + pth <- tryFindPackageDesc pkgver return (pth, Nothing) else do cwd <- getCurrentDirectory tmpdir <- mktempdir setCurrentDirectory tmpdir cmd_ "cabal" ["unpack", "-v0", pkgver] - pth <- findPackageDesc' pkgver + pth <- tryFindPackageDesc pkgver setCurrentDirectory cwd return (tmpdir </> pth, Just tmpdir) @@ -257,13 +265,11 @@ haveStackage <- optionalProgram "stackage" if haveStackage then do - let stream = "nightly" - out <- cmd "stackage" ["list", stream, pkg] - if null out - then return Nothing - else do - putStrLn $ out +-+ "in Stackage" +-+ stream - return $ Just out + let stream = "lts" + mpkg <- cmdMaybe "stackage" ["list", stream, pkg] + when (isJust mpkg) $ + putStrLn $ fromJust mpkg +-+ "in Stackage" +-+ stream + return mpkg else return Nothing packageName :: PackageIdentifier -> String @@ -400,3 +406,64 @@ (cabal, mtmp) <- tryUnpack pkgmver pkgDesc <- simplePackageDescription cabal flags return $ PackageData Nothing cabal pkgDesc mtmp + +patchSpec :: Maybe FilePath -> FilePath -> FilePath -> IO () +patchSpec mdir oldspec newspec = do + diff <- cmdIgnoreErr "diff" ["-u2", "-I", "- spec file generated by cabal-rpm", "-I", "Fedora Haskell SIG <[email protected]>", oldspec, newspec] "" >>= cmdIgnoreErr "sed" ["-e", "s/.cblrpm//"] + putStrLn diff + out <- cmdIgnoreErr "patch" opts diff + putStrLn out + where + opts = maybe [] (\ d -> ["-d", d, "-p1" ]) mdir + +packageManager :: IO String +packageManager = do + havednf <- optionalProgram "dnf" + if havednf + then return "dnf" + else requireProgram "yum" >> return "yum" + +repoquery :: [String] -> String -> IO String +repoquery args key = do + havednf <- optionalProgram "dnf" + let (prog, subcmd) = if havednf then ("dnf", ["repoquery", "-q"]) else ("repoquery", []) + cmd prog (subcmd ++ args ++ [key]) + +pkgInstall :: [String] -> Bool -> IO () +pkgInstall [] _ = return () +pkgInstall pkgs hard = do + pkginstaller <- packageManager + putStrLn $ "Running repoquery" +-+ unwords pkgs + repopkgs <- filter (/= "") <$> mapM (repoquery ["--qf", "%{name}"]) pkgs + let missing = pkgs \\ repopkgs + if notNull missing && hard + then error $ unwords missing +-+ "not available." + else do + unless (null missing) $ do + putStrLn "Unavailable dependencies:" + mapM_ putStrLn missing + unless (null repopkgs) $ do + putStrLn "Uninstalled dependencies:" + mapM_ putStrLn repopkgs + uid <- getEffectiveUserID + maybeSudo <- + if uid == 0 + then return Nothing + else do + havesudo <- optionalProgram "sudo" + return $ if havesudo then Just "sudo" else Nothing + let args = map showPkg repopkgs + putStrLn $ "Running:" +-+ fromMaybe "" maybeSudo +-+ pkginstaller +-+ "install" +-+ unwords args + let exec = if hard then cmd_ else trySystem + fedora <- cmd "rpm" ["--eval", "%fedora"] + let nogpgcheck = ["--nogpgcheck" | fedora `elem` ["22", "23"]] + exec (fromMaybe pkginstaller maybeSudo) $ maybe [] (const pkginstaller) maybeSudo : "install" : args ++ nogpgcheck + where + showPkg :: String -> String + showPkg p = if '(' `elem` p then show p else p + +rpmInstall :: [String] -> IO () +rpmInstall rpms = do + pkginstaller <- packageManager + let (inst, arg) = if pkginstaller == "dnf" then ("dnf", "install") else ("yum", "localinstall") + sudo inst $ ["-y", arg] ++ rpms diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/cabal-rpm-0.11/src/SysCmd.hs new/cabal-rpm-0.11.1/src/SysCmd.hs --- old/cabal-rpm-0.11/src/SysCmd.hs 2017-01-27 14:18:23.000000000 +0100 +++ new/cabal-rpm-0.11.1/src/SysCmd.hs 2017-03-13 16:12:42.000000000 +0100 @@ -19,12 +19,13 @@ cmd_, cmdBool, cmdIgnoreErr, + cmdMaybe, cmdQuiet, cmdSilent, + grep_, + notNull, optionalProgram, - pkgInstall, - repoquery, - rpmInstall, + requireProgram, trySystem, shell, sudo, @@ -34,9 +35,8 @@ #else import Control.Applicative ((<$>)) #endif -import Control.Monad (unless, void, when) -import Data.List ((\\)) -import Data.Maybe (fromMaybe, isJust, isNothing) +import Control.Monad (void, when) +import Data.Maybe (isJust, isNothing) #if defined(MIN_VERSION_Cabal) && MIN_VERSION_Cabal(1,18,0) import Distribution.Simple.Program.Find (defaultProgramSearchPath, @@ -47,8 +47,7 @@ #endif import Distribution.Verbosity (normal) -import System.Posix.User (getEffectiveUserID) -import System.Process (readProcess, readProcessWithExitCode, system, rawSystem) +import System.Process (readProcess, readProcessWithExitCode, rawSystem) import System.Exit (ExitCode(..)) findProgram :: FilePath -> IO (Maybe FilePath) @@ -104,21 +103,21 @@ shell c = cmd_ "sh" ["-c", c] sudo :: String -> [String] -> IO () -sudo c as = do +sudo c args = do requireProgram "sudo" requireProgram c - putStrLn $ "sudo" +-+ c +-+ unwords as - cmd_ "sudo" (c:as) + putStrLn $ "sudo" +-+ c +-+ unwords args + cmd_ "sudo" (c:args) trySystem :: String -> [String] -> IO () trySystem c args = do requireProgram c void $ rawSystem c args -cmdBool :: String -> IO Bool -cmdBool c = do - requireProgram $ head $ words c - ret <- system $ c +-+ ">/dev/null" +cmdBool :: String -> [String] -> IO Bool +cmdBool c args = do + requireProgram c + (ret, _out, _err) <- readProcessWithExitCode c args "" case ret of ExitSuccess -> return True ExitFailure _ -> return False @@ -133,6 +132,21 @@ (_exit, out, _err) <- readProcessWithExitCode c args input return out +cmdMaybe :: String -> [String] -> IO (Maybe String) +cmdMaybe c args = do + (ret, out, _err) <- readProcessWithExitCode c args "" + case ret of + ExitSuccess -> return $ Just $ removeTrailingNewline out + ExitFailure _ -> return Nothing + +-- grep :: String -> FilePath -> IO [String] +-- grep pat file = +-- lines <$> cmd "grep" [pat, file] + +grep_ :: String -> FilePath -> IO Bool +grep_ pat file = + cmdBool "grep" ["-q", pat, file] + removeTrailingNewline :: String -> String removeTrailingNewline "" = "" removeTrailingNewline str = @@ -144,56 +158,13 @@ (+-+) :: String -> String -> String "" +-+ s = s s +-+ "" = s +s +-+ t | last s == ' ' = s ++ t + | head t == ' ' = s ++ t s +-+ t = s ++ " " ++ t -packageManager :: IO String -packageManager = do - havednf <- optionalProgram "dnf" - if havednf - then return "dnf" - else requireProgram "yum" >> return "yum" - -repoquery :: [String] -> String -> IO String -repoquery args key = do - havednf <- optionalProgram "dnf" - let (prog, subcmd) = if havednf then ("dnf", ["repoquery", "-q"]) else ("repoquery", []) - cmd prog (subcmd ++ args ++ [key]) - -pkgInstall :: [String] -> Bool -> IO () -pkgInstall [] _ = return () -pkgInstall pkgs hard = do - pkginstaller <- packageManager - putStrLn $ "Running repoquery" +-+ unwords pkgs - repopkgs <- filter (/= "") <$> mapM (repoquery ["--qf", "%{name}"]) pkgs - let missing = pkgs \\ repopkgs - if not (null missing) && hard - then error $ unwords missing +-+ "not available." - else do - unless (null missing) $ do - putStrLn "Unavailable dependencies:" - mapM_ putStrLn missing - unless (null repopkgs) $ do - putStrLn "Uninstalled dependencies:" - mapM_ putStrLn repopkgs - uid <- getEffectiveUserID - maybeSudo <- - if uid == 0 - then return Nothing - else do - havesudo <- optionalProgram "sudo" - return $ if havesudo then Just "sudo" else Nothing - let args = map showPkg repopkgs - putStrLn $ "Running:" +-+ fromMaybe "" maybeSudo +-+ pkginstaller +-+ "install" +-+ unwords args - let exec = if hard then cmd_ else trySystem - fedora <- cmd "rpm" ["--eval", "%fedora"] - let nogpgcheck = ["--nogpgcheck" | fedora `elem` ["22", "23"]] - exec (fromMaybe pkginstaller maybeSudo) $ maybe [] (const pkginstaller) maybeSudo : "install" : args ++ nogpgcheck - -showPkg :: String -> String -showPkg p = if '(' `elem` p then show p else p - -rpmInstall :: [String] -> IO () -rpmInstall rpms = do - pkginstaller <- packageManager - let (inst, arg) = if pkginstaller == "dnf" then ("dnf", "install") else ("yum", "localinstall") - sudo inst $ ["-y", arg] ++ rpms +#if (defined(MIN_VERSION_base) && MIN_VERSION_base(4,8,2)) +notNull :: Foldable t => t a -> Bool +#else +notNull :: [a] -> Bool +#endif +notNull = not . null
