Skip to content

Commit 15c47c8

Browse files
authored
Don't automerge if there is "DO-NOT-MERGE" label and "CLA not signed" label (#152)
1 parent c607cce commit 15c47c8

File tree

3 files changed

+216
-18
lines changed

3 files changed

+216
-18
lines changed

miss_islington/util.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,13 @@ async def is_core_dev(gh, username):
143143

144144

145145
def pr_is_awaiting_merge(pr_labels):
146-
for label in pr_labels:
147-
if label["name"] == "awaiting merge":
148-
return True
146+
label_names = [label["name"] for label in pr_labels]
147+
if (
148+
"DO-NOT-MERGE" not in label_names
149+
and "awaiting merge" in label_names
150+
and "CLA signed" in label_names
151+
):
152+
return True
149153
return False
150154

151155

tests/test_status_change.py

Lines changed: 186 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,17 @@ async def test_ci_passed_with_awaiting_merge_label_pr_is_merged():
6464
"user": {"login": "miss-islington"},
6565
"merged_by": {"login": "Mariatta"},
6666
},
67-
"/repos/python/cpython/pulls/5547": {"labels": [{"name": "awaiting merge"}]},
67+
"/repos/python/cpython/pulls/5547": {
68+
"labels": [{"name": "awaiting merge"}, {"name": "CLA signed"}]
69+
},
6870
f"/search/issues?q=type:pr+repo:python/cpython+sha:{sha}": {
6971
"total_count": 1,
7072
"items": [
7173
{
7274
"number": 5547,
7375
"title": "[3.6] bpo-32720: Fixed the replacement field grammar documentation. (GH-5544)",
7476
"body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.\n(cherry picked from commit 7a561afd2c79f63a6008843b83733911d07f0119)\n\nCo-authored-by: Mariatta <[email protected]>",
75-
"labels": [{"name": "awaiting merge"}],
77+
"labels": [{"name": "awaiting merge"}, {"name": "CLA signed"}],
7678
}
7779
],
7880
},
@@ -200,7 +202,7 @@ async def test_awaiting_merge_label_added_and_ci_passed_pr_is_merged():
200202
"action": "labeled",
201203
"pull_request": {
202204
"user": {"login": "miss-islington"},
203-
"labels": [{"name": "awaiting merge"}],
205+
"labels": [{"name": "awaiting merge"}, {"name": "CLA signed"}],
204206
"head": {"sha": sha},
205207
},
206208
}
@@ -224,15 +226,17 @@ async def test_awaiting_merge_label_added_and_ci_passed_pr_is_merged():
224226
},
225227
],
226228
},
227-
"/repos/python/cpython/pulls/5547": {"labels": [{"name": "awaiting merge"}]},
229+
"/repos/python/cpython/pulls/5547": {
230+
"labels": [{"name": "awaiting merge"}, {"name": "CLA signed"}]
231+
},
228232
f"/search/issues?q=type:pr+repo:python/cpython+sha:{sha}": {
229233
"total_count": 1,
230234
"items": [
231235
{
232236
"number": 5547,
233237
"title": "[3.6] bpo-32720: Fixed the replacement field grammar documentation. (GH-5544)",
234238
"body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.\n(cherry picked from commit 7a561afd2c79f63a6008843b83733911d07f0119)\n\nCo-authored-by: Mariatta <[email protected]>",
235-
"labels": [{"name": "awaiting merge"}],
239+
"labels": [{"name": "awaiting merge"}, {"name": "CLA signed"}],
236240
}
237241
],
238242
},
@@ -894,7 +898,11 @@ async def test_ci_passed_automerge():
894898
"/repos/python/cpython/pulls/5547": {
895899
"user": {"login": "bedevere-bot"},
896900
"merged_by": None,
897-
"labels": [{"name": "awaiting merge"}],
901+
"labels": [
902+
{"name": "awaiting merge"},
903+
{"name": "CLA signed"},
904+
{"name": AUTOMERGE_LABEL},
905+
],
898906
},
899907
f"/search/issues?q=type:pr+repo:python/cpython+sha:{sha}": {
900908
"total_count": 1,
@@ -903,7 +911,11 @@ async def test_ci_passed_automerge():
903911
"number": 5547,
904912
"title": "bpo-32720: Fixed the replacement field grammar documentation.",
905913
"body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.\n(cherry picked from commit 7a561afd2c79f63a6008843b83733911d07f0119)\n\nCo-authored-by: Mariatta <[email protected]>",
906-
"labels": [{"name": "awaiting merge"}, {"name": AUTOMERGE_LABEL}],
914+
"labels": [
915+
{"name": "awaiting merge"},
916+
{"name": AUTOMERGE_LABEL},
917+
{"name": "CLA signed"},
918+
],
907919
}
908920
],
909921
},
@@ -983,7 +995,11 @@ async def test_awaiting_merge_label_and_automerge_label_added_not_miss_islington
983995
"action": "labeled",
984996
"pull_request": {
985997
"user": {"login": "Mariatta"},
986-
"labels": [{"name": "awaiting merge"}, {"name": AUTOMERGE_LABEL}],
998+
"labels": [
999+
{"name": "awaiting merge"},
1000+
{"name": AUTOMERGE_LABEL},
1001+
{"name": "CLA signed"},
1002+
],
9871003
"head": {"sha": sha},
9881004
},
9891005
}
@@ -1010,7 +1026,11 @@ async def test_awaiting_merge_label_and_automerge_label_added_not_miss_islington
10101026
"/repos/python/cpython/pulls/5547": {
10111027
"user": {"login": "Mariatta"},
10121028
"merged_by": None,
1013-
"labels": [{"name": "awaiting merge"}, {"name": AUTOMERGE_LABEL}],
1029+
"labels": [
1030+
{"name": "awaiting merge"},
1031+
{"name": AUTOMERGE_LABEL},
1032+
{"name": "CLA signed"},
1033+
],
10141034
},
10151035
f"/search/issues?q=type:pr+repo:python/cpython+sha:{sha}": {
10161036
"total_count": 1,
@@ -1019,7 +1039,11 @@ async def test_awaiting_merge_label_and_automerge_label_added_not_miss_islington
10191039
"number": 5547,
10201040
"title": "bpo-32720: Fixed the replacement field grammar documentation.",
10211041
"body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.",
1022-
"labels": [{"name": "awaiting merge"}, {"name": AUTOMERGE_LABEL}],
1042+
"labels": [
1043+
{"name": "awaiting merge"},
1044+
{"name": AUTOMERGE_LABEL},
1045+
{"name": "CLA signed"},
1046+
],
10231047
}
10241048
],
10251049
},
@@ -1043,7 +1067,7 @@ async def test_awaiting_merge_label_and_automerge_label_added_not_miss_islington
10431067
)
10441068

