Mercurial > hg
changeset 36742:4e41b59633fa stable
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
author | Jun Wu <quark@fb.com> |
---|---|
date | Tue, 06 Feb 2018 16:08:57 -0800 |
parents | 52b344e977b7 |
children | d031609b3cb7 |
files | tests/drawdag.py tests/test-lfs-bundle.t |
diffstat | 2 files changed, 102 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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