Mercurial > hg
changeset 44217:064eb65d040f
contrib: a small script to nudge lingering diff
After a discussion on IRC with various reviewers. It seems like a good idea to
have some automatic cleanup of old, inactive diffs.
Here is a small script able to do so. I am preparing to unleash it on our
phabricator instance.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Fri, 24 Jan 2020 12:50:27 +0100 |
parents | 281b6690e646 |
children | 3e794419d234 |
files | contrib/phab-clean.py tests/test-check-module-imports.t |
diffstat | 2 files changed, 94 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contrib/phab-clean.py Fri Jan 24 12:50:27 2020 +0100 @@ -0,0 +1,93 @@ +#!/usr/bin/env python +# +# A small script to automatically reject idle Diffs +# +# you need to set the PHABBOT_USER and PHABBOT_TOKEN environment variable for authentication +from __future__ import absolute_import, print_function + +import datetime +import os +import sys + +import phabricator + +MESSAGE = """There seems to have been no activities on this Diff for the past 3 Months. + +By policy, we are automatically moving it out of the `need-review` state. + +Please, move it back to `need-review` without hesitation if this diff should still be discussed. + +:baymax:need-review-idle: +""" + + +PHAB_URL = "https://phab.mercurial-scm.org/api/" +USER = os.environ.get("PHABBOT_USER", "baymax") +TOKEN = os.environ.get("PHABBOT_TOKEN") + + +NOW = datetime.datetime.now() + +# 3 months in seconds +DELAY = 60 * 60 * 24 * 30 * 3 + + +def get_all_diff(phab): + """Fetch all the diff that the need review""" + return phab.differential.query( + status="status-needs-review", + order="order-modified", + paths=[('HG', None)], + ) + + +def filter_diffs(diffs, older_than): + """filter diffs to only keep the one unmodified sin <older_than> seconds""" + olds = [] + for d in diffs: + modified = int(d['dateModified']) + modified = datetime.datetime.fromtimestamp(modified) + d["idleFor"] = idle_for = NOW - modified + if idle_for.total_seconds() > older_than: + olds.append(d) + return olds + + +def nudge_diff(phab, diff): + """Comment on the idle diff and reject it""" + diff_id = int(d['id']) + phab.differential.createcomment( + revision_id=diff_id, message=MESSAGE, action="reject" + ) + + +if not USER: + print( + "not user specified please set PHABBOT_USER and PHABBOT_TOKEN", + file=sys.stderr, + ) +elif not TOKEN: + print( + "not api-token specified please set PHABBOT_USER and PHABBOT_TOKEN", + file=sys.stderr, + ) + sys.exit(1) + +phab = phabricator.Phabricator(USER, host=PHAB_URL, token=TOKEN) +phab.connect() +phab.update_interfaces() +print('Hello "%s".' % phab.user.whoami()['realName']) + +diffs = get_all_diff(phab) +print("Found %d Diffs" % len(diffs)) +olds = filter_diffs(diffs, DELAY) +print("Found %d old Diffs" % len(olds)) +for d in olds: + diff_id = d['id'] + status = d['statusName'] + modified = int(d['dateModified']) + idle_for = d["idleFor"] + msg = 'nudging D%s in "%s" state for %s' + print(msg % (diff_id, status, idle_for)) + # uncomment to actually affect phab + nudge_diff(phab, d)
--- a/tests/test-check-module-imports.t Sun Jan 26 16:23:57 2020 -0800 +++ b/tests/test-check-module-imports.t Fri Jan 24 12:50:27 2020 +0100 @@ -24,6 +24,7 @@ > -X contrib/packaging/hg-docker \ > -X contrib/packaging/hgpackaging/ \ > -X contrib/packaging/inno/ \ + > -X contrib/phab-clean.py \ > -X contrib/python-zstandard/ \ > -X contrib/win32/hgwebdir_wsgi.py \ > -X contrib/perf-utils/perf-revlog-write-plot.py \