summaryrefslogtreecommitdiff
path: root/js/src/find-child.py
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/find-child.py')
-rw-r--r--js/src/find-child.py69
1 files changed, 69 insertions, 0 deletions
diff --git a/js/src/find-child.py b/js/src/find-child.py
new file mode 100644
index 0000000..4980767
--- /dev/null
+++ b/js/src/find-child.py
@@ -0,0 +1,69 @@
+#!/usr/bin/python
+#
+# The output of this script is a splicemap.
+#
+# A splicemap is used by the mercurial 'convert' extension to direct its
+# splicing operation.
+#
+# The script assumes you already have a destination repository
+# containing a conversion somewhere in its history, but that you've
+# possibly mixed some new commits on top of that conversion. It outputs
+# a splicemap that picks up the conversion where it left off (with the
+# first descendant, in the source repo, of the src rev given by --start,
+# if or rather the first descendant that would be included by the
+# conversion's filemap) and connects them to the current tip of the
+# destination repo.
+#
+
+from mercurial import ui, hg
+from hgext.convert.filemap import filemapper
+from optparse import OptionParser
+
+import sys
+
+parser = OptionParser()
+
+parser.add_option("-s", "--src", dest="src",
+ help="source repository", metavar="REPO")
+
+parser.add_option("-d", "--dst", dest="dst",
+ help="destination repository", metavar="REPO")
+
+parser.add_option("-t", "--start", dest="start",
+ help="starting revid in source repository", metavar="REV")
+
+parser.add_option("-f", "--filemap", dest="filemap",
+ help="filemap used in conversion", metavar="PATH")
+
+(options, args) = parser.parse_args()
+
+if not (options.src and options.dst and options.start):
+ parser.print_help()
+ exit(1)
+
+u = ui.ui()
+
+src_repo = hg.repository(u, options.src)
+dst_repo = hg.repository(u, options.dst)
+
+fm = None
+if options.filemap:
+ fm = filemapper(u, options.filemap)
+
+last_converted_src = src_repo[options.start]
+
+dst_tip = dst_repo.changectx(dst_repo.changelog.tip()).hex()
+revs = last_converted_src.children()
+
+while len(revs) != 0:
+ tmp = revs
+ revs = []
+ for child in tmp:
+ for f in child.files():
+ if (not fm) or fm(f):
+ u.write("%s %s\n" % (child.hex(), dst_tip))
+ exit(0);
+ revs.extend(child.children())
+
+sys.stderr.write("No candidate child found in source repository\n")
+exit(1)