contrib/phab-clean.py
author Simon Sapin <simon.sapin@octobus.net>
Fri, 28 May 2021 20:07:27 +0200
changeset 47347 73ddcedeaadf
parent 45830 c102b704edb5
child 48875 6000f5b25c9b
permissions -rwxr-xr-x
dirstate-tree: Change status() results to not borrow DirstateMap The `status` function takes a `&'tree mut DirstateMap<'on_disk>` parameter. `'on_disk` borrows a read-only byte buffer with the contents of the `.hg/dirstate` file. `DirstateMap` internally uses represents file paths as `std::borrow::Cow<'on_disk, HgPath>`, which borrows the byte buffer when possible and allocates an owned string if not, such as for files added to the dirstate after it was loaded from disk. Previously the return type of of `status` has a `'tree` lifetime, meaning it could borrow all paths from the `DirstateMap`. With this changeset, that lifetime is changed to `'on_disk` meaning that only paths from the byte buffer can be borrowed, and paths allocated by `DirstateMap` must be copied. Usually most paths are in the byte buffer, and most paths are not part of the return value of `status`, so the number of extra copies should be small. This change will enable `status` to mutate the `DirstateMap` after it has finished constructing its return value. Previously such mutation would be prevented by possible on-going borrows. Differential Revision: https://phab.mercurial-scm.org/D10824
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45830
c102b704edb5 global: use python3 in shebangs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 44217
diff changeset
     1
#!/usr/bin/env python3
44217
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     2
#
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     3
# A small script to automatically reject idle Diffs
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     4
#
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     5
# you need to set the PHABBOT_USER and PHABBOT_TOKEN environment variable for authentication
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     6
from __future__ import absolute_import, print_function
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     7
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     8
import datetime
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     9
import os
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    10
import sys
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    11
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    12
import phabricator
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    13
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    14
MESSAGE = """There seems to have been no activities on this Diff for the past 3 Months.
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    15
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    16
By policy, we are automatically moving it out of the `need-review` state.
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    17
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    18
Please, move it back to `need-review` without hesitation if this diff should still be discussed.
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    19
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    20
:baymax:need-review-idle:
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    21
"""
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    22
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    23
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    24
PHAB_URL = "https://phab.mercurial-scm.org/api/"
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    25
USER = os.environ.get("PHABBOT_USER", "baymax")
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    26
TOKEN = os.environ.get("PHABBOT_TOKEN")
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    27
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    28
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    29
NOW = datetime.datetime.now()
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    30
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    31
# 3 months in seconds
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    32
DELAY = 60 * 60 * 24 * 30 * 3
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    33
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    34
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    35
def get_all_diff(phab):
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    36
    """Fetch all the diff that the need review"""
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    37
    return phab.differential.query(
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    38
        status="status-needs-review",
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    39
        order="order-modified",
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    40
        paths=[('HG', None)],
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    41
    )
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    42
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    43
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    44
def filter_diffs(diffs, older_than):
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    45
    """filter diffs to only keep the one unmodified sin <older_than> seconds"""
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    46
    olds = []
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    47
    for d in diffs:
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    48
        modified = int(d['dateModified'])
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    49
        modified = datetime.datetime.fromtimestamp(modified)
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    50
        d["idleFor"] = idle_for = NOW - modified
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    51
        if idle_for.total_seconds() > older_than:
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    52
            olds.append(d)
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    53
    return olds
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    54
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    55
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    56
def nudge_diff(phab, diff):
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    57
    """Comment on the idle diff and reject it"""
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    58
    diff_id = int(d['id'])
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    59
    phab.differential.createcomment(
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    60
        revision_id=diff_id, message=MESSAGE, action="reject"
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    61
    )
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    62
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    63
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    64
if not USER:
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    65
    print(
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    66
        "not user specified please set PHABBOT_USER and PHABBOT_TOKEN",
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    67
        file=sys.stderr,
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    68
    )
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    69
elif not TOKEN:
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    70
    print(
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    71
        "not api-token specified please set PHABBOT_USER and PHABBOT_TOKEN",
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    72
        file=sys.stderr,
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    73
    )
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    74
    sys.exit(1)
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    75
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    76
phab = phabricator.Phabricator(USER, host=PHAB_URL, token=TOKEN)
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    77
phab.connect()
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    78
phab.update_interfaces()
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    79
print('Hello "%s".' % phab.user.whoami()['realName'])
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    80
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    81
diffs = get_all_diff(phab)
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    82
print("Found %d Diffs" % len(diffs))
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    83
olds = filter_diffs(diffs, DELAY)
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    84
print("Found %d old Diffs" % len(olds))
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    85
for d in olds:
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    86
    diff_id = d['id']
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    87
    status = d['statusName']
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    88
    modified = int(d['dateModified'])
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    89
    idle_for = d["idleFor"]
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    90
    msg = 'nudging D%s in "%s" state for %s'
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    91
    print(msg % (diff_id, status, idle_for))
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    92
    # uncomment to actually affect phab
064eb65d040f contrib: a small script to nudge lingering diff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    93
    nudge_diff(phab, d)