Skip to content

Commit 2dbbb9a

Browse files
committed
Switch to queued processing for updating merge requests
1 parent 779f107 commit 2dbbb9a

File tree

2 files changed

+57
-32
lines changed

2 files changed

+57
-32
lines changed

src/Effects.hs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ module Effects
2727
-- * MergeRequest
2828
getOpenMergeRequests,
2929
getOpenMergeRequestsForGroup,
30+
getOpenMergeRequestsForGroupQueued,
3031
enableSourceBranchDeletionAfterMrMerge,
3132
setSuccessfulPipelineRequirementForMerge,
3233
unsetSuccessfulPipelineRequirementForMerge,
@@ -188,6 +189,20 @@ getOpenMergeRequests project maybeAuthorIs recheckMergeStatus = do
188189
let template = [uriTemplate|/api/v4/projects/{projectId}/merge_requests?state=opened&author_id={authorId}&with_merge_status_recheck={recheckMergeStatus}|]
189190
fetchDataPaginated template [("projectId", (stringValue . show) project), ("authorId", (stringValue . show) i), ("recheckMergeStatus", recheckMergeStatusToBooleanValue recheckMergeStatus)]
190191

192+
getOpenMergeRequestsForGroupQueued :: Maybe AuthorIs -> Maybe SearchTerm -> MergeStatusRecheck -> (MergeRequest -> App (Either UpdateError (ProcessResult a))) -> App (Either UpdateError [a])
193+
getOpenMergeRequestsForGroupQueued maybeAuthorIs maybeSearchTerm recheckMergeStatus action = do
194+
grp <- asks groupId
195+
let template = [uriTemplate|/api/v4/groups/{groupId}/merge_requests?state=opened{&author_id,search,with_merge_status_recheck}|]
196+
vars =
197+
mconcat
198+
[ [("groupId", (stringValue . show) grp)],
199+
foldMap (\(AuthorIs i) -> [("author_id", (stringValue . show) i)]) maybeAuthorIs,
200+
foldMap (\(SearchTerm s) -> [("search", stringValue s)]) maybeSearchTerm,
201+
[("with_merge_status_recheck", recheckMergeStatusToBooleanValue recheckMergeStatus)]
202+
]
203+
queueConfig = QueueConfig {parallelism = 10, bufferSize = 250} -- todo: make these configurable
204+
fetchDataQueued template vars queueConfig action
205+
191206
getOpenMergeRequestsForGroup :: Maybe AuthorIs -> Maybe SearchTerm -> MergeStatusRecheck -> App (Either UpdateError [MergeRequest])
192207
getOpenMergeRequestsForGroup maybeAuthorIs maybeSearchTerm recheckMergeStatus = do
193208
grp <- asks groupId

src/UpdateMergeRequests.hs

Lines changed: 42 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
{-# LANGUAGE LambdaCase #-}
21
{-# LANGUAGE OverloadedStrings #-}
2+
{-# LANGUAGE TupleSections #-}
33

44
module UpdateMergeRequests
55
( updateMergeRequests,
@@ -10,6 +10,7 @@ import App (App)
1010
import Config.Types
1111
import Data.Text (isInfixOf, strip, stripPrefix, toLower)
1212
import Effects
13+
import Gitlab.Client.Queue.MTL (ProcessResult (..), UpdateError)
1314
import Gitlab.Lib (Id)
1415
import Gitlab.MergeRequest
1516
import 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."
2829
updateMergeRequests 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

Comments
 (0)