view unixSoft/bin/havepatch @ 436:97f12f43f73b

havepatch: always import hg libs from the hg we're using
author Augie Fackler <raf@durin42.com>
date Sun, 18 Jun 2017 22:45:40 -0400
parents d81eb79e4f4c
children
line wrap: on
line source

#!/usr/bin/env python
"""Detect if a patch is already applied in a Mercurial repository."""
import json
import os
import re
import subprocess
import sys

# Always load hg libraries from the hg we can find on $PATH.
hglib = json.loads(subprocess.check_output(
    ['hg', 'debuginstall', '-Tjson']))[0]['hgmodules']
sys.path.insert(0, os.path.dirname(hglib))

from mercurial import util

def main(argv):
    os.chdir(util.expandpath('~/Programming/hg/crew'))
    os.environ['EDITOR'] = 'true'
    pp = subprocess.Popen(['patchpipe'], stdin=sys.stdin,
                          stdout=subprocess.PIPE)
    patchdata = pp.stdout.read()
    summary = (l for l in patchdata.splitlines()
               if not l.startswith('#')).next()
    # First pass: look for exact summary matches after tag 3.5
    ret = subprocess.call(['hg', 'log', '-r',
                           '(not ::3.5) and grep(%r)' % summary])
    if ret != 0:
        # Failing that, look for obsmarkers that might be relevant. If
        # we could actually do something like 'hg log -r
        # successors($NODE)', that'd be preferable to even the
        # summary-matching from above.
        print 'no exact match in hg log, checking obsmarkers'
        nodematch = re.search('# Node ID ([0-9a-f]{40})', patchdata)
        if nodematch:
            os.system('hg debugobsolete | grep %s' % nodematch.group(1))
    sys.exit(ret)

if __name__ == '__main__':
    main(sys.argv)