xref: /aosp_15_r20/external/mesa3d/bin/ci/marge_queue.py (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*61046927SAndroid Build Coastguard Worker# Copyright © 2020 - 2023 Collabora Ltd.
3*61046927SAndroid Build Coastguard Worker# Authors:
4*61046927SAndroid Build Coastguard Worker#   David Heidelberg <[email protected]>
5*61046927SAndroid Build Coastguard Worker#
6*61046927SAndroid Build Coastguard Worker# SPDX-License-Identifier: MIT
7*61046927SAndroid Build Coastguard Worker
8*61046927SAndroid Build Coastguard Worker"""
9*61046927SAndroid Build Coastguard WorkerMonitors Marge-bot and return number of assigned MRs.
10*61046927SAndroid Build Coastguard Worker"""
11*61046927SAndroid Build Coastguard Worker
12*61046927SAndroid Build Coastguard Workerimport argparse
13*61046927SAndroid Build Coastguard Workerimport time
14*61046927SAndroid Build Coastguard Workerimport sys
15*61046927SAndroid Build Coastguard Workerfrom datetime import datetime, timezone
16*61046927SAndroid Build Coastguard Workerfrom dateutil import parser
17*61046927SAndroid Build Coastguard Worker
18*61046927SAndroid Build Coastguard Workerimport gitlab
19*61046927SAndroid Build Coastguard Workerfrom gitlab_common import read_token, pretty_duration
20*61046927SAndroid Build Coastguard Worker
21*61046927SAndroid Build Coastguard WorkerREFRESH_WAIT = 30
22*61046927SAndroid Build Coastguard WorkerMARGE_BOT_USER_ID = 9716
23*61046927SAndroid Build Coastguard Worker
24*61046927SAndroid Build Coastguard Worker
25*61046927SAndroid Build Coastguard Workerdef parse_args() -> None:
26*61046927SAndroid Build Coastguard Worker    """Parse args"""
27*61046927SAndroid Build Coastguard Worker    parse = argparse.ArgumentParser(
28*61046927SAndroid Build Coastguard Worker        description="Tool to show merge requests assigned to the marge-bot",
29*61046927SAndroid Build Coastguard Worker    )
30*61046927SAndroid Build Coastguard Worker    parse.add_argument(
31*61046927SAndroid Build Coastguard Worker        "--wait", action="store_true", help="wait until CI is free",
32*61046927SAndroid Build Coastguard Worker    )
33*61046927SAndroid Build Coastguard Worker    parse.add_argument(
34*61046927SAndroid Build Coastguard Worker        "--token",
35*61046927SAndroid Build Coastguard Worker        metavar="token",
36*61046927SAndroid Build Coastguard Worker        help="force GitLab token, otherwise it's read from ~/.config/gitlab-token",
37*61046927SAndroid Build Coastguard Worker    )
38*61046927SAndroid Build Coastguard Worker    return parse.parse_args()
39*61046927SAndroid Build Coastguard Worker
40*61046927SAndroid Build Coastguard Worker
41*61046927SAndroid Build Coastguard Workerif __name__ == "__main__":
42*61046927SAndroid Build Coastguard Worker    args = parse_args()
43*61046927SAndroid Build Coastguard Worker    token = read_token(args.token)
44*61046927SAndroid Build Coastguard Worker    gl = gitlab.Gitlab(url="https://gitlab.freedesktop.org", private_token=token)
45*61046927SAndroid Build Coastguard Worker
46*61046927SAndroid Build Coastguard Worker    project = gl.projects.get("mesa/mesa")
47*61046927SAndroid Build Coastguard Worker
48*61046927SAndroid Build Coastguard Worker    while True:
49*61046927SAndroid Build Coastguard Worker        mrs = project.mergerequests.list(assignee_id=MARGE_BOT_USER_ID, scope="all", state="opened", get_all=True)
50*61046927SAndroid Build Coastguard Worker
51*61046927SAndroid Build Coastguard Worker        jobs_num = len(mrs)
52*61046927SAndroid Build Coastguard Worker        for mr in mrs:
53*61046927SAndroid Build Coastguard Worker            updated = parser.parse(mr.updated_at)
54*61046927SAndroid Build Coastguard Worker            now = datetime.now(timezone.utc)
55*61046927SAndroid Build Coastguard Worker            diff = (now - updated).total_seconds()
56*61046927SAndroid Build Coastguard Worker            print(
57*61046927SAndroid Build Coastguard Worker                f"⛭ \u001b]8;;{mr.web_url}\u001b\\{mr.title}\u001b]8;;\u001b\\ ({pretty_duration(diff)})"
58*61046927SAndroid Build Coastguard Worker            )
59*61046927SAndroid Build Coastguard Worker
60*61046927SAndroid Build Coastguard Worker        print("Job waiting: " + str(jobs_num))
61*61046927SAndroid Build Coastguard Worker
62*61046927SAndroid Build Coastguard Worker        if jobs_num == 0:
63*61046927SAndroid Build Coastguard Worker            sys.exit(0)
64*61046927SAndroid Build Coastguard Worker        if not args.wait:
65*61046927SAndroid Build Coastguard Worker            sys.exit(min(jobs_num, 127))
66*61046927SAndroid Build Coastguard Worker
67*61046927SAndroid Build Coastguard Worker        time.sleep(REFRESH_WAIT)
68