contrib/phab-clean.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Sun, 05 Apr 2020 13:12:05 +0200
changeset 44863 640d5b3bd060
parent 44291 064eb65d040f
child 45849 c102b704edb5
permissions -rwxr-xr-x
nodemap: also use persistent nodemap for manifest The manifest as a different usage pattern than the changelog. First, while the lookup in changelog are not garanteed to match, the lookup in the manifest nodemap come from changelog and will exist in the manifest. In addition, looking up a manifest almost always result in unpacking a manifest an operation that rarely come cheap. Nevertheless, using a persistent nodemap provide a significant gain for some operations. For our measurementw, we use `hg cat --rev REV FILE` on the our reference mozilla-try. On this repository the persistent nodemap cache is about 29 MB in side for a total store side of 11,988 MB File with large history (file: b2g/config/gaia.json, revision: 195a1146daa0) no optimisation: 0.358s using mmap for index: 0.297s (-0.061s) persistent nodemap for changelog only: 0.275s (-0.024s) persistent nodemap for manifest too: 0.258s (-0.017s) File with small history (file: .hgignore, revision: 195a1146daa0) no optimisation: 0.377s using mmap for index: 0.296s (-0.061s) persistent nodemap for changelog only: 0.274s (-0.022s) persistent nodemap for manifest too: 0.257s (-0.017s) Same file but using a revision (8ba995b74e18) with a smaller manifest (3944829 bytes vs 10 bytes) no optimisation: 0.192s (-0.185s) using mmap for index: 0.131s (-0.061s) persistent nodemap for changelog only: 0.106s (-0.025s) persistent nodemap for manifest too: 0.087s (-0.019s) Differential Revision: https://phab.mercurial-scm.org/D8410

#!/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)