Reproduce crash where synthetic revs break merge detection (issue1578).
authorGreg Ward <greg-hg@gerg.ca>
Sat, 18 Apr 2009 13:29:48 -0400
changeset 8249 2c7c973c2abd
parent 8248 d093e57671ea
child 8250 1b60efdb8bc5
Reproduce crash where synthetic revs break merge detection (issue1578). (The fix for this was committed as 9bbcfa898cd3.) Slightly edited by Patrick Mezard <pmezard@gmail.com>
tests/test-convert-cvs-synthetic
tests/test-convert-cvs-synthetic.out
--- a/tests/test-convert-cvs-synthetic	Wed Apr 29 21:48:59 2009 +0200
+++ b/tests/test-convert-cvs-synthetic	Sat Apr 18 13:29:48 2009 -0400
@@ -7,6 +7,7 @@
 
 echo "[extensions]" >> $HGRCPATH
 echo "convert = " >> $HGRCPATH
+echo "graphlog = " >> $HGRCPATH
 echo "[convert]" >> $HGRCPATH
 echo "cvsps=builtin" >> $HGRCPATH
 
@@ -51,10 +52,10 @@
 cvscall -q tag -b v1_1
 
 echo % create file2 on branch v1_0
-cvscall -q up -rv1_0
+cvscall -Q up -rv1_0
 touch file2
 cvscall -Q add file2
-cvsci -m"add file2 on branch v1_0" file2
+cvsci -m"add file2" file2
 
 echo % create file3, file4 on branch v1_1
 cvscall -Q up -rv1_1
@@ -64,15 +65,54 @@
 cvsci -m"add file3, file4 on branch v1_1" file3 file4
 
 echo % merge file2 from v1_0 to v1_1
-cvscall -q up -jv1_0
-cvsci -m"merge file2 from v1_0 to v1_1"
+cvscall -Q up -jv1_0
+cvsci -m"MERGE from v1_0: add file2"
+
+# Step things up a notch: now we make the history really hairy, with
+# changes bouncing back and forth between trunk and v1_2 and merges
+# going both ways.  (I.e., try to model the real world.)
+
+echo "% create branch v1_2"
+cvscall -Q up -A
+cvscall -q tag -b v1_2
+
+echo "% create file5 on branch v1_2"
+cvscall -Q up -rv1_2
+touch file5
+cvs -Q add file5
+cvsci -m"add file5 on v1_2"
+
+echo "% create file6 on trunk post-v1_2"
+cvscall -Q up -A
+touch file6
+cvscall -Q add file6
+cvsci -m"add file6 on trunk post-v1_2"
+
+echo "% merge file5 from v1_2 to trunk"
+cvscall -Q up -A
+cvscall -Q up -jv1_2 file5
+cvsci -m"MERGE from v1_2: add file5"
+
+echo "% merge file6 from trunk to v1_2"
+cvscall -Q up -rv1_2
+cvscall up -jHEAD file6
+cvsci -m"MERGE from HEAD: add file6"
 
 echo % cvs rlog output
 filterpath cvscall -q rlog proj | egrep '^(RCS file|revision)'
 
-echo % convert to hg
+echo "% convert to hg (#1)"
 cd ..
-filterpath hg convert proj proj.hg
+filterpath hg convert --datesort proj proj.hg
+
+echo "% hg glog output (#1)"
+hg -R proj.hg glog --template "{rev} {desc}\n"
 
-echo % hg log output
-hg -R proj.hg log --template "{rev} {desc}\n"
+echo "% convert to hg (#2: with merge detection)"
+filterpath hg convert \
+  --config convert.cvsps.mergefrom="\"^MERGE from (\S+):\"" \
+  --datesort \
+  proj proj.hg2
+
+echo "% hg glog output (#2)"
+hg -R proj.hg2 glog --template "{rev} {desc}\n"
--- a/tests/test-convert-cvs-synthetic.out	Wed Apr 29 21:48:59 2009 +0200
+++ b/tests/test-convert-cvs-synthetic.out	Sat Apr 18 13:29:48 2009 -0400
@@ -10,17 +10,36 @@
 cvs -f -q tag -b v1_1
 T file1
 % create file2 on branch v1_0
-cvs -f -q up -rv1_0
+cvs -f -Q up -rv1_0
 cvs -f -Q add file2
