git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3] Test fsck a bit harder

From
Thomas Rast <trast@student.ethz.ch>
Date
Feb 20, 2009, 19:40 UTC
Message-ID
<effac809336c1e05613eed315483ec32f3a4c75b.1235158438.git.trast@student.ethz.ch>
In-Reply-To
<0599d1b4fe0f243b3d86d9afd9c67858861838aa.1235041345.git.trast@student.ethz.ch>
git-fsck, of all tools, has very few tests.  This adds some more:
* a corrupted object;
* a branch pointing to a non-commit;
* a tag pointing to a nonexistent object;
* and a tag pointing to an object of a type other than what the tag
  itself claims.
Signed-off-by: Thomas Rast <trast@student.ethz.ch>
---

I investigated the test failures with v2, and it turns out the problem was in my use of hash-object. When correctly passing '-t tag' for the tags, fsck does detect the breakage. So here's an updated version of this test. Interdiff:

  diff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh
  index 628db19..a22632f 100755
  --- a/t/t1450-fsck.sh
  +++ b/t/t1450-fsck.sh
  @@ -66,13 +66,13 @@ tagger T A Gger <tagger@example.com> 1234567890 -0000
   This is an invalid tag.
   EOF
  -test_expect_success 'tag pointing to nonexistent' '
  -       tag=$(git hash-object -t tag -w --stdin < invalid-tag) &&
  +test_expect_failure 'tag pointing to nonexistent' '
  +       tag=$(git hash-object -w --stdin < invalid-tag) &&
          echo $tag > .git/refs/tags/invalid &&
  -       git fsck 2>&1 | tee out &&
  -       grep "missing commit ffffffffffffffffffffffffffffffffffffffff" out &&
  -       rm .git/refs/tags/invalid &&
  -       rm -f .git/objects/$(echo $tag | sed "s#^..#&/#")
  +       git fsck --tags 2>out &&
  +       cat out &&
  +       grep "could not load tagged object" out &&
  +       rm .git/refs/tags/invalid
   '
   cat > wrong-tag <<EOF
  @@ -84,11 +84,12 @@ tagger T A Gger <tagger@example.com> 1234567890 -0000
   This is an invalid tag.
   EOF
  -test_expect_success 'tag pointing to something else than its type' '
  -       tag=$(git hash-object -t tag -w --stdin < wrong-tag) &&
  +test_expect_failure 'tag pointing to something else than its type' '
  +       tag=$(git hash-object -w --stdin < wrong-tag) &&
          echo $tag > .git/refs/tags/wrong &&
  -       git fsck 2>&1 | tee out &&
  -       grep "Object.*is a blob, not a commit" out &&
  +       git fsck --tags 2>out &&
  +       cat out &&
  +       grep "some sane error message" out &&
          rm .git/refs/tags/wrong
   '
 t/t1450-fsck.sh |   66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 66 insertions(+), 0 deletions(-)
diff --git a/t/t1450-fsck.sh b/t/t1450-fsck.sh
index 4597af0..628db19 100755
--- a/t/t1450-fsck.sh
+++ b/t/t1450-fsck.sh
@@ -28,4 +28,70 @@ test_expect_success 'loose objects borrowed from alternate are not missing' '
 	)
 '
 
+# Corruption tests follow.  Make sure to remove all traces of the
+# specific corruption you test afterwards, lest a later test trip over
+# it.
+
+test_expect_success 'object with bad sha1' '
+	sha=$(echo blob | git hash-object -w --stdin) &&
+	echo $sha &&
+	old=$(echo $sha | sed "s+^..+&/+") &&
+	new=$(dirname $old)/ffffffffffffffffffffffffffffffffffffff &&
+	sha="$(dirname $new)$(basename $new)"
+	mv .git/objects/$old .git/objects/$new &&
+	git update-index --add --cacheinfo 100644 $sha foo &&
+	tree=$(git write-tree) &&
+	cmt=$(echo bogus | git commit-tree $tree) &&
+	git update-ref refs/heads/bogus $cmt &&
+	(git fsck 2>out; true) &&
+	grep "$sha.*corrupt" out &&
+	rm -f .git/objects/$new &&
+	git update-ref -d refs/heads/bogus &&
+	git read-tree -u --reset HEAD
+'
+
+test_expect_success 'branch pointing to non-commit' '
+	git rev-parse HEAD^{tree} > .git/refs/heads/invalid &&
+	git fsck 2>out &&
+	grep "not a commit" out &&
+	git update-ref -d refs/heads/invalid
+'
+
+cat > invalid-tag <<EOF
+object ffffffffffffffffffffffffffffffffffffffff
+type commit
+tag invalid
+tagger T A Gger <tagger@example.com> 1234567890 -0000
+
+This is an invalid tag.
+EOF
+
+test_expect_success 'tag pointing to nonexistent' '
+	tag=$(git hash-object -t tag -w --stdin < invalid-tag) &&
+	echo $tag > .git/refs/tags/invalid &&
+	git fsck 2>&1 | tee out &&
+	grep "missing commit ffffffffffffffffffffffffffffffffffffffff" out &&
+	rm .git/refs/tags/invalid &&
+	rm -f .git/objects/$(echo $tag | sed "s#^..#&/#")
+'
+
+cat > wrong-tag <<EOF
+object $(echo blob | git hash-object -w --stdin)
+type commit
+tag wrong
+tagger T A Gger <tagger@example.com> 1234567890 -0000
+
+This is an invalid tag.
+EOF
+
+test_expect_success 'tag pointing to something else than its type' '
+	tag=$(git hash-object -t tag -w --stdin < wrong-tag) &&
+	echo $tag > .git/refs/tags/wrong &&
+	git fsck 2>&1 | tee out &&
+	grep "Object.*is a blob, not a commit" out &&
+	rm .git/refs/tags/wrong
+'
+
+
+
 test_done
-- 
1.6.2.rc1.310.g364d6
Previous: Thomas RastNext: Johannes Sixt
Message 8 of 19 in “What's cooking in git.git (Feb 2009, #06; Wed, 18)”
  1. Junio C HamanoFeb 19, 2009
  2. 0/8 Support coverage testing with GCC/gcovThomas Rast, Feb 19, 2009
  3. 1/8 Support coverage testing with GCC/gcovThomas Rast, Feb 19, 2009
  4. 2/8 Test that diff can read from stdinThomas Rast, Feb 19, 2009
  5. 3/8 Test diff --dirstat functionalityThomas Rast, Feb 19, 2009
  6. 4/8 Test log --graphThomas Rast, Feb 19, 2009
  7. 5/8 Test fsck a bit harderThomas Rast, Feb 19, 2009
  8. Test fsck a bit harderThomas Rast, Feb 20, 2009
  9. Johannes SixtFeb 20, 2009
  10. Test fsck a bit harderThomas Rast, Feb 21, 2009
  11. Johannes SixtFeb 21, 2009
  12. Test fsck a bit harderThomas Rast, Mar 1, 2009
  13. Junio C HamanoMar 3, 2009
  14. 6/8 Test log --decorateThomas Rast, Feb 19, 2009
  15. 7/8 Test rev-list --parents/--childrenThomas Rast, Feb 19, 2009
  16. 8/8 Test git-patch-idThomas Rast, Feb 19, 2009
  17. Johannes SchindelinFeb 19, 2009
  18. Thomas RastFeb 19, 2009
  19. Sverre RabbelierFeb 19, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.