dnf-repo 0.6 → 0.6.1
raw patch · 6 files changed
+127/−52 lines, 6 files
Files
- ChangeLog.md +7/−0
- README.md +16/−9
- dnf-repo.cabal +5/−5
- src/Main.hs +90/−35
- src/State.hs +7/−2
- test/tests.hs +2/−1
ChangeLog.md view
@@ -1,5 +1,12 @@ # dnf-repo releases +## 0.6.1 (2024-06-14)+- add `--add-repofile URL` action+- `--add-copr` can now also take an url+- `--add-copr owner/pkg install` will now expand to "install pkg"+- allow `-add-copr` and `--add-koji` to continue even if the .repo exists+- get 1s speedup by dropping sleep 1!+ ## 0.6 (2024-04-22) - switch license from BSD to GPLv3+ - add --only option to only --repo enable certain repos
README.md view
@@ -21,10 +21,12 @@ ## Help `$ dnf-repo --version`+ ```-0.6+0.6.1 ``` `$ dnf-repo --help`+ ``` DNF wrapper repo tool @@ -37,9 +39,11 @@ (-t|--enable-testing) | (-T|--disable-testing) | (-m|--enable-modular) | (-M|--disable-modular) | --enable-debuginfo | --disable-debuginfo | --enable-source |- --disable-source | (-c|--add-copr [SERVER/]COPR/PROJECT)+ --disable-source | (-c|--add-copr [SERVER/]COPR/PROJECT|URL) [--osname OSNAME] [--releasever RELEASEVER] |- (-k|--add-koji REPO) | (-u|--repourl URL)] [DNFARGS]+ (-k|--add-koji REPO) | (-r|--add-repofile REPOFILEURL)+ [--releasever RELEASEVER] |+ (-u|--repourl URL)] [DNFARGS] see https://github.com/juhp/dnf-repo#readme @@ -70,13 +74,15 @@ --disable-debuginfo Disable debuginfo repos --enable-source Enable source repos --disable-source Disable source repos- -c,--add-copr [SERVER/]COPR/PROJECT- Create repo file for copr repo (defaults to fedora- server)+ -c,--add-copr [SERVER/]COPR/PROJECT|URL+ Install copr repo file (defaults to fedora server) --osname OSNAME Specify OS Name to override (eg epel) --releasever RELEASEVER Specify OS Release Version to override (eg rawhide) -k,--add-koji REPO Create repo file for a Fedora koji repo (f40-build, rawhide, epel9-build, etc)+ -r,--add-repofile REPOFILEURL+ Install repo file+ --releasever RELEASEVER Specify OS Release Version to override (eg rawhide) -u,--repourl URL Use temporary repo from a baseurl ``` @@ -111,17 +117,18 @@ ``` (note the copr repo is not permanently enabled). +Also you can use the equivalent abbreviation: `dnf-repo -c varlad/helix install` if the package and repo have the same name.+ Later update with the copr: ```shellsession $ dnf-repo -e helix update ``` ### Changing system repo config-Disable fedora modular and cisco openh264 repos permanently:+Disable fedora updates-testing and cisco openh264 repos permanently: ```shellsession-$ dnf-repo --M -d h264 --save+$ dnf-repo -T -d h264 --save ```-(All modular repos were dropped in Fedora 39.) ### Use only source repos ```shellsession
dnf-repo.cabal view
@@ -1,14 +1,14 @@ name: dnf-repo-version: 0.6+version: 0.6.1 synopsis: A dnf wrapper with fine control of enabled repos description: A command-line wrapper of the dnf package manager to control the repos enabled for a dnf invocation. license: GPL-3 license-file: COPYING-author: Jens Petersen <juhpetersen@gmail.com>-maintainer: Jens Petersen <juhpetersen@gmail.com>-copyright: 2022-2024 Jens Petersen <juhpetersen@gmail.com>+author: Jens Petersen <petersen@redhat.com>+maintainer: Jens Petersen <petersen@redhat.com>+copyright: 2022-2024 Jens Petersen <petersen@redhat.com> category: Utility homepage: https://github.com/juhp/dnf-repo bug-reports: https://github.com/juhp/dnf-repo/issues@@ -22,7 +22,7 @@ || == 9.0.2 || == 9.2.7 || == 9.4.8- || == 9.6.4+ || == 9.6.5 || == 9.8.2 data-dir: data data-files: koji-REPO.repo
src/Main.hs view
@@ -28,7 +28,6 @@ import System.FilePath import System.IO (hSetBuffering, stdout, BufferMode(NoBuffering)) import System.IO.Extra (withTempDir)-import System.Time.Extra (sleep) import Paths_dnf_repo (getDataFileName, version) import ExpireRepos@@ -60,12 +59,17 @@ where cleanupReponame = -- FIXME handle copr url too- serverAliases . replace "@" "group_" . replace "/" ":" . dropWhileEnd (== '/') . dropWhile (== '/')+ serverAliases . replace "@" "group_" . replace "/" ":" . dropWhileEnd (== '/') . dropWhile (== '/') . handleCoprUrl serverAliases ('r':'e':'d':'h':'a':'t':':':copr) = "copr.devel.redhat.com:" ++ copr serverAliases copr = copr + handleCoprUrl url =+ if "https:" `isPrefixOf` url+ then replace "coprs/" "" $ dropPrefix "https:" url+ else url+ modeOpt = DisableRepo <$> repoOptionWith 'd' "disable" "REPOPAT" "Disable repos" <|> EnableRepo <$> repoOptionWith 'e' "enable" "REPOPAT" "Enable repos" <|>@@ -82,11 +86,16 @@ flagLongWith' (Specific EnableSource) "enable-source" "Enable source repos" <|> flagLongWith' (Specific DisableSource) "disable-source" "Disable source repos" <|> AddCopr- <$> repoOptionWith 'c' "add-copr" "[SERVER/]COPR/PROJECT" "Create repo file for copr repo (defaults to fedora server)"+ <$> repoOptionWith 'c' "add-copr" "[SERVER/]COPR/PROJECT|URL" "Install copr repo file (defaults to fedora server)" <*> optional (strOptionLongWith "osname" "OSNAME" "Specify OS Name to override (eg epel)") <*> optional (strOptionLongWith "releasever" "RELEASEVER" "Specify OS Release Version to override (eg rawhide)") <|>- AddKoji <$> repoOptionWith 'k' "add-koji" "REPO" "Create repo file for a Fedora koji repo (f40-build, rawhide, epel9-build, etc)" <|>- RepoURL <$> strOptionWith 'u' "repourl" "URL" "Use temporary repo from a baseurl"+ AddKoji+ <$> repoOptionWith 'k' "add-koji" "REPO" "Create repo file for a Fedora koji repo (f40-build, rawhide, epel9-build, etc)" <|>+ AddRepo+ <$> strOptionWith 'r' "add-repofile" "REPOFILEURL" "Install repo file"+ <*> optional (strOptionLongWith "releasever" "RELEASEVER" "Specify OS Release Version to override (eg rawhide)") <|>+ RepoURL+ <$> strOptionWith 'u' "repourl" "URL" "Use temporary repo from a baseurl" fedoraCopr :: String fedoraCopr = "copr.fedorainfracloud.org"@@ -114,13 +123,17 @@ withCurrentDirectory yumReposD $ do forM_ modes $ \case- AddCopr copr mosname mrelease -> addCoprRepo dryrun debug mosname mrelease copr- AddKoji repo -> addKojiRepo dryrun debug repo+ AddCopr copr mosname mrelease ->+ addCoprRepo dryrun debug mosname mrelease copr+ AddKoji repo ->+ addKojiRepo dryrun debug repo+ AddRepo repo mrelease ->+ addRepoFile dryrun debug mrelease repo _ -> return () repofiles <- filesWithExtension "./" "repo"- when debug $- print modes+ when debug $ print modes nameStates <- sort <$> concatMapM readRepos repofiles+ when debug $ mapM_ print nameStates let actions = selectRepo exact nameStates modes moreoutput = not (null args) || null actions || listrepos when (debug && not (null modes)) $@@ -169,7 +182,6 @@ when save $ putStrLn "" listRepos $ map (updateState actions) nameStates else do- sleep 1 when save $ putStrLn "" mdnf <- if dnf4@@ -183,7 +195,18 @@ weakdeps = maybe [] (\w -> ["--setopt=install_weak_deps=" ++ show w]) mweakdeps quietopt = if quiet then ("-q" :) else id cachedir = ["--setopt=cachedir=/var/cache/dnf" </> relver | relver <- maybeToList (maybeReleaseVer args)]- in doSudo dryrun debug dnf $ quietopt repoargs ++ cachedir ++ weakdeps ++ map mungeArg args+ extraargs =+ -- special case for "dnf-repo -c owner/project install"+ case modes of+ [mode] ->+ case mode of+ AddCopr proj _ _ | args == ["install"] ->+ [takeWhileEnd (/= ':') proj]+ _ -> []+ _ -> []+ in doSudo dryrun debug dnf $+ quietopt repoargs ++ cachedir ++ weakdeps ++ map mungeArg args +++ extraargs -- FIXME rpm-ostree install supports --enablerepo Nothing -> error' "missing dnf (rpm-ostree is not supported)" where@@ -196,22 +219,24 @@ let (server,owner,project) = serverOwnerProject repo repofile = "_copr:" ++ server ++ ':' : owner ++ ':' : project <.> "repo"- whenM (doesFileExist repofile) $- error' $ "repo already defined:" +-+ repofile- osName <- maybe getRpmOSName return mosname- osVersion <- maybe getRpmOsRelease return mrelease- let repofileUrl = "https://" ++ server +/+ "coprs" +/+ mungeGroupUrl owner +/+ project +/+ "repo" +/+ osName ++ '-' : osVersion +/+ owner ++ '-' : project <.> "repo"- (curlres,curlcontent) <- curlGetString repofileUrl []- unless (curlres == CurlOK) $- error' $ "downloading failed of" +-+ repofileUrl- putStrLn $ "Setting up copr repo" +-+ repo- withTempDir $ \ tmpdir -> do- let tmpfile = tmpdir </> repofile- unless dryrun $ writeFile tmpfile $- maybe id (replace "$releasever") mrelease $- replace "enabled=1" "enabled=0" curlcontent- doSudo dryrun debug "cp" [tmpfile, repofile]- putStrLn ""+ exists <- doesFileExist repofile+ if exists+ then warning $ "copr repo already defined:" +-+ repofile+ else do+ osName <- maybe getRpmOSName return mosname+ osVersion <- maybe getRpmOsRelease return mrelease+ let repofileUrl = "https://" ++ server +/+ "coprs" +/+ mungeGroupUrl owner +/+ project +/+ "repo" +/+ osName ++ '-' : osVersion +/+ owner ++ '-' : project <.> "repo"+ (curlres,curlcontent) <- curlGetString repofileUrl []+ unless (curlres == CurlOK) $+ error' $ "downloading failed of" +-+ repofileUrl+ putStrLn $ "Setting up copr repo" +-+ repo+ withTempDir $ \ tmpdir -> do+ let tmpfile = tmpdir </> repofile+ unless dryrun $ writeFile tmpfile $+ maybe id (replace "$releasever") mrelease $+ replace "enabled=1" "enabled=0" curlcontent+ doSudo dryrun debug "cp" [tmpfile, repofile]+ putStrLn "" where mungeGroupUrl ('g':'r':'o':'u':'p':'_':own) = "g" +/+ own mungeGroupUrl own = own@@ -225,7 +250,7 @@ if '.' `elem` c then (c, o, p) else error' $ "unknown copr server:" +-+ rpo- ["copr",_,_,_] -> serverOwnerProject $ dropPrefix "copr/" rpo+ ["copr",_,_,_] -> serverOwnerProject $ dropPrefix "copr:" rpo _ -> error' $ "unknown copr:" +-+ rpo addKojiRepo :: Bool -> Bool -> String -> IO ()@@ -239,14 +264,38 @@ let repofile = replace "REPO" repo kojiRepoTemplate exists <- doesFileExist repofile if exists- then error' $ "repo already defined:" +-+ repofile- else putStrLn $ "Setting up koji repo" +-+ repo- withTempDir $ \ tmpdir -> do- let tmpfile = tmpdir </> repofile- unless dryrun $ writeFile tmpfile repodef- doSudo dryrun debug "cp" [tmpfile, repofile]- putStrLn ""+ then warning $ "koji repo already defined:" +-+ repofile+ else do+ putStrLn $ "Setting up koji repo" +-+ repo+ withTempDir $ \ tmpdir -> do+ let tmpfile = tmpdir </> repofile+ unless dryrun $ writeFile tmpfile repodef+ doSudo dryrun debug "cp" [tmpfile, repofile]+ putStrLn "" +-- FIXME maybe handle string (vscode) or local file?+addRepoFile :: Bool -> Bool -> Maybe String -> String -> IO ()+addRepoFile dryrun debug mrelease url = do+ unless (".repo" `isExtensionOf` url) $+ error' $ url +-+ "does not appear to be a .repo file"+ let repofile = takeFileName url+ exists <- doesFileExist repofile+ if exists+ then warning $ "repo file already exists:" +-+ repofile+ else do+ (curlres,curlcontent) <- curlGetString url []+ unless (curlres == CurlOK) $+ error' $ "downloading failed of" +-+ url+ putStrLn $ "Setting up" +-+ repofile+ withTempDir $ \ tmpdir -> do+ let tmpfile = tmpdir </> repofile+ unless dryrun $ writeFile tmpfile $+ maybe id (replace "$releasever") mrelease $+ maybe id (replace "$releasever") mrelease $+ replace "enabled=1" "enabled=0" curlcontent+ doSudo dryrun debug "cp" [tmpfile, repofile]+ putStrLn ""+ listRepos :: [RepoState] -> IO () listRepos repoStates = do let (on,off) =@@ -339,3 +388,9 @@ dropPrefix "\"" $ dropPrefix idkey osid oss -> error' $ "multiple IDs in" +-+ osrelease ++ ":" ++ unwords oss++#if !MIN_VERSION_filepath(1,4,2)+isExtensionOf :: String -> FilePath -> Bool+isExtensionOf ext@('.':_) = isSuffixOf ext . takeExtensions+isExtensionOf ext = isSuffixOf ('.':ext) . takeExtensions+#endif
src/State.hs view
@@ -20,12 +20,13 @@ replace, sortOn, stripInfix) import Data.Maybe (mapMaybe) import SimpleCmd (error', (+-+))+import System.FilePath (takeBaseName) import System.FilePath.Glob (compile, match) import YumRepoFile (RepoState) data Mode = AddCopr String (Maybe String) (Maybe String) | AddKoji String- | RepoURL String+ | AddRepo String (Maybe String) | RepoURL String | EnableRepo String | DisableRepo String | OnlyRepo String | ExpireRepo String | ClearExpires | DeleteRepo String@@ -35,6 +36,7 @@ modePattern :: Mode -> Maybe String modePattern (AddCopr c _ _) = Just c modePattern (AddKoji k) = Just k+modePattern (AddRepo r _) = Just r modePattern (RepoURL _) = Nothing modePattern (EnableRepo r) = Just r modePattern (DisableRepo r) = Just r@@ -195,6 +197,8 @@ maybeChange repo isSuffixOf (not enabled) (Enable name) AddKoji repo -> maybeChange repo isSuffixOf (not enabled) (Enable name)+ AddRepo repo _ ->+ maybeChange (takeBaseName repo) isSuffixOf (not enabled) (Enable name) RepoURL url -> Just $ BaseURL url EnableRepo pat -> maybeChange pat matchesRepo (not enabled) (Enable name)@@ -247,7 +251,8 @@ matchesRepo :: String -> String -> Bool matchesRepo "" = error' "empty repo pattern" matchesRepo pat- | isGlob pat = (match . compile) $+ | isGlob pat =+ (match . compile) $ if exact then pat else
test/tests.hs view
@@ -8,11 +8,12 @@ tests :: [[String]] tests =- [["-t"]+ [["-e", "updates", "-t"] -- updates to avoid rawhide failing ,["-e", "copr"] ,["-e", "openh264"] ,["-e", "rawhide"] ,["-d", "update"]+ ,["-o", "fedora"] ,["--enable-source"] ,["-d", "*", "--enable-source"] ]