tests/test-lfs.t
changeset 35474 16660fd4428d
parent 35473 02f54a1ec9eb
child 35476 417e8e040102
--- a/tests/test-lfs.t	Tue Dec 19 17:53:44 2017 -0500
+++ b/tests/test-lfs.t	Thu Nov 16 22:52:53 2017 -0500
@@ -605,6 +605,193 @@
   added 3 changesets with 2 changes to 1 files
   $ hg -R repo14 -q verify
 
+Test damaged file scenarios.  (This also damages the usercache because of the
+hardlinks.)
+
+  $ echo 'damage' >> repo5/.hg/store/lfs/objects/66/100b384bf761271b407d79fc30cdd0554f3b2c5d944836e936d584b88ce88e
+
+Repo with damaged lfs objects in any revision will fail verification.
+
+  $ hg -R repo5 verify
+  checking changesets
+  checking manifests
+  crosschecking files in changesets and manifests
+  checking files
+   l@1: unpacking 46a2f24864bc: integrity check failed on data/l.i:0
+   large@0: unpacking 2c531e0992ff: integrity check failed on data/large.i:0
+  4 files, 5 changesets, 10 total revisions
+  2 integrity errors encountered!
+  (first damaged changeset appears to be 0)
+  [1]
+
+Updates work after cloning a damaged repo, if the damaged lfs objects aren't in
+the update destination.  Those objects won't be added to the new repo's store
+because they aren't accessed.
+
+  $ hg clone -v repo5 fromcorrupt
+  updating to branch default
+  resolving manifests
+  getting l
+  lfs: found 22f66a3fc0b9bf3f012c814303995ec07099b3a9ce02a7af84b5970811074a3b in the usercache
+  getting s
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ test -f fromcorrupt/.hg/store/lfs/objects/66/100b384bf761271b407d79fc30cdd0554f3b2c5d944836e936d584b88ce88e
+  [1]
+
+Verify will copy/link all lfs objects into the local store that aren't already
+present.  Bypass the corrupted usercache to show that verify works when fed by
+the (uncorrupted) remote store.
+
+  $ hg -R fromcorrupt --config lfs.usercache=emptycache verify -v
+  repository uses revlog format 1
+  checking changesets
+  checking manifests
+  crosschecking files in changesets and manifests
+  checking files
+  lfs: adding 66100b384bf761271b407d79fc30cdd0554f3b2c5d944836e936d584b88ce88e to the usercache
+  lfs: found 66100b384bf761271b407d79fc30cdd0554f3b2c5d944836e936d584b88ce88e in the local lfs store
+  lfs: found 22f66a3fc0b9bf3f012c814303995ec07099b3a9ce02a7af84b5970811074a3b in the local lfs store
+  lfs: found 66100b384bf761271b407d79fc30cdd0554f3b2c5d944836e936d584b88ce88e in the local lfs store
+  lfs: adding 89b6070915a3d573ff3599d1cda305bc5e38549b15c4847ab034169da66e1ca8 to the usercache
+  lfs: found 89b6070915a3d573ff3599d1cda305bc5e38549b15c4847ab034169da66e1ca8 in the local lfs store
+  lfs: adding b1a6ea88da0017a0e77db139a54618986e9a2489bee24af9fe596de9daac498c to the usercache
+  lfs: found b1a6ea88da0017a0e77db139a54618986e9a2489bee24af9fe596de9daac498c in the local lfs store
+  4 files, 5 changesets, 10 total revisions
+
+BUG: Verify will copy/link a corrupted file from the usercache into the local
+store, and poison it.  (The verify with a good remote now fails.)
+
+  $ rm -r fromcorrupt/.hg/store/lfs/objects/66/100b384bf761271b407d79fc30cdd0554f3b2c5d944836e936d584b88ce88e
+  $ hg -R fromcorrupt verify -v
+  repository uses revlog format 1
+  checking changesets
+  checking manifests
+  crosschecking files in changesets and manifests
+  checking files
+  lfs: found 66100b384bf761271b407d79fc30cdd0554f3b2c5d944836e936d584b88ce88e in the usercache
+   l@1: unpacking 46a2f24864bc: integrity check failed on data/l.i:0
+  lfs: found 22f66a3fc0b9bf3f012c814303995ec07099b3a9ce02a7af84b5970811074a3b in the local lfs store
+  lfs: found 66100b384bf761271b407d79fc30cdd0554f3b2c5d944836e936d584b88ce88e in the local lfs store
+   large@0: unpacking 2c531e0992ff: integrity check failed on data/large.i:0
+  lfs: found 89b6070915a3d573ff3599d1cda305bc5e38549b15c4847ab034169da66e1ca8 in the local lfs store
+  lfs: found b1a6ea88da0017a0e77db139a54618986e9a2489bee24af9fe596de9daac498c in the local lfs store
+  4 files, 5 changesets, 10 total revisions
+  2 integrity errors encountered!
+  (first damaged changeset appears to be 0)
+  [1]
+  $ hg -R fromcorrupt --config lfs.usercache=emptycache verify -v
+  repository uses revlog format 1
+  checking changesets
+  checking manifests
+  crosschecking files in changesets and manifests
+  checking files
+  lfs: found 66100b384bf761271b407d79fc30cdd0554f3b2c5d944836e936d584b88ce88e in the local lfs store
+   l@1: unpacking 46a2f24864bc: integrity check failed on data/l.i:0
+  lfs: found 22f66a3fc0b9bf3f012c814303995ec07099b3a9ce02a7af84b5970811074a3b in the local lfs store
+  lfs: found 66100b384bf761271b407d79fc30cdd0554f3b2c5d944836e936d584b88ce88e in the local lfs store
+   large@0: unpacking 2c531e0992ff: integrity check failed on data/large.i:0
+  lfs: found 89b6070915a3d573ff3599d1cda305bc5e38549b15c4847ab034169da66e1ca8 in the local lfs store
+  lfs: found b1a6ea88da0017a0e77db139a54618986e9a2489bee24af9fe596de9daac498c in the local lfs store
+  4 files, 5 changesets, 10 total revisions
+  2 integrity errors encountered!
+  (first damaged changeset appears to be 0)
+  [1]
+
+Damaging a file required by the update destination fails the update.
+
+  $ echo 'damage' >> $TESTTMP/dummy-remote/22/f66a3fc0b9bf3f012c814303995ec07099b3a9ce02a7af84b5970811074a3b
+  $ hg --config lfs.usercache=emptycache clone -v repo5 fromcorrupt2
+  updating to branch default
+  resolving manifests
+  getting l
+  lfs: adding 22f66a3fc0b9bf3f012c814303995ec07099b3a9ce02a7af84b5970811074a3b to the usercache
+  lfs: found 22f66a3fc0b9bf3f012c814303995ec07099b3a9ce02a7af84b5970811074a3b in the local lfs store
+  abort: integrity check failed on data/l.i:3!
+  [255]
+
+BUG: A corrupted lfs blob either shouldn't be created after a transfer from a
+file://remotestore, or it shouldn't be left behind.
+
+  $ cat emptycache/22/f66a3fc0b9bf3f012c814303995ec07099b3a9ce02a7af84b5970811074a3b | $TESTDIR/f --sha256
+  sha256=40f67c7e91d554db4bc500f8f62c2e40f9f61daa5b62388e577bbae26f5396ff
+  $ cat fromcorrupt2/.hg/store/lfs/objects/22/f66a3fc0b9bf3f012c814303995ec07099b3a9ce02a7af84b5970811074a3b | $TESTDIR/f --sha256
+  sha256=40f67c7e91d554db4bc500f8f62c2e40f9f61daa5b62388e577bbae26f5396ff
+
+  $ hg -R fromcorrupt2 verify
+  checking changesets
+  checking manifests
+  crosschecking files in changesets and manifests
+  checking files
+   l@1: unpacking 46a2f24864bc: integrity check failed on data/l.i:0
+   l@4: unpacking 6f1ff1f39c11: integrity check failed on data/l.i:3
+   large@0: unpacking 2c531e0992ff: integrity check failed on data/large.i:0
+  4 files, 5 changesets, 10 total revisions
+  3 integrity errors encountered!
+  (first damaged changeset appears to be 0)
+  [1]
+
+BUG: push will happily send corrupt files upstream.  (The alternate dummy remote
+avoids the corrupt lfs object in the original remote.)
+
+  $ mkdir $TESTTMP/dummy-remote2
+  $ hg init dest
+  $ hg -R fromcorrupt2 --config lfs.url=file:///$TESTTMP/dummy-remote2 push -v dest
+  pushing to dest
+  searching for changes
+  lfs: found 22f66a3fc0b9bf3f012c814303995ec07099b3a9ce02a7af84b5970811074a3b in the local lfs store
+  lfs: found 89b6070915a3d573ff3599d1cda305bc5e38549b15c4847ab034169da66e1ca8 in the local lfs store
+  lfs: found b1a6ea88da0017a0e77db139a54618986e9a2489bee24af9fe596de9daac498c in the local lfs store
+  lfs: found 66100b384bf761271b407d79fc30cdd0554f3b2c5d944836e936d584b88ce88e in the local lfs store
+  5 changesets found
+  uncompressed size of bundle content:
+       997 (changelog)
+      1032 (manifests)
+       841  l
+       272  large
+       788  s
+       139  small
+  adding changesets
+  adding manifests
+  adding file changes
+  added 5 changesets with 10 changes to 4 files
+
+  $ hg -R fromcorrupt2 --config lfs.url=file:///$TESTTMP/dummy-remote2 verify -v
+  repository uses revlog format 1
+  checking changesets
+  checking manifests
+  crosschecking files in changesets and manifests
+  checking files
+  lfs: found 66100b384bf761271b407d79fc30cdd0554f3b2c5d944836e936d584b88ce88e in the local lfs store
+   l@1: unpacking 46a2f24864bc: integrity check failed on data/l.i:0
+  lfs: found 22f66a3fc0b9bf3f012c814303995ec07099b3a9ce02a7af84b5970811074a3b in the local lfs store
+   l@4: unpacking 6f1ff1f39c11: integrity check failed on data/l.i:3
+  lfs: found 66100b384bf761271b407d79fc30cdd0554f3b2c5d944836e936d584b88ce88e in the local lfs store
+   large@0: unpacking 2c531e0992ff: integrity check failed on data/large.i:0
+  lfs: found 89b6070915a3d573ff3599d1cda305bc5e38549b15c4847ab034169da66e1ca8 in the local lfs store
+  lfs: found b1a6ea88da0017a0e77db139a54618986e9a2489bee24af9fe596de9daac498c in the local lfs store
+  4 files, 5 changesets, 10 total revisions
+  3 integrity errors encountered!
+  (first damaged changeset appears to be 0)
+  [1]
+
+  $ cat $TESTTMP/dummy-remote2/22/f66a3fc0b9bf3f012c814303995ec07099b3a9ce02a7af84b5970811074a3b | $TESTDIR/f --sha256
+  sha256=40f67c7e91d554db4bc500f8f62c2e40f9f61daa5b62388e577bbae26f5396ff
+  $ cat fromcorrupt2/.hg/store/lfs/objects/22/f66a3fc0b9bf3f012c814303995ec07099b3a9ce02a7af84b5970811074a3b | $TESTDIR/f --sha256
+  sha256=40f67c7e91d554db4bc500f8f62c2e40f9f61daa5b62388e577bbae26f5396ff
+
+  $ cat $TESTTMP/dummy-remote2/66/100b384bf761271b407d79fc30cdd0554f3b2c5d944836e936d584b88ce88e
+  LONGER-THAN-TEN-BYTES-WILL-TRIGGER-LFS
+  damage
+  $ cat $TESTTMP/dummy-remote2/22/f66a3fc0b9bf3f012c814303995ec07099b3a9ce02a7af84b5970811074a3b
+  RESTORE-TO-BE-LARGE
+  damage
+
+Accessing a corrupt file will complain
+
+  $ hg --cwd fromcorrupt2 cat -r 0 large
+  abort: integrity check failed on data/large.i:0!
+  [255]
+
 lfs -> normal -> lfs round trip conversions are possible.  The threshold for the
 lfs destination is specified here because it was originally listed in the local
 .hgrc, and the global one is too high to trigger lfs usage.  For lfs -> normal,