# HG changeset patch # User Augie Fackler # Date 1444748691 14400 # Node ID ce87db9038f524cd3d5d7df3d34dbe35f9b9307c # Parent 7d59b638f71141f56ffcc71a36a90ddf5ffb701c havepatch: new script to easily check if a mailed patch is applied Right now this only works on the hg repo, and it assumes the patch was applied as a descendant of 3.5 to keep the checks quick. In a perfect world I'd be able to do this all with obsolete marker checks, but that doesn't seem to be a good option yet. diff --git a/unixSoft/bin/havepatch b/unixSoft/bin/havepatch new file mode 100755 --- /dev/null +++ b/unixSoft/bin/havepatch @@ -0,0 +1,33 @@ +#!/usr/bin/env python +"""Detect if a patch is already applied in a Mercurial repository.""" +import sys +import subprocess +import os +import re + +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)