packages feed

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 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