@@ -20,6 +20,7 @@ struct CronConfig
2020 Duration stalledPRs = 90. days; // PRs with no activity within X days will get flagged
2121 Duration oldStablePRs = 3. days; // PRs targeting stable which should trigger a warning
2222 bool simulate;
23+ Duration waitAfterMergeNullState = 750. msecs; // Time to wait before refetching a PR with mergeable: null
2324}
2425
2526alias PRTuple = Tuple ! (PullRequest, " pr" , GHComment[], " comments" , GHComment[], " reviewComments" , CronConfig, " config" );
@@ -73,8 +74,51 @@ auto detectInactiveStablePR(PRTuple t)
7374
7475auto detectPRWithMergeConflicts (PRTuple t)
7576{
77+ if (t.pr.mergeable.isNull)
78+ {
79+ logInfo(" [cron-daily/%s/%d]: detectMerge - mergeable is null." , t.pr.repoSlug, t.pr.number);
80+ // repeat request to receive computed mergeable information
81+ foreach (i; 0 .. 4 )
82+ {
83+ import vibe.core.core : sleep;
84+ t.config.waitAfterMergeNullState.sleep;
85+ logInfo(" [cron-daily/%s/%d]: detectMerge - repeating request" , t.pr.repoSlug, t.pr.number);
86+ t.pr = t.pr.refresh;
87+ if (! t.pr.mergeable.isNull)
88+ goto mergable;
89+ }
90+ return LabelResponse (LabelAction.none, " " );
91+ }
92+ mergable:
93+
94+ bool isMergeable;
95+ if (! t.pr.mergeableState.isNull)
96+ {
97+ logInfo(" [cron-daily/%s/%d]: mergableState = %s" , t.pr.repoSlug, t.pr.number, t.pr.mergeableState.get );
98+ with (PullRequest.MergeableState)
99+ final switch (t.pr.mergeableState)
100+ {
101+ case unknown, checking:
102+ // should only be set if mergeable is null
103+ return LabelResponse (LabelAction.none, " " );
104+ case clean, unstable:
105+ isMergeable = true ;
106+ break ;
107+ case dirty:
108+ isMergeable = false ;
109+ break ;
110+ // a reviewer has blocked the merge (not observed yet)
111+ case blocked:
112+ return LabelResponse (LabelAction.none, " " );
113+ }
114+ }
115+ else
116+ {
117+ logInfo(" [cron-daily/%s/%d]: mergable = %s" , t.pr.repoSlug, t.pr.number, t.pr.mergeable.get );
118+ isMergeable = t.pr.mergeable.get ;
119+ }
120+
76121 // "needs rebase" gets automatically removed on a new push
77- bool isMergeable = ! t.pr.mergeable.isNull && t.pr.mergeable.get ;
78122 with (LabelAction)
79123 return LabelResponse (! isMergeable ? add : remove, " needs rebase" );
80124}
0 commit comments