1- {-# LANGUAGE LambdaCase #-}
21{-# LANGUAGE OverloadedStrings #-}
2+ {-# LANGUAGE TupleSections #-}
33
44module UpdateMergeRequests
55 ( updateMergeRequests ,
@@ -10,6 +10,7 @@ import App (App)
1010import Config.Types
1111import Data.Text (isInfixOf , strip , stripPrefix , toLower )
1212import Effects
13+ import Gitlab.Client.Queue.MTL (ProcessResult (.. ), UpdateError )
1314import Gitlab.Lib (Id )
1415import Gitlab.MergeRequest
1516import Gitlab.Project (Project )
@@ -27,57 +28,66 @@ updateMergeRequests _ (Merge _) _ Nothing _ Execute =
2728 write " I don't think you want to blindly merge all merge requests for this group. Consider adding a filter. Exiting now."
2829updateMergeRequests projectExcludes action authorIs maybeSearchTerms recheckMergeStatus execute = do
2930 let searchTerm' = either id (\ (SearchTermTitle s) -> SearchTerm s) <$> maybeSearchTerms
30- getOpenMergeRequestsForGroup authorIs searchTerm' recheckMergeStatus >>= \ case
31- Left err -> write $ show err
32- Right [] -> write " no MRs to process"
33- Right allMergeRequests -> do
34- let titleFilter mr = case maybeSearchTerms of
35- Just (Right (SearchTermTitle s)) -> toLower (toText s) `isInfixOf` toLower (mergeRequestTitle mr)
36- _ -> True
37- filteredMergeRequests = filter (\ mr -> titleFilter mr && mergeRequestProjectId mr `notElem` projectExcludes) allMergeRequests
38- case filteredMergeRequests of
39- [] -> write " no MRs to process after applying filters"
40- mergeRequests -> forM_ mergeRequests $ \ mr -> do
41- write $ " processing MR #" <> show (mergeRequestIid mr) <> " in Project #" <> show (mergeRequestProjectId mr) <> " with state " <> show (mergeRequestDetailedMergeStatus mr) <> " : " <> mergeRequestTitle mr
42- res <- performAction mr
43- case res of
44- Left err -> write $ " failed to update merge request: " <> show err
45- Right _ -> pure ()
31+ res <- getOpenMergeRequestsForGroupQueued authorIs searchTerm' recheckMergeStatus $ \ mr -> do
32+ if titleFilter mr && excludeFilter mr
33+ then do
34+ (txt, res) <- performAction mr
35+ pure $ PrintLinesWithResult (mconcat (mrTextLine mr <> maybe [] (\ t -> [" >> " , t]) txt) :| [] ) () <$ res
36+ else pure $ Right Empty
37+ case res of
38+ Left err -> write $ " failed to update merge requests: " <> show err
39+ Right [] -> write " no merge requests to process"
40+ Right updates -> write $ show (length updates) <> " merge requests"
4641 where
42+ mrTextLine mr =
43+ [ " #" ,
44+ show (mergeRequestIid mr),
45+ " in Project #" ,
46+ show (mergeRequestProjectId mr),
47+ " with state " ,
48+ show (mergeRequestDetailedMergeStatus mr),
49+ " : " ,
50+ mergeRequestTitle mr
51+ ]
52+ titleFilter mr = case maybeSearchTerms of
53+ Just (Right (SearchTermTitle s)) -> toLower (toText s) `isInfixOf` toLower (mergeRequestTitle mr)
54+ _ -> True
55+ excludeFilter mr = mergeRequestProjectId mr `notElem` projectExcludes
56+ performAction :: MergeRequest -> App (Maybe Text , Either UpdateError () )
4757 performAction mr =
4858 let pId = mergeRequestProjectId mr
4959 in case action of
50- List -> pure $ Right ()
60+ List -> pure ( Nothing , Right () )
5161 Rebase -> rebaseAction pId (mergeRequestIid mr)
5262 (Merge mergeCiOption) -> case detailedMergeStatusToDecision (mergeRequestDetailedMergeStatus mr) of
5363 MergeShouldWork -> mergeAction pId (mergeRequestIid mr) mergeCiOption
5464 MergeMayWork -> mergeAttemptAction pId (mergeRequestIid mr) mergeCiOption
5565 MergeWontWork -> mergeWontWorkAction (mergeRequestDetailedMergeStatus mr)
5666 SetToDraft ->
5767 if mergeRequestWip mr
58- then Right () <$ write " merge request is already in state \" Draft\" "
68+ then pure ( Just " merge request is already in state \" Draft\" " , Right () )
5969 else setToDraftAction pId (mergeRequestIid mr) (mergeRequestTitle mr)
6070 MarkAsReady ->
6171 if mergeRequestWip mr
6272 then markAsReadyAction pId (mergeRequestIid mr) (mergeRequestTitle mr)
63- else Right () <$ write " merge request is already marked as ready"
73+ else pure ( Just " merge request is already marked as ready" , Right () )
6474
6575 (rebaseAction, mergeAction, mergeAttemptAction, mergeWontWorkAction, setToDraftAction, markAsReadyAction) = case execute of
6676 Execute ->
67- ( rebaseMergeRequest,
68- mergeMergeRequest,
69- mergeMergeRequest,
70- \ detailedStatus -> Right () <$ write ( " The merge status is " <> show detailedStatus <> " , skipping the merge as it wouldn't succeed" ),
71- \ pId mrIid mrTitle -> setMergeRequestTitle pId mrIid (" Draft: " <> mrTitle),
72- \ pId mrIid mrTitle -> setMergeRequestTitle pId mrIid (strip $ fromMaybe mrTitle (stripPrefix " Draft:" mrTitle))
77+ ( \ pId mId -> ( Nothing ,) <$> rebaseMergeRequest pId mId ,
78+ \ pId mId mco -> ( Nothing ,) <$> mergeMergeRequest pId mId mco ,
79+ \ pId mId mco -> ( Nothing ,) <$> mergeMergeRequest pId mId mco ,
80+ \ detailedStatus -> pure ( Just $ " The merge status is " <> show detailedStatus <> " , skipping the merge as it wouldn't succeed" , Right () ),
81+ \ pId mrIid mrTitle -> ( Nothing ,) <$> setMergeRequestTitle pId mrIid (" Draft: " <> mrTitle),
82+ \ pId mrIid mrTitle -> ( Nothing ,) <$> setMergeRequestTitle pId mrIid (strip $ fromMaybe mrTitle (stripPrefix " Draft:" mrTitle))
7383 )
7484 DryRun ->
75- ( \ _ _ -> Right () <$ write " dry run. skipping rebase" ,
76- \ _ _ _ -> Right () <$ write " dry run. skipping merge" ,
77- \ _ _ _ -> Right () <$ write " dry run. skipping merge attempt" ,
78- \ detailedStatus -> Right () <$ write ( " The merge status is " <> show detailedStatus <> " , skipping the merge as it wouldn't succeed" ),
79- \ _ _ _ -> Right () <$ write " dry run. skipping draft toggle" ,
80- \ _ _ _ -> Right () <$ write " dry run. skipping draft toggle"
85+ ( \ _ _ -> pure ( Just " dry run. skipping rebase" , Right () ) ,
86+ \ _ _ _ -> pure ( Just " dry run. skipping merge" , Right () ) ,
87+ \ _ _ _ -> pure ( Just " dry run. skipping merge attempt" , Right () ) ,
88+ \ detailedStatus -> pure ( Just $ " The merge status is " <> show detailedStatus <> " , skipping the merge as it wouldn't succeed" , Right () ),
89+ \ _ _ _ -> pure ( Just " dry run. skipping draft toggle" , Right () ) ,
90+ \ _ _ _ -> pure ( Just " dry run. skipping draft toggle" , Right () )
8191 )
8292
8393-- | Depending on the merge status of a merge request, trying a merge may or may not make sense.
0 commit comments