clan-merge: require bot assigned

This commit is contained in:
DavHau 2023-07-26 14:33:36 +02:00
parent aea65f90ae
commit 5c9c1f1518
3 changed files with 40 additions and 11 deletions

View File

@ -17,7 +17,8 @@
while sleep 10; do while sleep 10; do
${self.packages.${pkgs.system}.clan-merge}/bin/clan-merge \ ${self.packages.${pkgs.system}.clan-merge}/bin/clan-merge \
--allowed-users DavHau lassulus mic92 \ --allowed-users DavHau lassulus mic92 \
--repos clan-core --repos clan-core \
--bot-name clan-bot
done done
''; '';
}; };

View File

@ -30,12 +30,14 @@ def is_ci_green(pr: dict) -> bool:
return True return True
def decide_merge(pr: dict, allowed_users: list[str]) -> bool: def decide_merge(pr: dict, allowed_users: list[str], bot_name: str) -> bool:
if ( if (
pr["user"]["login"] in allowed_users pr["user"]["login"] in allowed_users
and pr["mergeable"] is True and pr["mergeable"] is True
and not pr["title"].startswith("WIP:") and not pr["title"].startswith("WIP:")
and pr["state"] == "open" and pr["state"] == "open"
# check if bot is assigned
and any(reviewer["login"] == bot_name for reviewer in pr["assignees"])
and is_ci_green(pr) and is_ci_green(pr)
): ):
return True return True
@ -50,10 +52,10 @@ def list_prs(repo: str) -> list:
return data return data
def list_prs_to_merge(prs: list, allowed_users: list[str]) -> list: def list_prs_to_merge(prs: list, allowed_users: list[str], bot_name: str) -> list:
prs_to_merge = [] prs_to_merge = []
for pr in prs: for pr in prs:
if decide_merge(pr, allowed_users) is True: if decide_merge(pr, allowed_users, bot_name) is True:
prs_to_merge.append(pr) prs_to_merge.append(pr)
return prs_to_merge return prs_to_merge
@ -67,6 +69,12 @@ def parse_args() -> argparse.Namespace:
help="list of users allowed to merge", help="list of users allowed to merge",
required=True, required=True,
) )
# option for bot-name
parser.add_argument(
"--bot-name",
help="name of the bot",
required=True,
)
# parse list of repository names for which to merge PRs # parse list of repository names for which to merge PRs
parser.add_argument( parser.add_argument(
"--repos", "--repos",
@ -93,9 +101,10 @@ def clan_merge(
allowed_users = args.allowed_users allowed_users = args.allowed_users
repos = args.repos repos = args.repos
dry_run = args.dry_run dry_run = args.dry_run
bot_name = args.bot_name
for repo in repos: for repo in repos:
prs = list_prs(repo) prs = list_prs(repo)
prs_to_merge = list_prs_to_merge(prs, allowed_users) prs_to_merge = list_prs_to_merge(prs, allowed_users, bot_name)
for pr in prs_to_merge: for pr in prs_to_merge:
url = ( url = (
"https://git.clan.lol/api/v1/repos/clan/" "https://git.clan.lol/api/v1/repos/clan/"

View File

@ -14,14 +14,16 @@ def test_no_args(capsys: pytest.CaptureFixture) -> None:
def test_decide_merge_allowed(monkeypatch: pytest.MonkeyPatch) -> None: def test_decide_merge_allowed(monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.setattr(clan_merge, "is_ci_green", lambda x: True) monkeypatch.setattr(clan_merge, "is_ci_green", lambda x: True)
allowed_users = ["foo"] allowed_users = ["foo"]
bot_name = "some-bot-name"
pr = dict( pr = dict(
id=1, id=1,
user=dict(login="foo"), user=dict(login="foo"),
title="Some PR Title", title="Some PR Title",
mergeable=True, mergeable=True,
state="open", state="open",
assignees=[dict(login=bot_name)],
) )
assert clan_merge.decide_merge(pr, allowed_users) is True assert clan_merge.decide_merge(pr, allowed_users, bot_name=bot_name) is True
def test_decide_merge_not_allowed(monkeypatch: pytest.MonkeyPatch) -> None: def test_decide_merge_not_allowed(monkeypatch: pytest.MonkeyPatch) -> None:
@ -33,6 +35,7 @@ def test_decide_merge_not_allowed(monkeypatch: pytest.MonkeyPatch) -> None:
title="Some PR Title", title="Some PR Title",
mergeable=True, mergeable=True,
state="open", state="open",
assignees=[dict(login="foo")],
) )
pr2 = dict( pr2 = dict(
id=1, id=1,
@ -40,6 +43,7 @@ def test_decide_merge_not_allowed(monkeypatch: pytest.MonkeyPatch) -> None:
title="WIP: xyz", title="WIP: xyz",
mergeable=True, mergeable=True,
state="open", state="open",
assignees=[dict(login="foo")],
) )
pr3 = dict( pr3 = dict(
id=1, id=1,
@ -47,6 +51,7 @@ def test_decide_merge_not_allowed(monkeypatch: pytest.MonkeyPatch) -> None:
title="Some PR Title", title="Some PR Title",
mergeable=False, mergeable=False,
state="open", state="open",
assignees=[dict(login="foo")],
) )
pr4 = dict( pr4 = dict(
id=1, id=1,
@ -54,15 +59,26 @@ def test_decide_merge_not_allowed(monkeypatch: pytest.MonkeyPatch) -> None:
title="Some PR Title", title="Some PR Title",
mergeable=True, mergeable=True,
state="closed", state="closed",
assignees=[dict(login="foo")],
) )
assert clan_merge.decide_merge(pr1, allowed_users) is False pr5 = dict(
assert clan_merge.decide_merge(pr2, allowed_users) is False id=1,
assert clan_merge.decide_merge(pr3, allowed_users) is False user=dict(login="foo"),
assert clan_merge.decide_merge(pr4, allowed_users) is False title="Some PR Title",
mergeable=True,
state="open",
assignees=[dict(login="clan-bot")],
)
assert clan_merge.decide_merge(pr1, allowed_users, bot_name="some-bot") is False
assert clan_merge.decide_merge(pr2, allowed_users, bot_name="some-bot") is False
assert clan_merge.decide_merge(pr3, allowed_users, bot_name="some-bot") is False
assert clan_merge.decide_merge(pr4, allowed_users, bot_name="some-bot") is False
assert clan_merge.decide_merge(pr5, allowed_users, bot_name="some-bot") is False
def test_list_prs_to_merge(monkeypatch: pytest.MonkeyPatch) -> None: def test_list_prs_to_merge(monkeypatch: pytest.MonkeyPatch) -> None:
monkeypatch.setattr(clan_merge, "is_ci_green", lambda x: True) monkeypatch.setattr(clan_merge, "is_ci_green", lambda x: True)
bot_name = "some-bot-name"
prs = [ prs = [
dict( dict(
id=1, id=1,
@ -72,6 +88,7 @@ def test_list_prs_to_merge(monkeypatch: pytest.MonkeyPatch) -> None:
state="open", state="open",
title="PR 1", title="PR 1",
mergeable=True, mergeable=True,
assignees=[dict(login=bot_name)],
), ),
dict( dict(
id=2, id=2,
@ -81,6 +98,7 @@ def test_list_prs_to_merge(monkeypatch: pytest.MonkeyPatch) -> None:
state="open", state="open",
title="WIP: xyz", title="WIP: xyz",
mergeable=True, mergeable=True,
assignees=[dict(login=bot_name)],
), ),
dict( dict(
id=3, id=3,
@ -90,6 +108,7 @@ def test_list_prs_to_merge(monkeypatch: pytest.MonkeyPatch) -> None:
state="open", state="open",
title="PR 2", title="PR 2",
mergeable=True, mergeable=True,
assignees=[dict(login=bot_name)],
), ),
] ]
assert clan_merge.list_prs_to_merge(prs, ["foo"]) == [prs[0]] assert clan_merge.list_prs_to_merge(prs, ["foo"], bot_name=bot_name) == [prs[0]]