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 +11/−0
- cabal-rpm.cabal +4/−1
- src/Distribution/Package/Rpm.hs +23/−40
- src/Distribution/Package/Rpm/Main.hs +8/−3
- src/Distribution/Package/Rpm/Setup.hs +5/−2
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:"