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