10451069

1046-
async def test_awaiting_automerge_but_not_awaiting_merge():
1070+
async def test_automerge_but_not_awaiting_merge():
10471071
sha = "f2393593c99dd2d3ab8bfab6fcc5ddee540518a9"
10481072
data = {
10491073
"action": "labeled",
@@ -1116,3 +1140,154 @@ async def test_pr_not_found_for_commit():
11161140
await status_change.router.dispatch(event, gh)
11171141
assert not hasattr(gh, "post_data") # does not leave a comment
11181142
assert not hasattr(gh, "put_data") # does not leave a comment
1143+
1144+
1145+
async def test_automerge_multi_commits_in_pr():
1146+
sha = "f2393593c99dd2d3ab8bfab6fcc5ddee540518a9"
1147+
data = {
1148+
"action": "labeled",
1149+
"pull_request": {
1150+
"user": {"login": "Mariatta"},
1151+
"labels": [
1152+
{"name": "awaiting merge"},
1153+
{"name": AUTOMERGE_LABEL},
1154+
{"name": "CLA signed"},
1155+
],
1156+
"head": {"sha": sha},
1157+
},
1158+
}
1159+
1160+
event = sansio.Event(data, event="pull_request", delivery_id="1")
1161+
1162+
getitem = {
1163+
f"/repos/python/cpython/commits/{sha}/status": {
1164+
"state": "success",
1165+
"statuses": [
1166+
{
1167+
"state": "success",
1168+
"description": "Issue report skipped",
1169+
"context": "bedevere/issue-number",
1170+
},
1171+
{
1172+
"state": "success",
1173+
"description": "The Travis CI build passed",
1174+
"target_url": "https://travis-ci.org/python/cpython/builds/340259685?utm_source=github_status&utm_medium=notification",
1175+
"context": "continuous-integration/travis-ci/pr",
1176+
},
1177+
],
1178+
},
1179+
"/repos/python/cpython/pulls/5547": {
1180+
"user": {"login": "Mariatta"},
1181+
"merged_by": None,
1182+
"labels": [
1183+
{"name": "awaiting merge"},
1184+
{"name": AUTOMERGE_LABEL},
1185+
{"name": "CLA signed"},
1186+
],
1187+
},
1188+
f"/search/issues?q=type:pr+repo:python/cpython+sha:{sha}": {
1189+
"total_count": 1,
1190+
"items": [
1191+
{
1192+
"number": 5547,
1193+
"title": "bpo-32720: Fixed the replacement field grammar documentation.",
1194+
"body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.",
1195+
"labels": [
1196+
{"name": "awaiting merge"},
1197+
{"name": AUTOMERGE_LABEL},
1198+
{"name": "CLA signed"},
1199+
],
1200+
}
1201+
],
1202+
},
1203+
}
1204+
1205+
getiter = {
1206+
"/repos/python/cpython/pulls/5547/commits": [
1207+
{"sha": "5f007046b5d4766f971272a0cc99f8461215c1ec"},
1208+
{"sha": sha},
1209+
]
1210+
}
1211+
1212+
gh = FakeGH(getitem=getitem, getiter=getiter)
1213+
await status_change.router.dispatch(event, gh)
1214+
assert not hasattr(gh, "post_data") # does not leave a comment
1215+
1216+
assert gh.put_data["sha"] == sha # is merged
1217+
assert gh.put_data["merge_method"] == "squash"
1218+
assert (
1219+
gh.put_data["commit_title"]
1220+
== "bpo-32720: Fixed the replacement field grammar documentation. (GH-5547)"
1221+
)
1222+
assert (
1223+
gh.put_data["commit_message"]
1224+
== "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`."
1225+
)
1226+
1227+
1228+
async def test_automerge_commit_not_found():
1229+
sha = "f2393593c99dd2d3ab8bfab6fcc5ddee540518a9"
1230+
data = {
1231+
"action": "labeled",
1232+
"pull_request": {
1233+
"user": {"login": "Mariatta"},
1234+
"labels": [
1235+
{"name": "awaiting merge"},
1236+
{"name": AUTOMERGE_LABEL},
1237+
{"name": "CLA signed"},
1238+
],
1239+
"head": {"sha": sha},
1240+
},
1241+
}
1242+
1243+
event = sansio.Event(data, event="pull_request", delivery_id="1")
1244+
1245+
getitem = {
1246+
f"/repos/python/cpython/commits/{sha}/status": {
1247+
"state": "success",
1248+
"statuses": [
1249+
{
1250+
"state": "success",
1251+
"description": "Issue report skipped",
1252+
"context": "bedevere/issue-number",
1253+
},
1254+
{
1255+
"state": "success",
1256+
"description": "The Travis CI build passed",
1257+
"target_url": "https://travis-ci.org/python/cpython/builds/340259685?utm_source=github_status&utm_medium=notification",
1258+
"context": "continuous-integration/travis-ci/pr",
1259+
},
1260+
],
1261+
},
1262+
"/repos/python/cpython/pulls/5547": {
1263+
"user": {"login": "Mariatta"},
1264+
"merged_by": None,
1265+
"labels": [
1266+
{"name": "awaiting merge"},
1267+
{"name": AUTOMERGE_LABEL},
1268+
{"name": "CLA signed"},
1269+
],
1270+
},
1271+
f"/search/issues?q=type:pr+repo:python/cpython+sha:{sha}": {
1272+
"total_count": 1,
1273+
"items": [
1274+
{
1275+
"number": 5547,
1276+
"title": "bpo-32720: Fixed the replacement field grammar documentation.",
1277+
"body": "\n\n`arg_name` and `element_index` are defined as `digit`+ instead of `integer`.",
1278+
"labels": [
1279+
{"name": "awaiting merge"},
1280+
{"name": AUTOMERGE_LABEL},
1281+
{"name": "CLA signed"},
1282+
],
1283+
}
1284+
],
1285+
},
1286+
}
1287+
1288+
getiter = {"/repos/python/cpython/pulls/5547/commits": []}
1289+
1290+
gh = FakeGH(getitem=getitem, getiter=getiter)
1291+
await status_change.router.dispatch(event, gh)
1292+
assert not hasattr(gh, "post_data") # does not leave a comment
1293+
assert not hasattr(gh, "put_data") # does not merge

tests/test_util.py

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -177,13 +177,32 @@ async def test_is_core_dev():
177177

178178

179179
def test_pr_is_awaiting_merge():
180-
labels = [{"name": "CLA Signed"}, {"name": "awaiting merge"}]
180+
labels = [{"name": "CLA signed"}, {"name": "awaiting merge"}]
181181
assert util.pr_is_awaiting_merge(labels) is True
182182

183183

184+
def test_pr_is_do_not_merge():
185+
labels = [
186+
{"name": "CLA signed"},
187+
{"name": "awaiting merge"},
188+
{"name": "DO-NOT-MERGE"},
189+
]
190+
assert util.pr_is_awaiting_merge(labels) is False
191+
192+
labels = [{"name": "CLA not signed"}, {"name": "awaiting merge"}]
193+
assert util.pr_is_awaiting_merge(labels) is False
194+
195+
labels = [
196+
{"name": "CLA not signed"},
197+
{"name": "awaiting merge"},
198+
{"name": "DO-NOT-MERGE"},
199+
]
200+
assert util.pr_is_awaiting_merge(labels) is False
201+
202+
184203
def test_pr_is_automerge():
185204
labels = [
186-
{"name": "CLA Signed"},
205+
{"name": "CLA signed"},
187206
{"name": util.AUTOMERGE_LABEL},
188207
{"name": "awaiting review"},
189208
]
@@ -192,15 +211,15 @@ def test_pr_is_automerge():
192211

193212
def test_pr_is_not_awaiting_merge():
194213
labels = [
195-
{"name": "CLA Signed"},
214+
{"name": "CLA signed"},
196215
{"name": "skip issue"},
197216
{"name": "awaiting review"},
198217
]
199218
assert util.pr_is_awaiting_merge(labels) is False
200219

201220

202221
def test_pr_is_not_automerge():
203-
labels = [{"name": "CLA Signed"}, {"name": "awaiting merge"}]
222+
labels = [{"name": "CLA signed"}, {"name": "awaiting merge"}]
204223
assert util.pr_is_automerge(labels) is False
205224

206225

0 commit comments

Comments
 (0)