Skip to content

Commit

Permalink
write-tree: properly detect failure to write tree objects
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Junio C Hamano committed Apr 23, 2008
1 parent 4f7ec79 commit edae5f0
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 2 deletions.
7 changes: 5 additions & 2 deletions cache-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
67 changes: 67 additions & 0 deletions t/t0004-unwritable.sh
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit edae5f0

Please sign in to comment.