-cvs -f ci -madd file2 on branch v1_0 file2
+cvs -f ci -madd file2 file2
 % create file3, file4 on branch v1_1
 cvs -f -Q up -rv1_1
 cvs -f -Q add file3 file4
 cvs -f ci -madd file3, file4 on branch v1_1 file3 file4
 % merge file2 from v1_0 to v1_1
-cvs -f -q up -jv1_0
-U file2
-cvs -f ci -mmerge file2 from v1_0 to v1_1
+cvs -f -Q up -jv1_0
+cvs -f ci -mMERGE from v1_0: add file2
+% create branch v1_2
+cvs -f -Q up -A
+cvs -f -q tag -b v1_2
+T file1
+% create file5 on branch v1_2
+cvs -f -Q up -rv1_2
+cvs -f ci -madd file5 on v1_2
+% create file6 on trunk post-v1_2
+cvs -f -Q up -A
+cvs -f -Q add file6
+cvs -f ci -madd file6 on trunk post-v1_2
+% merge file5 from v1_2 to trunk
+cvs -f -Q up -A
+cvs -f -Q up -jv1_2 file5
+cvs -f ci -mMERGE from v1_2: add file5
+% merge file6 from trunk to v1_2
+cvs -f -Q up -rv1_2
+cvs -f up -jHEAD file6
+U file6
+cvs -f ci -mMERGE from HEAD: add file6
 % cvs rlog output
 RCS file: *REPO*/proj/file1,v
 revision 1.1
@@ -35,23 +54,83 @@
 RCS file: *REPO*/proj/Attic/file4,v
 revision 1.1
 revision 1.1.2.1
-% convert to hg
+RCS file: *REPO*/proj/file5,v
+revision 1.2
+revision 1.1
+revision 1.1.2.1
+RCS file: *REPO*/proj/file6,v
+revision 1.1
+revision 1.1.2.2
+revision 1.1.2.1
+% convert to hg (#1)
 initializing destination proj.hg repository
 connecting to *REPO*
 scanning source...
 using builtin cvsps
 collecting CVS rlog
-9 log entries
+15 log entries
 creating changesets
-4 changeset entries
+8 changeset entries
 sorting...
 converting...
-3 add file1 on trunk
-2 add file2 on branch v1_0
-1 add file3, file4 on branch v1_1
-0 merge file2 from v1_0 to v1_1
-% hg log output
-3 merge file2 from v1_0 to v1_1
-2 add file3, file4 on branch v1_1
-1 add file2 on branch v1_0
-0 add file1 on trunk
+7 add file1 on trunk
+6 add file2
+5 add file3, file4 on branch v1_1
+4 MERGE from v1_0: add file2
+3 add file5 on v1_2
+2 add file6 on trunk post-v1_2
+1 MERGE from v1_2: add file5
+0 MERGE from HEAD: add file6
+% hg glog output (#1)
+o  7 MERGE from HEAD: add file6
+|
+| o  6 MERGE from v1_2: add file5
+| |
+| o  5 add file6 on trunk post-v1_2
+| |
+o |  4 add file5 on v1_2
+|/
+| o  3 MERGE from v1_0: add file2
+| |
+| o  2 add file3, file4 on branch v1_1
+|/
+| o  1 add file2
+|/
+o  0 add file1 on trunk
+
+% convert to hg (#2: with merge detection)
+initializing destination proj.hg2 repository
+connecting to *REPO*
+scanning source...
+using builtin cvsps
+collecting CVS rlog
+15 log entries
+creating changesets
+8 changeset entries
+sorting...
+converting...
+7 add file1 on trunk
+6 add file2
+5 add file3, file4 on branch v1_1
+4 MERGE from v1_0: add file2
+3 add file5 on v1_2
+2 add file6 on trunk post-v1_2
+1 MERGE from v1_2: add file5
+0 MERGE from HEAD: add file6
+% hg glog output (#2)
+o    7 MERGE from HEAD: add file6
+|\
+| o  6 MERGE from v1_2: add file5
+| |
+| o  5 add file6 on trunk post-v1_2
+| |
+o |  4 add file5 on v1_2
+|/
+| o    3 MERGE from v1_0: add file2
+| |\
++---o  2 add file3, file4 on branch v1_1
+| |
+| o  1 add file2
+|/
+o  0 add file1 on trunk
+