hg-fast-export: Compare HG revisions when merging
authorMatthias Urlichs <smurf@smurf.noris.de>
Sun, 16 Nov 2008 14:43:44 +0000 (15:43 +0100)
committerFrej Drejhammar <frej.drejhammar@gmail.com>
Mon, 23 Feb 2009 17:38:26 +0000 (18:38 +0100)
hg-fast-export uses hg's branch order (from the log) when merging,
this is a problem. Consider the case:

HG repo A  has revisions 1-10. Repository B is cloned from that.
Subsequently, A adds revision 11, and B adds a different change which
also has revision 11. If B now pulls from A, A's rev11 will have the
number 12; if A then pulls from B, the reverse also holds. So the logs
are different even though they contain the exact same changes.

hg-fast-export will thus create different git repositories for A and B,
even though the contents are identical for all practical purposes.
In particular, the repos would be identical if A and B had used git from
the beginning.

To fix that, compare HG revisions instead of log positions.

hg-fast-export.py

index 6de1e0a..cdb838b 100755 (executable)
@@ -180,8 +180,10 @@ def export_commit(ui,repo,revision,marks,mapping,heads,last,max,count,authors,so
   wr()
 
   pidx1, pidx2 = 0, 1
-  if parents[0] < parents[1]:
-    pidx1, pidx2 = 1, 0
+  if parents[1] > 0:
+    if parents[0] <= 0 or \
+        repo.changelog.node(parents[0]) < repo.changelog.node(parents[1]):
+      pidx1, pidx2 = 1, 0
 
   full_rev=False
   if revision==0: full_rev=True