cabal-rpm 0.8.9 → 0.8.10
raw patch · 15 files changed
+219/−197 lines, 15 files
Files
- ChangeLog +6/−1
- cabal-rpm.cabal +9/−3
- cblrpm-diff +0/−66
- man/cblrpm.1 +3/−4
- man/cblrpm.1.md +2/−3
- src/Commands/Depends.hs +14/−10
- src/Commands/Diff.hs +45/−0
- src/Commands/Install.hs +7/−21
- src/Commands/RpmBuild.hs +12/−25
- src/Commands/Spec.hs +8/−11
- src/FileUtils.hs +53/−0
- src/Main.hs +27/−38
- src/PackageUtils.hs +19/−4
- src/Setup.hs +13/−11
- src/SysCmd.hs +1/−0
ChangeLog view
@@ -1,5 +1,10 @@+* 0.8.10 (2014-03-03)+- diff command replaces cblrpm-diff script+- new missingdeps command+- replace use of rpmspec: no "rpmspec --srpm" on RHEL 5 and 6+ * 0.8.9 (2014-02-10)-- bugfix for handling dir with spec file+- bugfix for error handling dir with spec file - cblrpm-diff arg is now optional * 0.8.8 (2014-02-09)
cabal-rpm.cabal view
@@ -1,6 +1,6 @@ Name: cabal-rpm-Version: 0.8.9-Synopsis: RPM package creator for Haskell Cabal-based packages+Version: 0.8.10+Synopsis: RPM packaging tool for Haskell Cabal-based packages Description: This package generates RPM packages from Haskell Cabal packages. .@@ -19,6 +19,10 @@ * cblrpm depends: list hackage dependencies . * cblrpm requires: list package dependencies+ .+ * cblrpm missingdeps: list uninstalled dependencies+ .+ * cblrpm diff: diff of current spec file with newly generated one Homepage: https://github.com/juhp/cabal-rpm Bug-reports: https://github.com/juhp/cabal-rpm/issues License: GPL-3@@ -29,7 +33,7 @@ 2012-2014 Jens Petersen <petersen@fedoraproject.org> Category: Distribution Build-type: Simple-Extra-source-files: README.md ChangeLog man/cblrpm.1.md man/cblrpm.1 cblrpm-diff+Extra-source-files: README.md ChangeLog man/cblrpm.1.md man/cblrpm.1 Cabal-version: >=1.6 source-repository head@@ -49,10 +53,12 @@ unix Other-modules: Commands.Depends,+ Commands.Diff, Commands.Install, Commands.RpmBuild, Commands.Spec, Dependencies,+ FileUtils, PackageUtils, Setup, SysCmd
− cblrpm-diff
@@ -1,66 +0,0 @@-#!/bin/sh--# Copyright (C) 2008-2013 Red Hat, Inc-# Author: Jens Petersen <petersen@redhat.com>-#-# This program is free software: you can redistribute it and/or modify-# it under the terms of the GNU General Public License as published by-# the Free Software Foundation, either version 3 of the License, or-# (at your option) any later version.-#-# This program is distributed in the hope that it will be useful,-# but WITHOUT ANY WARRANTY; without even the implied warranty of-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the-# GNU General Public License for more details.-#-# You should have received a copy of the GNU General Public License-# along with this program. If not, see <http://www.gnu.org/licenses/>.--set -e--# use -l to force lib package-if getopts l opt; then- shift- case $opt in- l) FORCE_LIB=-l- ;;- h)- echo "Usage: $(basename $0) [-l] [hackage|hackage.tar.gz|hackage.cabal|pkg.spec]"- echo " -l assume BinLib package is Lib"- exit- ;;- esac-fi--case $0 in- /*) CBLRPM=$(dirname $0)/dist/build/cblrpm/cblrpm ;;- *) CBLRPM=cblrpm ;;-esac--PKG=$1--WORKDIR=$(mktemp --tmpdir=. -d)--cd $WORKDIR--if [ -n "$PKG" -a ! -r ../$PKG ]; then- $CBLRPM -v0 $FORCE_LIB spec $PKG-elif ! $CBLRPM -v0 $FORCE_LIB spec ../$PKG; then- cd ..- rm -r $WORKDIR- exit 1-fi--SPECFILE=$(ls *.spec)--cd ..--if [ ! -r "$SPECFILE" ]; then- echo "No $SPECFILE file found in current directory"- rm -r $WORKDIR- exit 1-fi--diff -uw $WORKDIR/$SPECFILE $SPECFILE | sed -e "s%$WORKDIR/$SPECFILE%$SPECFILE.cblrpm%"--[ -d "$WORKDIR" ] && rm -r $WORKDIR
man/cblrpm.1 view
@@ -11,7 +11,9 @@ [\f[I]options\f[]] builddep [\f[I]path\-or\-pkg\f[]] cblrpm [\f[I]options\f[]] install [\f[I]path\-or\-pkg\f[]] cblrpm [\f[I]options\f[]] depends [\f[I]path\-or\-pkg\f[]] cblrpm-[\f[I]options\f[]] requires [\f[I]path\-or\-pkg\f[]]+[\f[I]options\f[]] requires [\f[I]path\-or\-pkg\f[]] cblrpm+[\f[I]options\f[]] missingdeps [\f[I]path\-or\-pkg\f[]] cblrpm+[\f[I]options\f[]] diff [\f[I]path\-or\-pkg\f[]] .SH DESCRIPTION .PP cblrpm generates RPM packages and .spec files from Haskell Cabal@@ -33,9 +35,6 @@ generate a .spec file that can be built. .PP If a .spec already exists, cblrpm output to .spec.cblrpm instead.-.PP-The cblrpm\-diff command can be used in the same way to output a diff of-.spec and .spec.cblrpm directly. .SH OPTIONS .TP .B \-h, \-\-help
man/cblrpm.1.md view
@@ -14,6 +14,8 @@ cblrpm [*options*] install [*path-or-pkg*] cblrpm [*options*] depends [*path-or-pkg*] cblrpm [*options*] requires [*path-or-pkg*]+cblrpm [*options*] missingdeps [*path-or-pkg*]+cblrpm [*options*] diff [*path-or-pkg*] # DESCRIPTION cblrpm generates RPM packages and .spec files from Haskell Cabal package.@@ -30,9 +32,6 @@ uses it to generate a .spec file that can be built. If a <PKG>.spec already exists, cblrpm output to <PKG>.spec.cblrpm instead.--The cblrpm-diff command can be used in the same way to output a diff-of <PKG>.spec and <PKG>.spec.cblrpm directly. # OPTIONS -h, --help
src/Commands/Depends.hs view
@@ -14,29 +14,33 @@ module Commands.Depends ( depends,+ missingDeps, requires ) where import Dependencies (dependencies, packageDependencies )-import PackageUtils (packageName, simplePackageDescription)-import Setup (RpmFlags (..))+import PackageUtils (missingPackages, packageName) import Data.List (sort)-import Distribution.PackageDescription (GenericPackageDescription (..),- PackageDescription (..))+import Distribution.PackageDescription (PackageDescription (..)) -depends :: GenericPackageDescription -> RpmFlags -> IO ()-depends genPkgDesc flags = do- pkgDesc <- simplePackageDescription genPkgDesc flags+depends :: PackageDescription -> IO ()+depends pkgDesc = do let pkg = package pkgDesc name = packageName pkg (deps, tools, clibs, pkgcfgs, _) <- dependencies pkgDesc name mapM_ putStrLn $ deps ++ tools ++ clibs ++ pkgcfgs -requires :: GenericPackageDescription -> RpmFlags -> IO ()-requires genPkgDesc flags = do- pkgDesc <- simplePackageDescription genPkgDesc flags+requires :: PackageDescription -> IO ()+requires pkgDesc = do let pkg = package pkgDesc name = packageName pkg (deps, tools, clibs, pkgcfgs, _) <- packageDependencies pkgDesc name mapM_ putStrLn $ sort $ deps ++ tools ++ clibs ++ pkgcfgs++missingDeps :: PackageDescription -> IO ()+missingDeps pkgDesc = do+ let pkg = package pkgDesc+ name = packageName pkg+ missing <- missingPackages pkgDesc name+ mapM_ putStrLn missing
+ src/Commands/Diff.hs view
@@ -0,0 +1,45 @@+-- |+-- Module : Commands.Diff+-- Copyright : (C) 2014 Jens Petersen+--+-- Maintainer : Jens Petersen <petersen@fedoraproject.org>+-- Stability : alpha+-- Portability : portable+--+-- Explanation: diff current spec file with cblrpm spec output++-- This program is free software: you can redistribute it and/or modify+-- it under the terms of the GNU General Public License as published by+-- the Free Software Foundation, either version 3 of the License, or+-- (at your option) any later version.++module Commands.Diff (+ diff+ ) where++import Commands.Spec (createSpecFile)+import FileUtils (fileWithExtension, mktempdir)+import Setup (RpmFlags (..))+import SysCmd ((+-+), trySystem)++import Control.Applicative ((<$>))+import Data.Maybe (fromJust)+import Distribution.PackageDescription (PackageDescription (..))+import Distribution.Simple.Utils (die)++import System.Directory (removeDirectoryRecursive)++diff :: FilePath -- ^cabal path+ -> PackageDescription -- ^pkg description+ -> RpmFlags -- ^rpm flags+ -> IO ()+diff cabalPath pkgDesc flags = do+ mspcfile <- fileWithExtension "." ".spec"+ case mspcfile of+ Nothing -> die "No (unique) .spec file in directory."+ Just spec -> do+ tmpdir <- mktempdir+ createSpecFile cabalPath pkgDesc flags (Just tmpdir)+ speccblrpm <- fromJust <$> fileWithExtension tmpdir ".spec"+ trySystem $ "diff" +-+ "-u" +-+ spec +-+ speccblrpm +-+ "| sed -e s%" ++ speccblrpm ++ "%" ++ spec ++ ".cblrpm" ++ "%"+ removeDirectoryRecursive tmpdir
src/Commands/Install.hs view
@@ -17,33 +17,19 @@ install ) where -import Dependencies (dependencies)-import PackageUtils (packageName, simplePackageDescription)-import Setup (RpmFlags (..))-import SysCmd (runSystem, systemBool, yumInstall, (+-+))--import Control.Monad (filterM, liftM)+import PackageUtils (missingPackages, packageName)+import SysCmd (runSystem, yumInstall) -import Distribution.PackageDescription (GenericPackageDescription (..),- PackageDescription (..))+import Distribution.PackageDescription (PackageDescription (..)) import System.Directory (setCurrentDirectory)-import System.FilePath.Posix (takeDirectory)+import System.FilePath (takeDirectory) -install :: FilePath -> GenericPackageDescription -> RpmFlags -> IO ()-install cabalPath genPkgDesc flags = do- pkgDesc <- simplePackageDescription genPkgDesc flags+install :: FilePath -> PackageDescription -> IO ()+install cabalPath pkgDesc = do let pkg = package pkgDesc name = packageName pkg- (deps, tools, clibs, pkgcfgs, _) <- dependencies pkgDesc name- missing <- filterM notInstalled $ deps ++ tools ++ clibs ++ pkgcfgs+ missing <- missingPackages pkgDesc name yumInstall missing False let pkgDir = takeDirectory cabalPath setCurrentDirectory pkgDir runSystem "cabal install"- where- notInstalled :: String -> IO Bool- notInstalled br =- liftM not $ systemBool $ "rpm -q --whatprovides" +-+ shellQuote br- shellQuote :: String -> String- shellQuote (c:cs) = (if c `elem` "()" then (['\\', c] ++) else (c:)) (shellQuote cs)- shellQuote "" = ""
src/Commands/RpmBuild.hs view
@@ -20,27 +20,22 @@ ) where import Commands.Spec (createSpecFile)-import PackageUtils (isScmDir, packageName, packageVersion,- simplePackageDescription)+import FileUtils (getDirectoryContents_)+import PackageUtils (isScmDir, missingPackages, packageName, packageVersion) import Setup (RpmFlags (..))-import SysCmd (runSystem, systemBool, tryReadProcess, yumInstall, (+-+))+import SysCmd (runSystem, yumInstall, (+-+)) --import Control.Exception (bracket)-import Control.Applicative ((<$>))-import Control.Monad (filterM, liftM, unless, when)--import Data.List (isPrefixOf)+import Control.Monad (filterM, unless, when) -import Distribution.PackageDescription (GenericPackageDescription (..),- PackageDescription (..),+import Distribution.PackageDescription (PackageDescription (..), hasExes) --import Distribution.Version (VersionRange, foldVersionRange') -import System.Directory (copyFile, doesFileExist,- getCurrentDirectory, getDirectoryContents)+import System.Directory (copyFile, doesFileExist, getCurrentDirectory) import System.Environment (getEnv)-import System.FilePath.Posix (takeDirectory, (</>))+import System.FilePath (takeDirectory, (</>)) -- autoreconf :: Verbosity -> PackageDescription -> IO () -- autoreconf verbose pkgDesc = do@@ -53,22 +48,20 @@ data RpmStage = Binary | Source | Prep | BuildDep deriving Eq -rpmBuild :: FilePath -> GenericPackageDescription -> RpmFlags -> RpmStage -> IO ()-rpmBuild cabalPath genPkgDesc flags stage = do+rpmBuild :: FilePath -> PackageDescription -> RpmFlags -> RpmStage -> IO ()+rpmBuild cabalPath pkgDesc flags stage = do -- let verbose = rpmVerbosity flags- pkgDesc <- simplePackageDescription genPkgDesc flags -- bracket (setFileCreationMask 0o022) setFileCreationMask $ \ _ -> do -- autoreconf verbose pkgDesc specFile <- specFileName pkgDesc flags specFileExists <- doesFileExist specFile if specFileExists then putStrLn $ "Using existing" +-+ specFile- else createSpecFile cabalPath genPkgDesc flags+ else createSpecFile cabalPath pkgDesc flags Nothing let pkg = package pkgDesc name = packageName pkg when (stage `elem` [Binary,BuildDep]) $ do- br_out <- tryReadProcess "rpmspec" ["-q", "--buildrequires", specFile]- missing <- filterM notInstalled $ lines br_out+ missing <- missingPackages pkgDesc name yumInstall missing True unless (stage == BuildDep) $ do@@ -95,12 +88,6 @@ "--define \"_sourcedir" +-+ cwd ++ "\"" +-+ specFile) where- notInstalled :: String -> IO Bool- notInstalled br =- liftM not $ systemBool $ "rpm -q --whatprovides" +-+ shellQuote br- shellQuote :: String -> String- shellQuote (c:cs) = (if c `elem` "()" then (['\\', c] ++) else (c:)) (shellQuote cs)- shellQuote "" = "" copyTarball :: String -> String -> Bool -> FilePath -> IO () copyTarball n v ranFetch dest = do let tarfile = n ++ "-" ++ v ++ ".tar.gz"@@ -109,7 +96,7 @@ home <- getEnv "HOME" let cacheparent = home </> ".cabal" </> "packages" tarpath = n </> v </> tarfile- remotes <- filter (not . isPrefixOf ".") <$> getDirectoryContents cacheparent+ remotes <- getDirectoryContents_ cacheparent let paths = map (\ repo -> cacheparent </> repo </> tarpath) remotes -- if more than one tarball, should maybe warn if they are different tarballs <- filterM doesFileExist paths
src/Commands/Spec.hs view
@@ -21,8 +21,7 @@ ) where import Dependencies (packageDependencies, showDep)-import PackageUtils (isScmDir, packageName, packageVersion,- simplePackageDescription)+import PackageUtils (isScmDir, packageName, packageVersion) import Setup (RpmFlags (..)) import SysCmd ((+-+)) @@ -40,16 +39,14 @@ import Distribution.Simple.Utils (notice, warn) import Distribution.PackageDescription (PackageDescription (..), exeName,- hasExes, hasLibs, withExe,- GenericPackageDescription (..))+ hasExes, hasLibs, withExe) --import Distribution.Version (VersionRange, foldVersionRange') - import System.Directory (doesFileExist, getDirectoryContents) import System.IO (IOMode (..), hClose, hPutStrLn, openFile) import System.Locale (defaultTimeLocale)-import System.FilePath (dropFileName, takeDirectory)+import System.FilePath (dropFileName, takeDirectory, (</>)) import qualified Paths_cabal_rpm (version) @@ -72,22 +69,22 @@ -- packageVersion :: PackageIdentifier -> String -- packageVersion pkg = (showVersion . pkgVersion) pkg -createSpecFile :: FilePath -- ^pkg spec file- -> GenericPackageDescription -- ^pkg description+createSpecFile :: FilePath -- ^pkg cabal file+ -> PackageDescription -- ^pkg description -> RpmFlags -- ^rpm flags+ -> Maybe FilePath -- ^optional destdir -> IO ()-createSpecFile cabalPath genPkgDesc flags = do+createSpecFile cabalPath pkgDesc flags mdest = do let verbose = rpmVerbosity flags now <- getCurrentTime defRelease <- defaultRelease cabalPath now- pkgDesc <- simplePackageDescription genPkgDesc flags let pkg = package pkgDesc name = packageName pkg pkgname = if isExec then name else "ghc-" ++ name pkg_name = if isExec then "%{name}" else "%{pkg_name}" version = packageVersion pkg release = fromMaybe defRelease (rpmRelease flags)- specFile = pkgname ++ ".spec"+ specFile = (fromMaybe "" mdest) </> pkgname ++ ".spec" isExec = not (rpmLibrary flags) && hasExes pkgDesc isLib = hasLibs pkgDesc isBinLib = isExec && isLib
+ src/FileUtils.hs view
@@ -0,0 +1,53 @@+-- |+-- Module : FileUtils+-- Copyright : (C) 2014 Jens Petersen+--+-- Maintainer : Jens Petersen <petersen@fedoraproject.org>+-- Stability : alpha+-- Portability : portable+--+-- Explanation: Command line option processing for building RPM+-- packages.++-- This program is free software: you can redistribute it and/or modify+-- it under the terms of the GNU General Public License as published by+-- the Free Software Foundation, either version 3 of the License, or+-- (at your option) any later version.++module FileUtils (+ fileWithExtension,+ fileWithExtension_,+ getDirectoryContents_,+ mktempdir) where++import SysCmd (tryReadProcess)++import Control.Applicative ((<$>))+import Data.List (isPrefixOf)+import Data.Maybe (isJust)+import System.Directory (getDirectoryContents)+import System.FilePath (takeExtension, (</>))++-- looks in current dir for a unique file with given extension+fileWithExtension :: FilePath -> String -> IO (Maybe FilePath)+fileWithExtension dir ext = do+ files <- filter (\ f -> takeExtension f == ext) <$> getDirectoryContents dir+ case files of+ [file] -> return $ Just $ dir </> file+ [] -> return Nothing+ _ -> putStrLn ("More than one " ++ ext ++ " file found!") >> return Nothing++-- looks in current dir for a unique file with given extension+fileWithExtension_ :: FilePath -> String -> IO Bool+fileWithExtension_ dir ext =+ isJust <$> fileWithExtension dir ext++mktempdir :: IO FilePath+mktempdir = do+ mktempOut <- tryReadProcess "mktemp" ["-d"]+ return $ init mktempOut++-- getDirectoryContents without hidden files+getDirectoryContents_ :: FilePath -> IO [FilePath]+getDirectoryContents_ dir =+ filter (not . isPrefixOf ".") <$> getDirectoryContents dir
src/Main.hs view
@@ -16,25 +16,29 @@ module Main where -import Commands.Depends (depends, requires)+import Commands.Depends (depends, missingDeps, requires)+import Commands.Diff (diff) import Commands.Install (install) import Commands.RpmBuild (rpmBuild, RpmStage (..)) import Commands.Spec (createSpecFile)++import FileUtils (fileWithExtension, fileWithExtension_,+ getDirectoryContents_, mktempdir)+import PackageUtils (simplePackageDescription) import Setup (RpmFlags (..), parseArgs) import SysCmd (runSystem, tryReadProcess) import Control.Applicative ((<$>))-import Control.Monad (unless) import Data.List (isSuffixOf, stripPrefix) import Data.Maybe (isJust, listToMaybe, fromMaybe) import Distribution.PackageDescription.Parse (readPackageDescription) import Distribution.Simple.Utils (die, findPackageDesc)-import Distribution.Verbosity (Verbosity, silent)+import Distribution.Verbosity (Verbosity) import System.Directory (doesDirectoryExist, doesFileExist, getCurrentDirectory,- getDirectoryContents, removeDirectoryRecursive,+ removeDirectoryRecursive, setCurrentDirectory) import System.Environment (getArgs)-import System.FilePath.Posix (takeExtension, (</>))+import System.FilePath (takeExtension) import Text.Regex (matchRegex, mkRegex) @@ -42,17 +46,21 @@ main = do (opts, args) <- getArgs >>= parseArgs let verbose = rpmVerbosity opts (cmd:args') = args- (cabalPath, mtmp) <- findCabalFile verbose $ fromMaybe "." $ listToMaybe args'+ path = fromMaybe "." $ listToMaybe args'+ (cabalPath, mtmp) <- findCabalFile verbose path genPkgDesc <- readPackageDescription verbose cabalPath+ pkgDesc <- simplePackageDescription genPkgDesc opts case cmd of- "spec" -> createSpecFile cabalPath genPkgDesc opts- "srpm" -> rpmBuild cabalPath genPkgDesc opts Source- "prep" -> rpmBuild cabalPath genPkgDesc opts Prep- "rpm" -> rpmBuild cabalPath genPkgDesc opts Binary- "builddep" -> rpmBuild cabalPath genPkgDesc opts BuildDep- "install" -> install cabalPath genPkgDesc opts- "depends" -> depends genPkgDesc opts- "requires" -> requires genPkgDesc opts+ "spec" -> createSpecFile cabalPath pkgDesc opts Nothing+ "srpm" -> rpmBuild cabalPath pkgDesc opts Source+ "prep" -> rpmBuild cabalPath pkgDesc opts Prep+ "rpm" -> rpmBuild cabalPath pkgDesc opts Binary+ "builddep" -> rpmBuild cabalPath pkgDesc opts BuildDep+ "install" -> install cabalPath pkgDesc+ "depends" -> depends pkgDesc+ "requires" -> requires pkgDesc+ "missingdeps" -> missingDeps pkgDesc+ "diff" -> diff cabalPath pkgDesc opts c -> error $ "Unknown cmd: " ++ c maybe (return ()) removeDirectoryRecursive mtmp @@ -78,7 +86,6 @@ cblfile <- fileWithExtension_ path ".cabal" if cblfile then do- unless (vb == silent) $ putStrLn $ "trying " ++ path ++ "/" file <- findPackageDesc path return (file, Nothing) else do@@ -99,30 +106,17 @@ then do tmpdir <- mktempdir runSystem $ "tar zxf " ++ path ++ " -C " ++ tmpdir ++ " *.cabal"- subdir <- tryReadProcess "ls" [tmpdir]- file <- findPackageDesc $ tmpdir ++ "/" ++ init subdir+ subdir <- getDirectoryContents_ tmpdir+ file <- findPackageDesc $ tmpdir ++ "/" ++ head subdir return (file, Just tmpdir) else error $ path ++ ": file should be a .cabal, .spec or .tar.gz file." where pkg_re = mkRegex "^([A-Za-z0-9-]+)(-([0-9.]+))?$" --- looks in current dir for a unique file with given extension-fileWithExtension :: FilePath -> String -> IO (Maybe FilePath)-fileWithExtension dir ext = do- files <- filter (\ f -> takeExtension f == ext) <$> getDirectoryContents dir- case files of- [file] -> return $ Just $ dir </> file- [] -> return Nothing- _ -> putStrLn ("More than one " ++ ext ++ " file found!") >> return Nothing---- looks in current dir for a unique file with given extension-fileWithExtension_ :: FilePath -> String -> IO Bool-fileWithExtension_ dir ext =- isJust <$> fileWithExtension dir ext- cabalFromSpec :: Verbosity -> FilePath -> IO (FilePath, Maybe FilePath) cabalFromSpec vrb spcfile = do- namever <- removePrefix "ghc-" <$> tryReadProcess "rpmspec" ["-q", "--srpm", "--qf", "%{name}-%{version}", spcfile]- findCabalFile vrb namever+ -- no rpmspec command in RHEL 5 and 6+ namever <- removePrefix "ghc-" <$> tryReadProcess "rpm" ["-q", "--qf", "%{name}-%{version}\n", "--specfile", spcfile]+ findCabalFile vrb (head $ lines namever) removePrefix :: String -> String-> String removePrefix pref str =@@ -150,8 +144,3 @@ pth <- findPackageDesc pkgver setCurrentDirectory cwd return (tmpdir ++ "/" ++ pth, Just tmpdir)--mktempdir :: IO FilePath-mktempdir = do- mktempOut <- tryReadProcess "mktemp" ["-d"]- return $ init mktempOut
src/PackageUtils.hs view
@@ -15,17 +15,20 @@ module PackageUtils ( isScmDir,+ missingPackages, packageName, packageVersion, simplePackageDescription ) where +import Dependencies (packageDependencies) import Setup (RpmFlags (..))+import SysCmd (systemBool, (+-+)) +import Control.Monad (filterM, liftM) import Data.Version (showVersion) import Distribution.Compiler (CompilerFlavor (..))- import Distribution.Package (PackageIdentifier (..), PackageName (..)) import Distribution.PackageDescription (GenericPackageDescription (..),@@ -34,14 +37,13 @@ import Distribution.Simple.Compiler (Compiler (..)) import Distribution.Simple.Configure (configCompiler)---import qualified Distribution.Simple.PackageIndex as PackageIndex import Distribution.Simple.Program (defaultProgramConfiguration) import Distribution.Simple.Utils (die) -import Distribution.System (Platform (..), buildArch, buildOS)+import Distribution.System (Platform (..), buildArch, buildOS) import System.Directory (doesDirectoryExist)-import System.FilePath.Posix ((</>))+import System.FilePath ((</>)) simplePackageDescription :: GenericPackageDescription -> RpmFlags -> IO PackageDescription@@ -70,3 +72,16 @@ isScmDir :: FilePath -> IO Bool isScmDir dir = doesDirectoryExist (dir </> ".git") <||> doesDirectoryExist (dir </> "_darcs")++notInstalled :: String -> IO Bool+notInstalled br =+ liftM not $ systemBool $ "rpm -q --whatprovides" +-+ shellQuote br+ where+ shellQuote :: String -> String+ shellQuote (c:cs) = (if c `elem` "()" then (['\\', c] ++) else (c:)) (shellQuote cs)+ shellQuote "" = ""++missingPackages :: PackageDescription -> String -> IO [String]+missingPackages pkgDesc name = do+ (deps, tools, clibs, pkgcfgs, _) <- packageDependencies pkgDesc name+ filterM notInstalled $ deps ++ tools ++ clibs ++ pkgcfgs
src/Setup.hs view
@@ -91,22 +91,24 @@ let info = "Usage: " ++ progName ++ " [OPTION]... [COMMAND] [PKGDIR|PKG|PKG-VERSION|CABALFILE|TARBALL]\n" ++ "\n" ++ "Commands:\n"- ++ " spec\t generate a spec file\n"- ++ " srpm\t generate a src rpm file\n"- ++ " prep\t unpack source\n"- ++ " rpm\t build rpm package\n"- ++ " builddep install dependencies\n"- ++ " install user install package\n"- ++ " depends list Cabal depends\n"- ++ " requires list package buildrequires\n"--- ++ " mock\t mock build package\n"+ ++ " spec\t\t- generate a spec file\n"+ ++ " srpm\t\t- generate a src rpm file\n"+ ++ " prep\t\t- unpack source\n"+ ++ " rpm\t\t- build rpm package\n"+ ++ " builddep\t- install dependencies\n"+ ++ " install\t- user install package\n"+ ++ " depends\t- list Cabal depends\n"+ ++ " requires\t- list package buildrequires\n"+ ++ " missingdeps\t- list missing buildrequires\n"+ ++ " diff\t\t- diff current spec file\n"+-- ++ " mock\t\t- mock build package\n" ++ "\n" ++ "Options:" hPutStrLn h (usageInfo info options) parseArgs :: [String] -> IO (RpmFlags, [String]) parseArgs args = do- let (os, args', unknown, errs) = getOpt' RequireOrder options args+ let (os, args', unknown, errs) = getOpt' Permute options args opts = foldl (flip ($)) emptyRpmFlags os when (rpmHelp opts) $ do printHelp stdout@@ -122,7 +124,7 @@ hPutStr stderr "Unrecognised options: " hPutStrLn stderr $ unwords unknown exitWith (ExitFailure 1)- when (null args' || notElem (head args') ["builddep", "depends", "install", "prep", "requires", "spec", "srpm", "rpm"]) $ do+ when (null args' || notElem (head args') ["builddep", "depends", "diff", "install", "missingdeps", "prep", "requires", "spec", "srpm", "rpm"]) $ do printHelp stderr exitWith (ExitFailure 1) when (length args' > 2) $ do
src/SysCmd.hs view
@@ -18,6 +18,7 @@ requireProgram, runSystem, tryReadProcess,+ trySystem, systemBool, yumInstall, (+-+)) where