Mercurial > dotfiles
diff unixSoft/bin/havepatch @ 372:ce87db9038f5
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.
author | Augie Fackler <raf@durin42.com> |
---|---|
date | Tue, 13 Oct 2015 11:04:51 -0400 |
parents | |
children | d81eb79e4f4c |
line wrap: on
line diff
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)