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)