packages feed

fbrnch-0.7.1: src/Cmd/Merge.hs

module Cmd.Merge (mergeCmd, mergeable, mergeBranch) where

import Common
import Common.System

import Branches
import Git
import Package
import Prompt

-- FIXME add --no-prompt
-- add BranchOpts?
mergeCmd :: [String] -> IO ()
mergeCmd =
  withPackageByBranches (Just False) cleanGitFetchActive Nothing True AnyNumber runMergeBranch
  where
    runMergeBranch :: Package -> AnyBranch -> IO ()
    runMergeBranch _ (OtherBranch _) =
      error' "merge only defined for release branches"
    runMergeBranch pkg rbr@(RelBranch br) = do
      putPkgBrnchHdr pkg br
      gitSwitchBranch rbr
      gitMergeOrigin rbr
      unmerged <- mergeable br
      mergeBranch False False unmerged br

getNewerBranch :: Branch -> IO Branch
getNewerBranch Rawhide = return Rawhide
getNewerBranch br = do
  branches <- fedoraBranches localBranches
  let newer = newerBranch br branches
  return $ if newer > br then newer
    -- FIXME this can be dropped with next fedora-dists
    else case elemIndex br branches of
           Just i -> branches !! (i - 1)
           Nothing -> error' $ show br ++ ": branch not found"

-- FIXME newer branch might not exist (eg epel8):
   -- restrict to local branches
mergeable :: Branch -> IO [String]
mergeable br = do
  newerBr <- getNewerBranch br
  gitMergeable $ show newerBr

-- FIXME return merged ref
mergeBranch :: Bool -> Bool -> [String] -> Branch -> IO ()
mergeBranch _ _ _ Rawhide = return ()
mergeBranch _ _ [] _ = return ()
mergeBranch build noprompt unmerged br = do
  newerBr <- getNewerBranch br
  newrepo <- initialPkgRepo
  unless (null unmerged) $ do
    putStrLn $ (if newrepo || noprompt then "Merging from" else "New commits in") ++ " " ++ show newerBr ++ ":"
    mapM_ (putStrLn . simplifyCommitLog) unmerged
  unpushed <- gitShortLog $ "origin/" ++ show br ++ "..HEAD"
  unless (null unpushed) $ do
    putStrLn "Local commits:"
    mapM_ (putStrLn . simplifyCommitLog) unpushed
  -- FIXME avoid Mass_Rebuild bumps
  mmerge <-
    if newrepo && length unmerged == 1 || noprompt then return $ Just Nothing
    else refPrompt unmerged $ "Press Enter to merge " ++ show newerBr ++ (if build then " and build" else "") ++ (if length unmerged > 1 then "; or give a ref to merge" else "") ++ "; or 'no' to skip merge"
  -- ensure still on same branch!
  gitSwitchBranch (RelBranch br)
  whenJust mmerge $ \ mhash -> do
    let ref = case mhash of
                Nothing -> show newerBr
                Just hash -> hash
    git_ "merge" ["--quiet", ref]