packages feed

cabal-rpm 0.8.1 → 0.8.2

raw patch · 5 files changed

+51/−46 lines, 5 filesdep +regex-compat

Dependencies added: regex-compat

Files

NEWS view
@@ -1,3 +1,14 @@+* 0.8.2 (2013-07-02)+- handle pkg-ver arg, and check cabal list is non-empty+- sort all generated deps+- use yum-builddep again to install deps+- copy tarball into cwd for rpmbuild+- warn about long synopsis rather than multiline+- wrap after end of sentence near end of line+- use _isa in requires ghc-<pkg>+- --version now outputs to stdout+- new --force flag to overwrite existing .spec file+ * 0.8.1 (2013-06-14) - word wrapping of descriptions - use generic description for shared subpackage
cabal-rpm.cabal view
@@ -1,11 +1,13 @@ Name:                cabal-rpm-Version:             0.8.1+Version:             0.8.2 Synopsis:            RPM package creator for Haskell Cabal-based packages Description:     This package generates RPM packages from Haskell Cabal packages.     .     Recent changes:     .+    * 0.8.2: wrap sentences at end of line, handle pkg-ver arg, sort deps +    .     * 0.8.1: word wrapping of descriptions     .     * 0.8.0: new simpler revised Fedora packaging; check external commands available@@ -40,6 +42,7 @@                    filepath,                    old-locale,                    process,+                   regex-compat,                    time,                    unix     Other-modules:
src/Distribution/Package/Rpm.hs view
@@ -19,7 +19,7 @@     ) where  --import Control.Exception (bracket)-import Control.Monad    (unless, void, when)+import Control.Monad    (unless, when) import Data.Char        (toLower) import Data.List        (groupBy, isPrefixOf, isSuffixOf, nub, sort) import Data.Maybe       (fromMaybe)@@ -42,14 +42,11 @@ import Distribution.Package.Rpm.Setup (RpmFlags (..)) import Distribution.Package.Rpm.Utils (trySystem, optionalSudo, (+-+)) -import System.Cmd (system)-import System.Directory (doesDirectoryExist, doesFileExist,+import System.Directory (copyFile, doesDirectoryExist, doesFileExist,                          getCurrentDirectory, getDirectoryContents)-import System.Exit (ExitCode(..)) import System.Environment (getEnv) import System.IO     (IOMode (..), hClose, hPutStrLn, openFile) import System.Locale (defaultTimeLocale)---import System.Process (runInteractiveCommand, waitForProcess) import System.FilePath (dropFileName) import System.FilePath.Posix ((</>)) @@ -64,17 +61,6 @@ --             setupMessage verbose "Running autoreconf" pkgDesc --             trySystem "autoreconf" -unlessSudo :: String -> String -> IO ()-unlessSudo tst act = do-    ret <- system tst-    case ret of-      ExitSuccess -> return ()-      ExitFailure _ -> void $ optionalSudo act--maybeInstall :: String -> IO ()-maybeInstall pkg = do-    unlessSudo ("rpm -q" +-+ pkg) ("yum install" +-+ pkg)- rpmBuild :: FilePath -> PackageDescription -> RpmFlags -> Bool -> IO () rpmBuild cabalPath pkgDesc flags binary = do --    let verbose = rpmVerbosity flags@@ -90,8 +76,7 @@     let pkg = package pkgDesc         name = packageName pkg     when binary $ do-        -- optionalSystem ("sudo yum-builddep" +-+ specFile)-        mapM_ maybeInstall $ map showDep $ buildDependencies pkgDesc [name]+      optionalSudo ("sudo yum-builddep" +-+ specFile)     cwd <- getCurrentDirectory     home <- getEnv "HOME"     let version = packageVersion pkg@@ -99,15 +84,13 @@         tarFile = name ++ "-" ++ version ++ ".tar.gz"         rpmCmd = if binary then "a" else "s"     tarFileExists <- doesFileExist tarFile-    srcdir <- if tarFileExists-                then return cwd-                else do-                     trySystem ("cabal fetch -v0 --no-dependencies" +-+ name ++ "-" ++ version)-                     return cachedir+    unless tarFileExists $ do+      trySystem ("cabal fetch -v0 --no-dependencies" +-+ name ++ "-" ++ version)+      copyFile (cachedir </> tarFile) (cwd </> tarFile)     trySystem ("rpmbuild -b" ++ rpmCmd +-+                      "--define \"_rpmdir" +-+ cwd ++ "\"" +-+                      "--define \"_srcrpmdir" +-+ cwd ++ "\"" +-+-                     "--define \"_sourcedir" +-+ srcdir ++ "\"" +-++                     "--define \"_sourcedir" +-+ cwd ++ "\"" +-+                      specFile)  defaultRelease :: UTCTime -> IO String@@ -166,7 +149,7 @@         isLib = hasLibs pkgDesc         isBinLib = isExec && isLib     specAlreadyExists <- doesFileExist specFile-    let specFilename = specFile ++ if specAlreadyExists then ".cblrpm" else ""+    let specFilename = specFile ++ if (not $ rpmForce flags) && specAlreadyExists then ".cblrpm" else ""     when specAlreadyExists $ putStrLn $ specFile +-+ "exists:" +-+ "creating" +-+ specFilename     h <- openFile specFilename WriteMode     let putHdr hdr val = hPutStrLn h (hdr ++ ":" ++ padding hdr ++ val)@@ -184,17 +167,17 @@     -- Some packages conflate the synopsis and description fields.  Ugh.     let syn = synopsis pkgDesc     when (null syn) $-      warn verbose "This package has no synopsis."+      warn verbose "this package has no synopsis."     let syn' = if (null syn)               then ("Haskell" +-+ name +-+ "package")               else (unwords $ lines syn)     let summary = rstrip (== '.') syn'-    when ((length . lines) syn > 1) $-      warn verbose "The synopsis for this package spans multiple lines."+    when ((length $ "Summary     : " ++ syn') > 79) $+      warn verbose "this package has a long synopsis."      let descr = description pkgDesc     when (null descr) $-      warn verbose "This package has no description."+      warn verbose "this package has no description."     let common_description = (formatParagraphs . lines . finalPeriod) $           if (null descr) then syn' else descr         finalPeriod cs = if (last cs == '.') then cs else cs ++ "."@@ -235,12 +218,10 @@      when (not . null $ deps ++ tools ++ clibs ++ pkgcfgs) $ do       put "# Begin cabal-rpm deps:"-      mapM_ (putHdr "BuildRequires") $ map showDep deps+      let pkgdeps = sort $ map showDep deps ++ tools ++ map (++ "-devel%{?_isa}") clibs ++ map showPkgCfg pkgcfgs+      mapM_ (putHdr "BuildRequires") pkgdeps       when (any (\ d -> elem d ["template-haskell", "hamlet"]) deps) $         putHdr "ExclusiveArch" "%{ghc_arches_with_ghci}"-      mapM_ (putHdr "BuildRequires") tools-      mapM_ (putHdr "BuildRequires") $ map (++ "-devel%{?_isa}") clibs-      mapM_ (putHdr "BuildRequires") $ map showPkgCfg pkgcfgs       put "# End cabal-rpm deps"      putNewline@@ -262,7 +243,7 @@       putHdr "Requires" "ghc-compiler = %{ghc_version}"       putHdr "Requires(post)" "ghc-compiler = %{ghc_version}"       putHdr "Requires(postun)" "ghc-compiler = %{ghc_version}"-      putHdr "Requires" $ (if isExec then "ghc-%{name}" else "%{name}") +-+ "= %{version}-%{release}"+      putHdr "Requires" $ (if isExec then "ghc-%{name}" else "%{name}") ++ "%{?_isa} = %{version}-%{release}"       when (not . null $ clibs ++ pkgcfgs) $ do         put "# Begin cabal-rpm deps:"         mapM_ (putHdr "Requires") $ map (++ "-devel%{?_isa}") clibs@@ -381,14 +362,16 @@  -- http://rosettacode.org/wiki/Word_wrap#Haskell wordwrap :: Int -> String -> String-wordwrap maxlen = (wrap_ 0) . words where-	wrap_ _ [] = "\n"-	wrap_ pos (w:ws)+wordwrap maxlen = (wrap_ 0 False) . words where+	wrap_ _ _ [] = "\n"+	wrap_ pos eos (w:ws) 		-- at line start: put down the word no matter what-		| pos == 0 = w ++ wrap_ (pos + lw) ws-		| pos + lw + 1 > maxlen = '\n':wrap_ 0 (w:ws)-		| otherwise = " " ++ w ++ wrap_ (pos + lw + 1) ws+		| pos == 0 = w ++ wrap_ (pos + lw) endp ws+		| pos + lw + 1 > maxlen - 9 && eos = '\n':wrap_ 0 endp (w:ws)+		| pos + lw + 1 > maxlen = '\n':wrap_ 0 endp (w:ws)+		| otherwise = " " ++ w ++ wrap_ (pos + lw + 1) endp ws 		where lw = length w+                      endp = last w == '.'  formatParagraphs :: [String] -> [String] formatParagraphs = map (wordwrap 79) . paragraphs
src/Distribution/Package/Rpm/Main.hs view
@@ -29,11 +29,14 @@ import Distribution.Simple.Utils (defaultPackageDesc, die, findPackageDesc) import Distribution.System            (Platform (..), buildArch, buildOS) import Data.List (isSuffixOf)+import Data.Maybe (isJust) import System.Directory (doesDirectoryExist, doesFileExist, getCurrentDirectory,                          removeDirectoryRecursive, setCurrentDirectory) import System.Environment (getArgs) import System.FilePath.Posix (takeExtension) +import Text.Regex (matchRegex, mkRegex)+ main :: IO () main = do (opts, args) <- getArgs >>= parseArgs           let verbosity = rpmVerbosity opts@@ -80,7 +83,7 @@     else do       isfile <- doesFileExist path       if not isfile-        then if (all (\ p -> p `notElem` path) "/.")+        then if (isJust $ matchRegex pkg_re path)              then do                tryUnpack path              else error $ path ++ ": No such file or directory"@@ -94,14 +97,16 @@                     file <- findPackageDesc $ tmpdir ++ "/" ++ init subdir                     return (file, Just tmpdir)                   else error $ path ++ ": file should be a .cabal or .tar.gz file."-+  where pkg_re = mkRegex "^([A-Za-z0-9-]+)(-([0-9.]+))?$" tryUnpack :: String -> IO (FilePath, Maybe FilePath) tryUnpack pkg = do   pkgver <- if elem '.' pkg then return pkg             else do               contains_pkg <- tryReadProcess "cabal" ["list", "--simple-output", pkg]               let pkgs = filter ((== pkg) . fst . break (== ' ')) $ lines contains_pkg-              return $ map (\c -> if c == ' ' then '-' else c) $ last pkgs+              if (null pkgs)+                then error $ pkg ++ " hackage not found"+                else return $ map (\c -> if c == ' ' then '-' else c) $ last pkgs   isdir <- doesDirectoryExist pkgver   if isdir     then do
src/Distribution/Package/Rpm/Setup.hs view
@@ -36,6 +36,7 @@  data RpmFlags = RpmFlags     { rpmConfigurationsFlags :: [(FlagName, Bool)]+    , rpmForce               :: Bool     , rpmHelp                :: Bool     , rpmLibrary             :: Bool     , rpmRelease             :: Maybe String@@ -45,9 +46,9 @@     deriving (Eq, Show)  emptyRpmFlags :: RpmFlags- emptyRpmFlags = RpmFlags     { rpmConfigurationsFlags = []+    , rpmForce = False     , rpmHelp = False     , rpmLibrary = False     , rpmRelease = Nothing@@ -65,6 +66,8 @@              "Force package to be a Library ignoring executables",       Option "f" ["flags"] (ReqArg (\flags x -> x { rpmConfigurationsFlags = rpmConfigurationsFlags x ++ flagList flags }) "FLAGS")              "Set given flags in Cabal conditionals",+      Option "" ["force"] (NoArg (\x -> x { rpmForce = True }))+             "Overwrite existing spec file.",       Option "" ["release"] (ReqArg (\rel x -> x { rpmRelease = Just rel }) "RELEASE")              "Override the default package release",       Option "v" ["verbose"] (ReqArg (\verb x -> x { rpmVerbosity = readEOrFail flagToVerbosity verb }) "n")@@ -103,7 +106,7 @@        printHelp stdout        exitSuccess      when (rpmVersion opts) $ do-       hPutStrLn stderr $ "Version " ++ (showVersion version)+       hPutStrLn stdout $ showVersion version        exitSuccess      unless (null errs) $ do        hPutStrLn stderr "Error:"