lfs: add a test showing bundle application could be broken
When a bundle containing LFS delta uses non-LFS delta-base, or vice-versa,
the bundle will fail to apply.
Differential Revision: https://phab.mercurial-scm.org/D2066
--- a/tests/drawdag.py Sun Mar 04 14:53:57 2018 -0500
+++ b/tests/drawdag.py Tue Feb 06 16:08:57 2018 -0800
@@ -371,7 +371,8 @@
comments = list(_getcomments(text))
filere = re.compile(br'^(\w+)/([\w/]+)\s*=\s*(.*)$', re.M)
for name, path, content in filere.findall(b'\n'.join(comments)):
- files[name][path] = content.replace(br'\n', b'\n')
+ content = content.replace(br'\n', b'\n').replace(br'\1', b'\1')
+ files[name][path] = content
committed = {None: node.nullid} # {name: node}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-lfs-bundle.t Tue Feb 06 16:08:57 2018 -0800
@@ -0,0 +1,100 @@
+In this test, we want to test LFS bundle application on both LFS and non-LFS
+repos.
+
+To make it more interesting, the file revisions will contain hg filelog
+metadata ('\1\n'). The bundle will have 1 file revision overlapping with the
+destination repo.
+
+# rev 1 2 3
+# repo: yes yes no
+# bundle: no (base) yes yes (deltabase: 2 if possible)
+
+It is interesting because rev 2 could have been stored as LFS in the repo, and
+non-LFS in the bundle; or vice-versa.
+
+Init
+
+ $ cat >> $HGRCPATH << EOF
+ > [extensions]
+ > lfs=
+ > drawdag=$TESTDIR/drawdag.py
+ > [lfs]
+ > url=file:$TESTTMP/lfs-remote
+ > EOF
+
+Helper functions
+
+ $ commitxy() {
+ > hg debugdrawdag "$@" <<'EOS'
+ > Y # Y/X=\1\nAAAA\nE\nF
+ > | # Y/Y=\1\nAAAA\nG\nH
+ > X # X/X=\1\nAAAA\nC\n
+ > # X/Y=\1\nAAAA\nD\n
+ > EOS
+ > }
+
+ $ commitz() {
+ > hg debugdrawdag "$@" <<'EOS'
+ > Z # Z/X=\1\nAAAA\nI\n
+ > | # Z/Y=\1\nAAAA\nJ\n
+ > | # Z/Z=\1\nZ
+ > Y
+ > EOS
+ > }
+
+ $ enablelfs() {
+ > cat >> .hg/hgrc <<EOF
+ > [lfs]
+ > track=all()
+ > EOF
+ > }
+
+Generate bundles
+
+ $ for i in normal lfs; do
+ > NAME=src-$i
+ > hg init $TESTTMP/$NAME
+ > cd $TESTTMP/$NAME
+ > [ $i = lfs ] && enablelfs
+ > commitxy
+ > commitz
+ > hg bundle -q --base X -r Y+Z $TESTTMP/$NAME.bundle
+ > SRCNAMES="$SRCNAMES $NAME"
+ > done
+
+Prepare destination repos
+
+ $ for i in normal lfs; do
+ > NAME=dst-$i
+ > hg init $TESTTMP/$NAME
+ > cd $TESTTMP/$NAME
+ > [ $i = lfs ] && enablelfs
+ > commitxy
+ > DSTNAMES="$DSTNAMES $NAME"
+ > done
+
+Apply bundles
+
+ $ for i in $SRCNAMES; do
+ > for j in $DSTNAMES; do
+ > echo ---- Applying $i.bundle to $j ----
+ > cp -R $TESTTMP/$j $TESTTMP/tmp-$i-$j
+ > cd $TESTTMP/tmp-$i-$j
+ > if hg unbundle $TESTTMP/$i.bundle -q 2>/dev/null; then
+ > hg verify -q && echo OK
+ > else
+ > echo CRASHED
+ > fi
+ > done
+ > done
+ ---- Applying src-normal.bundle to dst-normal ----
+ OK
+ ---- Applying src-normal.bundle to dst-lfs ----
+ X@2: unpacking bcc7d23fa6b7: integrity check failed on data/X.i:2
+ Y@2: unpacking 46017a6640e7: integrity check failed on data/Y.i:2
+ 2 integrity errors encountered!
+ (first damaged changeset appears to be 2)
+ ---- Applying src-lfs.bundle to dst-normal ----
+ CRASHED
+ ---- Applying src-lfs.bundle to dst-lfs ----
+ OK