Mercurial > hg
view contrib/phab-clean.py @ 46667:93e9f448273c
rhg: Add support for automatic fallback to Python
`rhg` is a command-line application that can do a small subset of what
`hg` can. It is written entirely in Rust, which avoids the cost of starting
a Python interpreter and importing many Python modules.
In a script that runs many `hg` commands, this cost can add up.
However making users decide when to use `rhg` instead of `hg` is
not practical as we want the subset of supported functionality
to grow over time.
Instead we introduce "fallback" behavior where, when `rhg` encounters
something (a sub-command, a repository format, …) that is not implemented
in Rust-only, it does nothing but silently start a subprocess of
Python-based `hg` running the same command.
That way `rhg` becomes a drop-in replacement for `hg` that sometimes
goes faster. Whether Python is used should be an implementation detail
not apparent to users (other than through speed).
A new `fallback` value is added to the previously introduced
`rhg.on-unsupported` configuration key. When in this mode, the new
`rhg.fallback-executable` config is determine what command to use
to run a Python-based `hg`.
The previous `rhg.on-unsupported = abort-silent` configuration was designed
to let a wrapper script call `rhg` and then fall back to `hg` based on the
exit code. This is still available, but having fallback behavior built-in
in rhg might be easier for users instead of leaving that script "as an
exercise for the reader".
Using a subprocess like this is not idea, especially when `rhg` is to be
installed in `$PATH` as `hg`, since the other `hg.py` executable needs
to still be available… somewhere. Eventually this could be replaced
by using PyOxidizer to a have a single executable that embeds a Python
interpreter, but only starts it when needed.
Differential Revision: https://phab.mercurial-scm.org/D10093
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Mon, 01 Mar 2021 20:36:06 +0100 |
parents | c102b704edb5 |
children | 6000f5b25c9b |
line wrap: on
line source
#!/usr/bin/env python3 # # 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)