[PATCH] Reproduce crash where synthetic revs break merge detection (issue1578)

Greg Ward greg-hg at gerg.ca
Sat Apr 18 21:55:16 CDT 2009


# HG changeset patch
# User Greg Ward <greg-hg at gerg.ca>
# Date 1240075788 14400
# Node ID 3d1f4648305f0cca07b01b8094dffc5d7bb9db86
# Parent  81aba9e79054e5af5a17cecd90178dcd35b76b8b
Reproduce crash where synthetic revs break merge detection (issue1578).

(The fix for this was committed as 9bbcfa898cd3.)

diff --git a/tests/test-convert-cvs-synthetic b/tests/test-convert-cvs-synthetic
--- a/tests/test-convert-cvs-synthetic
+++ b/tests/test-convert-cvs-synthetic
@@ -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,55 @@
 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 log output
-hg -R proj.hg log --template "{rev} {desc}\n"
+echo "% hg glog output (#1)"
+hg -R proj.hg glog --template "{rev} {desc}\n"
+
+echo "% convert to hg (#2: with merge detection)"
+rm -rf proj.hg
+filterpath hg convert \
+  --config convert.cvsps.mergefrom="\"^MERGE from (\S+):\"" \
+  --datesort \
+  proj proj.hg
+
+echo "% hg glog output (#2)"
+hg -R proj.hg glog --template "{rev} {desc}\n"
diff --git a/tests/test-convert-cvs-synthetic.out b/tests/test-convert-cvs-synthetic.out
--- a/tests/test-convert-cvs-synthetic.out
+++ b/tests/test-convert-cvs-synthetic.out
@@ -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.hg 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
+


More information about the Mercurial-devel mailing list