fbrnch-0.9: src/Cmd/Update.hs
module Cmd.Update
( updateCmd
)
where
import SimpleCmd
import Branches
import Common
import Common.System
import Git
import InterleaveOutput (cmdSilent')
import Krb
import Package
updateCmd :: (Maybe Branch,[String]) -> IO ()
updateCmd (mbr,args) = do
pkgGit <- isPkgGitSshRepo
let (mver,pkgs) = case args of
[a] -> if pkgGit then (Just a,[]) else (Nothing,[a])
_ -> (Nothing,args)
withPackagesMaybeBranch (Just False) dirtyGitFetch ZeroOrOne (updatePkg mver) (mbr, pkgs)
where
updatePkg :: Maybe String -> Package -> AnyBranch -> IO ()
updatePkg mver pkg br = do
spec <- localBranchSpecFile pkg br
(curver,_) <- pkgVerRel spec
vdiff <- filter ("Version:" `isInfixOf`) . filter (not . ("@@ " `isPrefixOf`)) <$> gitLines "diff" ["-U0", "HEAD", spec]
when (isNothing mver) $ do
when (null vdiff) $
error' "please specify version or edit in spec file"
unless (length vdiff == 2) $
error' $ "diff contains complex version change:\n" ++ unlines vdiff
if Just curver == mver
then putStrLn $ "already new version " ++ curver
else do
--FIXME: compare rpm versions
-- if newver < oldver
-- then putStrLn $ "current" +-+ display oldver +-+ "is newer!"
-- else do
pkgGit <- isPkgGitSshRepo
let (oldver,newver) =
case mver of
Just nver -> (curver,nver)
Nothing ->
case map (last . words) vdiff of
[old,new] -> (old,new)
_ -> error' "complex version change"
putStrLn $ oldver ++ " ->\n" ++ newver
when (curver /= newver) $ do
editSpecField "Version" newver spec
editSpecField "Release" "0%{?dist}" spec
cmd_ "rpmdev-bumpspec" ["-c", "update to " ++ newver, spec]
when pkgGit $ do
sources <- map sourceFieldFile <$> cmdLines "spectool" ["-S", spec]
cmd_ "sed" ["-i", "/" ++ unPackage pkg ++ "-" ++ oldver ++ "./d", "sources"]
allExist <- and <$> mapM doesFileExist sources
unless allExist $ do
cmd_ "fedpkg" ["sources"]
cmd_ "spectool" ["-g", "-S", spec]
krbTicket
copyFile "sources" "sources.fbrnch"
cmd_ "fedpkg" $ "new-sources" : filter (".tar." `isInfixOf`) sources
shell_ $ "cat sources.fbrnch >>" +-+ "sources"
removeFile "sources.fbrnch"
putStr "Prepping... "
cmdSilent' "rpmbuild" ["-bp", spec]
putStrLn "done"
cmd_ "git" ["commit", "-a", "-m", "update to " ++ newver]
sourceFieldFile :: String -> FilePath
sourceFieldFile field =
if null field then
-- should be impossible
error "empty source field!"
else (takeFileName . last . words) field
pkgVerRel :: FilePath -> IO (String,String)
pkgVerRel spec = do
--dist <- branchDist br
-- workaround dist with bootstrap
--hostdist <- cmd "rpm" ["--eval", "%{dist}"]
mvr <- cmdMaybe "rpmspec" ["-q", "--srpm", "--qf", "%{version}-%{release}", spec]
case mvr of
Nothing -> error' $ "Failed to read package ver-rel: " ++ spec
Just vr -> return $ splitBy "-" vr
splitBy :: String -> String -> (String,String)
splitBy sep xs =
let ws = splitOn sep xs in
case ws of
[f,v] -> (f,v)
_ -> error $ "inconsistent field: " ++ xs
editSpecField :: String -> String -> FilePath -> IO ()
editSpecField field new spec =
cmd_ "sed" ["-i", "-e s/^\\(" ++ field ++ ":\\s\\+\\).*/\\1" ++ new ++ "/", spec]