rpmbuild-order 0.4.12 → 0.4.13
raw patch · 11 files changed
+72/−39 lines, 11 filesdep +safePVP ok
version bump matches the API change (PVP)
Dependencies added: safe
API changes (from Hackage documentation)
Files
- ChangeLog.md +5/−0
- README.md +2/−2
- rpmbuild-order.cabal +3/−2
- src/Distribution/RPM/Build/Graph.hs +6/−1
- src/Distribution/RPM/Build/ProvReqs.hs +41/−33
- src/Main.hs +1/−1
- test/pkgs/A/A.spec +4/−0
- test/pkgs/B/B.spec +2/−0
- test/pkgs/cmake/A/A.spec +2/−0
- test/pkgs/dynbr/A/A.spec +4/−0
- test/pkgs/pkgconf/A/A.spec +2/−0
ChangeLog.md view
@@ -1,3 +1,8 @@+# 0.4.13 (2025-11-10)+- ProvReqs: handle cmake directories as used by KDE (#5)+- ProvReqs: create python3dist dynamic provides (#6)+- depsGraphDeps bugfix: include the packages within the deps graphs+ # 0.4.12 (2024-08-04) - fix ordering of rust crates and rubygems by mapping their dynamic BRs to package names
README.md view
@@ -14,7 +14,7 @@ `$ rpmbuild-order --version` ```-0.4.12+0.4.13 ``` `$ rpmbuild-order --help` @@ -30,7 +30,7 @@ --version Show version Available commands:- sort sort packages+ sort sort packages in build order deps sort dependencies in neighbouring package dirs rdeps sort dependents in neighbouring package dirs layers ordered output of dependency layers
rpmbuild-order.cabal view
@@ -1,12 +1,12 @@ Name: rpmbuild-order-Version: 0.4.12+Version: 0.4.13 License: BSD3 License-File: LICENSE Author: Jens Petersen <petersen@redhat.com>, Henning Thielemann <haskell@henning-thielemann.de> Maintainer: Jens Petersen <petersen@redhat.com> Copyright: 2010-2018 Henning Thielemann,- 2018-2024 Jens Petersen <petersen@redhat.com>+ 2018-2025 Jens Petersen <petersen@redhat.com> Category: Distribution Homepage: https://github.com/juhp/rpmbuild-order Bug-reports: https://github.com/juhp/rpmbuild-order/issues@@ -80,6 +80,7 @@ fgl >= 5.5.4, graphviz, regex-tdfa,+ safe, simple-cmd >= 0.2.3 HS-Source-Dirs: src default-language: Haskell2010
src/Distribution/RPM/Build/Graph.hs view
@@ -432,8 +432,13 @@ unlessM (and <$> mapM doesDirectoryExist pkgs) $ errorWithoutStackTrace "Please use package directory paths" -- filter out dotfiles- createGraph3 ignoredBRs rpmopts verbose lenient (not rev) mdir (filter (\d -> d `notElem` excludedPkgs && head d /= '.') deps) >>=+ createGraph3 ignoredBRs rpmopts verbose lenient (not rev) mdir+ (filter (\d -> d `notElem` excludedPkgs && not ("." `isPrefixOf` d)) $ pkgsAndDeps pkgs deps) >>= createGraph2 rpmopts verbose lenient True mdir . dependencyNodes pkgs+ where+ pkgsAndDeps [] ds = ds+ pkgsAndDeps (p:ps) ds =+ pkgsAndDeps ps $ if p `elem` ds then ds else p : ds -- | Used to control the output from sortGraph data Components = Parallel -- ^ separate independent stacks
src/Distribution/RPM/Build/ProvReqs.hs view
@@ -13,6 +13,7 @@ import qualified Data.CaseInsensitive as CI import Data.List.Extra import Data.Maybe (mapMaybe)+import Safe (headMay) import SimpleCmd (cmdFull, cmdLines, cmdStdErr, egrep_, error', grep, warning, (+-+)) import SimpleCmd.Git (isGitDir)@@ -47,40 +48,41 @@ case mcontent of Nothing -> return Nothing Just content ->- let pkg = takeBaseName spec- in fmap Just <$> extractMetadata pkg ([],[]) $ lines content+ fmap Just <$> extractMetadata ([],[]) $ lines content where- extractMetadata :: FilePath -> ([String],[String]) -> [String]+ pkg = takeBaseName spec++ extractMetadata :: ([String],[String]) -> [String] -> IO ([String],[String])- extractMetadata _ (provs,brs) [] =+ extractMetadata (provs,brs) [] = return (provs, mapMaybe simplifyDep brs)- extractMetadata pkg acc@(provs,brs) (l:ls) =+ extractMetadata acc@(provs,brs) (l:ls) = case words l of- [] -> extractMetadata pkg acc ls+ [] -> extractMetadata acc ls [w] | w =~ ("^/usr/(lib(64)?|share)/pkgconfig/.*\\.pc" :: String) -> let pc = metaName "pkgconfig" $ takeBaseName w- in extractMetadata pkg (pc : provs, brs) ls- | w =~ ("^/usr/(lib(64)?|share)/cmake/[^/]*$" :: String) ->- let p = takeFileName w+ in extractMetadata (pc : provs, brs) ls+ | w =~ ("^/usr/(lib(64)?|share)/cmake/[^/]*/?$" :: String) ->+ let p = takeFileName $ dropTrailingPathSeparator w cm = map (metaName "cmake") $ if lower p == p then [p] else [p, lower p]- in extractMetadata pkg (provs ++ cm, brs) ls- | otherwise -> extractMetadata pkg acc ls+ in extractMetadata (provs ++ cm, brs) ls+ | otherwise -> extractMetadata acc ls (w:w':ws) -> case CI.mk w of "BuildRequires:" -> -- FIXME could be more than one package: parse ws- extractMetadata pkg (provs, w':brs) ls- "Name:" -> extractMetadata pkg (w' : provs, brs) ls- "Provides:" -> extractMetadata pkg (w' : provs, brs) ls+ extractMetadata (provs, w':brs) ls+ "Name:" -> extractMetadata (w' : provs, brs) ls+ "Provides:" -> extractMetadata (w' : provs, brs) ls "%package" -> let subpkg = if null ws then pkg ++ '-' : w' else last ws- in extractMetadata pkg (subpkg : provs, brs) ls- _ -> extractMetadata pkg acc ls+ in extractMetadata (subpkg : provs, brs) ls+ _ -> extractMetadata acc ls rpmspecParse :: IO (Maybe String) rpmspecParse = do@@ -91,24 +93,30 @@ else if lenient then return Nothing else exitFailure dynProvides :: IO [String]- dynProvides =- if "golang-" `isPrefixOf` takeBaseName spec- then do- macro <- grep "%global goipath" spec- return $- case macro of- [def] -> ["golang(" ++ last (words def) ++ ")"]- _ -> error' $ "failed to find %goipath in" +-+ spec- else return []+ dynProvides+ | "python-" `isPrefixOf` pkg = do+ let dist = dropPrefix "python-" pkg+ return ["python3dist(" ++ dist ++ ")"]+ | "golang-" `isPrefixOf` pkg = do+ macro <- grep "%global goipath" spec+ return $+ case macro of+ [def] -> ["golang(" ++ last (words def) ++ ")"]+ _ -> error' $ "failed to find %goipath in" +-+ spec+ | otherwise = return [] simplifyDep br =- case (head . words) br of- '(':dep -> simplifyDep dep- dep -> case splitOn "(" (dropSuffix ")" dep) of- ("rpmlib":_) -> Nothing- ("crate":[crate]) -> Just $ "rust-" ++ replace "/" "+" crate ++ "-devel"- ("rubygem":[gem]) -> Just $ "rubygem-" ++ gem- _ -> Just dep+ case (headMay . words) br of+ Nothing -> Nothing+ Just pri ->+ case pri of+ '(':dep -> simplifyDep dep+ dep ->+ case splitOn "(" (dropSuffix ")" dep) of+ ("rpmlib":_) -> Nothing+ ("crate":[crate]) -> Just $ "rust-" ++ replace "/" "+" crate ++ "-devel"+ ("rubygem":[gem]) -> Just $ "rubygem-" ++ gem+ _ -> Just dep rpmspecDynBuildRequires :: FilePath -> IO [String] rpmspecDynBuildRequires spec =@@ -139,7 +147,7 @@ (ok, out, err) <- cmdFull "rpmspec" (["-q", "--provides"] ++ rpmopts ++ [spec]) "" unless (null err) $ warning err if ok- then return $ map (head . words) $ lines out+ then return $ map (fst . word1) $ lines out else if lenient then return [] else exitFailure metaName :: String -> String -> String
src/Main.hs view
@@ -28,7 +28,7 @@ simpleCmdArgs (Just version) "Order packages by build dependencies" "Sort package sources (spec files) in build dependency order" $ subcommands- [ Subcommand "sort" "sort packages" $+ [ Subcommand "sort" "sort packages in build order" $ sortPackages <$> rpmOpts <*> verboseOpt <*> lenientOpt <*> componentsOpt <*> subdirOpt <*> pkgArgs , Subcommand "deps" "sort dependencies in neighbouring package dirs" $ depsPackages False <$> rpmOpts <*> verboseOpt <*> excludeOpts <*> ignoredBRopts <*> lenientOpt <*> combineOpt <*> subdirOpt <*> pkgArgs
test/pkgs/A/A.spec view
@@ -14,6 +14,10 @@ %description -n C-A A support for C +%files++%files -n C-A+ %changelog * Wed Jul 29 13:38:27 +08 2020 Jens Petersen <petersen@redhat.com> -
test/pkgs/B/B.spec view
@@ -22,6 +22,8 @@ %files +%files devel+ %changelog * Wed Jul 29 13:38:27 +08 2020 Jens Petersen <petersen@redhat.com> -
test/pkgs/cmake/A/A.spec view
@@ -8,6 +8,8 @@ %description Test package A pkgconfig +%files+ %changelog * Wed Jul 29 13:38:27 +08 2020 Jens Petersen <petersen@redhat.com> -
test/pkgs/dynbr/A/A.spec view
@@ -16,6 +16,10 @@ %description -n C-A A support for C +%files++%files -n C-A+ %changelog * Wed Jul 29 13:38:27 +08 2020 Jens Petersen <petersen@redhat.com> -
test/pkgs/pkgconf/A/A.spec view
@@ -8,6 +8,8 @@ %description Test package A pkgconfig +%files+ %changelog * Wed Jul 29 13:38:27 +08 2020 Jens Petersen <petersen@redhat.com> -