write-tree: properly detect failure to write tree objects
authorJunio C Hamano <gitster@pobox.com>
Wed, 23 Apr 2008 16:47:17 +0000 (09:47 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 23 Apr 2008 17:02:44 +0000 (10:02 -0700)
Tomasz Fortuna reported that "git commit" does not error out properly when
it cannot write tree objects out.  "git write-tree" shares the same issue,
as the failure to notice the error is deep in the logic to write tree
objects out recursively.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
cache-tree.c
t/t0004-unwritable.sh [new file with mode: 0755]

index 50b35264fd0405a299700ef8bf4a61f416f30e46..cfe937b0f12896160e728f9bdec4d4594f13bd3a 100644 (file)
@@ -341,8 +341,11 @@ static int update_one(struct cache_tree *it,
 
        if (dryrun)
                hash_sha1_file(buffer.buf, buffer.len, tree_type, it->sha1);
-       else
-               write_sha1_file(buffer.buf, buffer.len, tree_type, it->sha1);
+       else if (write_sha1_file(buffer.buf, buffer.len, tree_type, it->sha1)) {
+               strbuf_release(&buffer);
+               return -1;
+       }
+
        strbuf_release(&buffer);
        it->entry_count = i;
 #if DEBUG
diff --git a/t/t0004-unwritable.sh b/t/t0004-unwritable.sh
new file mode 100755 (executable)
index 0000000..9255c63
--- /dev/null
@@ -0,0 +1,67 @@
+#!/bin/sh
+
+test_description='detect unwritable repository and fail correctly'
+
+. ./test-lib.sh
+
+test_expect_success setup '
+
+       >file &&
+       git add file &&
+       git commit -m initial &&
+       echo >file &&
+       git add file
+
+'
+
+test_expect_success 'write-tree should notice unwritable repository' '
+
+       (
+               chmod a-w .git/objects
+               test_must_fail git write-tree
+       )
+       status=$?
+       chmod 775 .git/objects
+       (exit $status)
+
+'
+
+test_expect_success 'commit should notice unwritable repository' '
+
+       (
+               chmod a-w .git/objects
+               test_must_fail git commit -m second
+       )
+       status=$?
+       chmod 775 .git/objects
+       (exit $status)
+
+'
+
+test_expect_success 'update-index should notice unwritable repository' '
+
+       (
+               echo a >file &&
+               chmod a-w .git/objects
+               test_must_fail git update-index file
+       )
+       status=$?
+       chmod 775 .git/objects
+       (exit $status)
+
+'
+
+test_expect_success 'add should notice unwritable repository' '
+
+       (
+               echo b >file &&
+               chmod a-w .git/objects
+               test_must_fail git add file
+       )
+       status=$?
+       chmod 775 .git/objects
+       (exit $status)
+
+'
+
+test_done