Skip to content

Commit 5e8691c

Browse files
committed
Improve mergeableState recognition
1 parent fb7702a commit 5e8691c

File tree

2 files changed

+51
-12
lines changed

2 files changed

+51
-12
lines changed

source/dlangbot/cron.d

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,17 @@ auto detectInactiveStablePR(PRTuple t)
7474

7575
auto detectPRWithMergeConflicts(PRTuple t)
7676
{
77+
import std.typecons : Nullable;
78+
7779
if (t.pr.mergeable.isNull)
7880
{
79-
logInfo("[cron-daily/%s/%d]: detectMerge - mergeable is null.", t.pr.repoSlug, t.pr.number);
81+
logInfo("[cron-daily/%s/%d/detectMerge]: mergeable is null.", t.pr.repoSlug, t.pr.number);
8082
// repeat request to receive computed mergeable information
8183
foreach (i; 0 .. 4)
8284
{
8385
import vibe.core.core : sleep;
8486
t.config.waitAfterMergeNullState.sleep;
85-
logInfo("[cron-daily/%s/%d]: detectMerge - repeating request", t.pr.repoSlug, t.pr.number);
87+
logInfo("[cron-daily/%s/%d/detectMerge]: repeating request", t.pr.repoSlug, t.pr.number);
8688
t.pr = t.pr.refresh;
8789
if (!t.pr.mergeable.isNull)
8890
goto mergable;
@@ -91,30 +93,40 @@ auto detectPRWithMergeConflicts(PRTuple t)
9193
}
9294
mergable:
9395

94-
bool isMergeable;
96+
Nullable!bool isMergeable;
9597
if (!t.pr.mergeableState.isNull)
9698
{
97-
logInfo("[cron-daily/%s/%d]: mergableState = %s", t.pr.repoSlug, t.pr.number, t.pr.mergeableState.get);
99+
logInfo("[cron-daily/%s/%d/detectMerge]: mergeableState = %s", t.pr.repoSlug, t.pr.number, t.pr.mergeableState.get);
98100
with (PullRequest.MergeableState)
99101
final switch(t.pr.mergeableState)
100102
{
101-
case unknown, checking:
102-
// should only be set if mergeable is null
103-
return LabelResponse(LabelAction.none, "");
104-
case clean, unstable:
103+
case clean:
104+
// branch is up to date with master and has no conflicts
105+
isMergeable = true;
106+
break;
107+
case unstable:
108+
// branch isn't up to date with master, but has no conflicts
105109
isMergeable = true;
106110
break;
107111
case dirty:
112+
// GitHub detected conflicts
108113
isMergeable = false;
109114
break;
110-
// a reviewer has blocked the merge (not observed yet)
115+
case unknown, checking:
116+
// should only be set if mergeable is null
111117
case blocked:
112-
return LabelResponse(LabelAction.none, "");
118+
// the repo requires reviews and the PR hasn't been approved yet
119+
// the repo requires status checks and they have failed
120+
break;
113121
}
114122
}
115-
else
123+
124+
if (isMergeable.isNull)
116125
{
117-
logInfo("[cron-daily/%s/%d]: mergable = %s", t.pr.repoSlug, t.pr.number, t.pr.mergeable.get);
126+
if (t.pr.mergeable.isNull)
127+
return LabelResponse(LabelAction.none, "");
128+
129+
logInfo("[cron-daily/%s/%d/detectMerge]: mergeable = %s", t.pr.repoSlug, t.pr.number, t.pr.mergeable.get);
118130
isMergeable = t.pr.mergeable.get;
119131
}
120132

test/cronjob.d

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,3 +138,30 @@ unittest
138138

139139
testCronDaily(repositories);
140140
}
141+
142+
// for "blocked" PRs, the `mergeable` attribute should be preferred
143+
// if mergeable is true, "needs rebase" should be removed
144+
unittest
145+
{
146+
setAPIExpectations(
147+
"/github/repos/dlang/phobos/issues?state=open&sort=updated&direction=asc", (ref Json j) {
148+
// only test one pull request
149+
j = Json([j[0]]);
150+
j[0]["labels"][0]["name"] = "needs rebase";
151+
},
152+
"/github/repos/dlang/phobos/pulls/2526", (ref Json j) {
153+
j["mergeable"] = true;
154+
j["mergeable_state"] = "blocked";
155+
},
156+
"/github/repos/dlang/phobos/status/a04acd6a2813fb344d3e47369cf7fd64523ece44",
157+
"/github/repos/dlang/phobos/issues/2526/comments", &dontTestStalled,
158+
"/github/repos/dlang/phobos/pulls/2526/comments",
159+
"/github/repos/dlang/phobos/issues/2526/labels",
160+
(scope HTTPServerRequest req, scope HTTPServerResponse res){
161+
assert(req.method == HTTPMethod.PUT);
162+
assert(req.json[].length == 0);
163+
},
164+
);
165+
166+
testCronDaily(repositories);
167+
}

0 commit comments

Comments
 (0)