rpmbuild-order 0.4.8 → 0.4.9
raw patch · 7 files changed
+103/−57 lines, 7 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Distribution.RPM.Build.Graph: depsGraph :: Bool -> [String] -> Bool -> [String] -> [String] -> Bool -> Maybe FilePath -> [FilePath] -> IO PackageGraph
+ Distribution.RPM.Build.Order: depsPackages :: Bool -> [String] -> Bool -> [String] -> [String] -> Bool -> Bool -> Maybe FilePath -> [FilePath] -> IO ()
Files
- ChangeLog.md +4/−0
- README.md +35/−9
- rpmbuild-order.1 +4/−4
- rpmbuild-order.cabal +4/−3
- src/Distribution/RPM/Build/Graph.hs +33/−11
- src/Distribution/RPM/Build/Order.hs +21/−2
- src/Main.hs +2/−28
ChangeLog.md view
@@ -1,3 +1,7 @@+# 0.4.9 (2022-08-XX)+- Graph rpmspecDynBuildRequires: error if no srpm generated+- Order: add depsPackages and factor out depsGraph to Graph+ # 0.4.8 (2022-06-14) - Graph createGraph4: prepend spec name to any rpmspec stderr - Graph optimization: filter out Provides ending in (x86-64)
README.md view
@@ -11,11 +11,33 @@ ## Usage - $ rpmbuild-order --help- :- $ rpmbuild-order sort mycore mylib myapp- mylib mycore myapp+```+$ rpmbuild-order --version+0.4.9+$ rpmbuild-order --help+Order packages by build dependencies +Usage: rpmbuild-order [--version] COMMAND+ Sort package sources (spec files) in build dependency order++Available options:+ -h,--help Show this help text+ --version Show version++Available commands:+ sort sort packages+ deps sort dependencies in neighbouring package dirs+ rdeps sort dependents in neighbouring package dirs+ layers ordered output of dependency layers+ chain ordered output suitable for a chain-build+ leaves List of the top leaves of package graph+ roots List lowest root packages+ render Show graph with graphviz++$ rpmbuild-order sort mycore mylib myapp+mylib mycore myapp+```+ The arguments passed can either be directories containing the package or spec files. @@ -25,21 +47,25 @@ Using the rpmbuild-order `deps` and `rdeps` commands the ordered dependencies and reverse dependencies of a package can be obtained within the current set of checked out package sources.+ie If you have a directory with packages:+`pkg1/ pkg2/ lib1/ lib2/ lib3/ misc1/`+then the output of `rpmbuild-order deps pkg1` might be `lib1 lib3 pkg1`+for example. The `render` command displays a graph of package dependencies-using graphviz and X11 or optionally instead prints the dot format to stdout.+using graphviz and X11 or can print the dot format to stdout. ## Library As of version 0.4, a library is also provided. There are two modules: +- `Distribution.RPM.Build.Order` provides higher level functions for+ sorting packages in build dependency orders and output. It is built on top of: - `Distribution.RPM.Build.Graph` provides lower level functions for generating RPM dependency graphs-- `Distribution.RPM.Build.Order` provides higher level functions for- sorting packages in build dependency orders and output. -Please see the documentation for more details.+Please see their documentation for more details. ## Notes and known problems 1. Given packages A, B, C, where C depends on B, and B depends on A,@@ -74,4 +100,4 @@ ## Building from source -Use `cabal-rpm builddep && cabal-install` or `stack install`.+Use `cabal-rpm builddep && cabal install` or `stack install`.
rpmbuild-order.1 view
@@ -1,7 +1,7 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.2.-.TH RPMBUILD-ORDER "1" "May 2022" "rpmbuild-order 0.4.7" "User Commands"+.TH RPMBUILD-ORDER "1" "August 2022" "rpmbuild-order 0.4.9" "User Commands" .SH NAME-rpmbuild-order \- manual page for rpmbuild-order 0.4.7+rpmbuild-order \- manual page for rpmbuild-order 0.4.9 .SH SYNOPSIS .B rpmbuild-order [\fI\,--version\/\fR] \fI\,COMMAND\/\fR@@ -22,10 +22,10 @@ sort packages .TP deps-sort dependencies+sort dependencies in neighbouring package dirs .TP rdeps-sort dependents+sort dependents in neighbouring package dirs .TP layers ordered output of dependency layers
rpmbuild-order.cabal view
@@ -1,5 +1,5 @@ Name: rpmbuild-order-Version: 0.4.8+Version: 0.4.9 License: BSD3 License-File: LICENSE Author: Jens Petersen <petersen@redhat.com>,@@ -18,11 +18,12 @@ build dependencies. The code evolved from cabal-sort by Henning Thielemann. It can also order the dependencies or reverse depends of one or more packages among the packages checked out in neighboring directories (which can be- useful to see what packages are affected when a low-level package changes).+ useful to see what packages are affected when a low-level package changes,+ or which packages are dependents of one of more packages). It also has support for setting RPM options for bcond etc, which can affect dependencies. It can also output dependency graphs. - Since version 0.4, a library API is also provided.+ Since version 0.4, a library API is provided. Tested-with: 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.7, GHC == 9.0.2
src/Distribution/RPM/Build/Graph.hs view
@@ -31,7 +31,8 @@ packageLeaves, separatePackages, printGraph,- renderGraph+ renderGraph,+ depsGraph ) where import qualified Data.CaseInsensitive as CI@@ -43,26 +44,24 @@ #if !MIN_VERSION_base(4,8,0) import Control.Applicative ((<$>)) #endif-import Control.Monad (forM_, guard, when, unless)+import Control.Monad.Extra (forM_, guard, when, unless, unlessM) import Data.Maybe (catMaybes, fromMaybe, mapMaybe) import Data.List.Extra import Data.GraphViz import SimpleCmd import System.Directory (doesDirectoryExist, doesFileExist, getCurrentDirectory, withCurrentDirectory,-#if !MIN_VERSION_simple_cmd(0,2,4) #if MIN_VERSION_directory(1,2,5) listDirectory #else getDirectoryContents #endif-#endif ) import System.Exit (exitFailure) import System.FilePath import System.IO.Extra (withTempDir) -#if !MIN_VERSION_directory(1,2,5) && !MIN_VERSION_simple_cmd(0,2,4)+#if !MIN_VERSION_directory(1,2,5) listDirectory :: FilePath -> IO [FilePath] listDirectory path = filter f <$> getDirectoryContents path@@ -308,7 +307,13 @@ filesWithExtension :: FilePath -> String -> IO [FilePath] filesWithExtension dir ext = filter (ext `isExtensionOf`) <$> listDirectory dir++#if !MIN_VERSION_filepath(1,4,2)+ isExtensionOf :: String -> FilePath -> Bool+ isExtensionOf ext@('.':_) = isSuffixOf ext . takeExtensions+ isExtensionOf ext = isSuffixOf ('.':ext) . takeExtensions #endif+#endif extractMetadata :: FilePath -> ([String],[String]) -> [String] -> ([String],[String]) extractMetadata _ acc [] = acc@@ -413,7 +418,9 @@ (out,err) <- cmdStdErr "rpmbuild" ["-br", "--nodeps", "--define", "_srcrpmdir " ++ tmpdir, cwd </> spec] unless (null err) $ when verbose $ warning err -- Wrote: /current/dir/SRPMS/name-version-release.buildreqs.nosrc.rpm- cmdLines "rpm" ["-qp", "--requires", last (words out)]+ case words out of+ [] -> error' $ spec +-+ "could not generate source rpm for dynamic buildrequires"+ ws -> cmdLines "rpm" ["-qp", "--requires", last ws] simplifyDep br = case (head . words) br of@@ -502,8 +509,23 @@ runGraphvizCanvas' (setDirectedness graphToDot quickParams g) Xlib else error' "please install graphviz first" -#if !MIN_VERSION_filepath(1,4,2)-isExtensionOf :: String -> FilePath -> Bool-isExtensionOf ext@('.':_) = isSuffixOf ext . takeExtensions-isExtensionOf ext = isSuffixOf ('.':ext) . takeExtensions-#endif+-- | Given a list of one or more packages, look for dependencies+-- in neighboring packages and return a package dependency graph+--+-- @since 0.4.9+depsGraph :: Bool -- ^ whether to look for reverse dependencies+ -> [String] -- ^ rpm options+ -> Bool -- ^ verbose output+ -> [String] -- ^ packages to exclude+ -> [String] -- ^ buildrequires to ignore+ -> Bool -- ^ allow rpmspec failures+ -> Maybe FilePath -- ^ subdir for packages+ -> [FilePath] -- ^ list of package paths+ -> IO PackageGraph -- ^ dependency graph of the packages+depsGraph rev rpmopts verbose excludedPkgs ignoredBRs lenient mdir pkgs = do+ unlessM (and <$> mapM doesDirectoryExist pkgs) $+ errorWithoutStackTrace "Please use package directory paths"+ listDirectory "." >>=+ -- filter out dotfiles+ createGraph3 ignoredBRs rpmopts verbose lenient (not rev) mdir . filter ((/= '.') . head) . filter (`notElem` excludedPkgs) >>=+ createGraph2 rpmopts verbose lenient True mdir . dependencyNodes pkgs
src/Distribution/RPM/Build/Order.hs view
@@ -23,7 +23,8 @@ leafPackages, independentPackages, Components (..),- sortGraph)+ sortGraph,+ depsPackages) where #if !MIN_VERSION_base(4,8,0)@@ -72,7 +73,7 @@ -- | Used to control the output from sortGraph data Components = Parallel -- ^ separate independent stacks | Combine -- ^ combine indepdendent stacks together- | Connected -- ^ only stack of pacakges+ | Connected -- ^ only stack of packages | Separate -- ^ only independent packages in the package set -- | output sorted packages from a PackageGraph arrange by Components@@ -87,3 +88,21 @@ Connected -> intercalate "\n\n" $ map (unwords . topsort' . subgraph' graph) $ filter ((>1) . length) (components graph) Separate -> unlines $ separatePackages graph++-- | Given a list of one or more packages, look for dependencies+-- in neighboring packages and output them in a topological order+--+-- @since 0.4.9+depsPackages :: Bool -- ^ whether to look for reverse dependencies+ -> [String] -- ^ rpm options+ -> Bool -- ^ verbose output+ -> [String] -- ^ packages to exclude+ -> [String] -- ^ buildrequires to ignore+ -> Bool -- ^ allow rpmspec failures+ -> Bool -- ^ parallel output+ -> Maybe FilePath -- ^ subdir for packages+ -> [FilePath] -- ^ list of package paths+ -> IO ()+depsPackages rev rpmopts verbose excludedPkgs ignoredBRs lenient parallel mdir pkgs =+ depsGraph rev rpmopts verbose excludedPkgs ignoredBRs lenient mdir pkgs >>=+ sortGraph (if parallel then Parallel else Combine)
src/Main.hs view
@@ -13,19 +13,11 @@ (<$>), (<*>) #endif )-import Control.Monad.Extra import Data.Graph.Inductive.Query.DFS (components) import Data.List (intercalate) import Data.List.Extra (dropSuffix) import SimpleCmdArgs-import System.Directory (doesDirectoryExist,-#if MIN_VERSION_directory(1,2,5)- listDirectory-#else- getDirectoryContents-#endif- ) import Distribution.RPM.Build.Graph import Distribution.RPM.Build.Order@@ -38,9 +30,9 @@ subcommands [ Subcommand "sort" "sort packages" $ sortPackages <$> rpmOpts <*> verboseOpt <*> lenientOpt <*> componentsOpt <*> subdirOpt <*> pkgArgs- , Subcommand "deps" "sort dependencies" $+ , Subcommand "deps" "sort dependencies in neighbouring package dirs" $ depsPackages False <$> rpmOpts <*> verboseOpt <*> excludeOpts <*> ignoredBRopts <*> lenientOpt <*> combineOpt <*> subdirOpt <*> pkgArgs- , Subcommand "rdeps" "sort dependents" $+ , Subcommand "rdeps" "sort dependents in neighbouring package dirs" $ depsPackages True <$> rpmOpts <*> verboseOpt <*> excludeOpts <*> ignoredBRopts <*> lenientOpt <*> combineOpt <*> subdirOpt <*> pkgArgs , Subcommand "layers" "ordered output of dependency layers" $ layerPackages <$> rpmOpts <*> verboseOpt <*> lenientOpt <*> combineOpt <*> subdirOpt <*> pkgArgs@@ -70,24 +62,6 @@ sortPackages :: [String] -> Bool -> Bool -> Components -> Maybe FilePath -> [FilePath] -> IO () sortPackages rpmopts verbose lenient opts mdir pkgs = do createGraph2 rpmopts verbose lenient True mdir pkgs >>= sortGraph opts--depsPackages :: Bool -> [String] -> Bool-> [String] -> [String] -> Bool -> Bool -> Maybe FilePath -> [FilePath] -> IO ()-depsPackages rev rpmopts verbose excludedPkgs ignoredBRs lenient parallel mdir pkgs = do- unlessM (and <$> mapM doesDirectoryExist pkgs) $- errorWithoutStackTrace "Please use package directory paths"- listDirectory "." >>=- -- filter out dotfiles- createGraph3 ignoredBRs rpmopts verbose lenient (not rev) mdir . filter ((/= '.') . head) . filter (`notElem` excludedPkgs) >>=- createGraph2 rpmopts verbose lenient True mdir . dependencyNodes pkgs >>=- sortGraph (if parallel then Parallel else Combine)--#if (defined(MIN_VERSION_directory) && MIN_VERSION_directory(1,2,5))-#else-listDirectory :: FilePath -> IO [FilePath]-listDirectory path =- filter f <$> getDirectoryContents path- where f filename = filename /= "." && filename /= ".."-#endif layerPackages :: [String] -> Bool -> Bool -> Bool -> Maybe FilePath -> [FilePath] -> IO () layerPackages rpmopts verbose lenient combine mdir pkgs = do