write-tree: properly detect failure to write tree objects
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>
Junio C Hamano committed
Apr 23, 2008 at 09:47 UTC
edae5f0c20b7e71a717b59873ddb8eeddfa49b86
2 files changed
+72
-2
cache-tree.c
+5
-2
@@ -341,8 +341,11 @@ static int update_one(struct cache_tree *it,
341
342
if (dryrun)
343
hash_sha1_file(buffer.buf, buffer.len, tree_type, it->sha1);
344
- else
345
- write_sha1_file(buffer.buf, buffer.len, tree_type, it->sha1);
344
+ else if (write_sha1_file(buffer.buf, buffer.len, tree_type, it->sha1)) {
345
+ strbuf_release(&buffer);
346
+ return -1;
347
+ }
348
+
349
strbuf_release(&buffer);
350
it->entry_count = i;
351
#if DEBUG
t/t0004-unwritable.sh
new
+67
@@ -0,0 +1,67 @@
1
+#!/bin/sh
2
+
3
+test_description='detect unwritable repository and fail correctly'
4
+
5
+. ./test-lib.sh
6
+
7
+test_expect_success setup '
8
+
9
+ >file &&
10
+ git add file &&
11
+ git commit -m initial &&
12
+ echo >file &&
13
+ git add file
14
+
15
+'
16
+
17
+test_expect_success 'write-tree should notice unwritable repository' '
18
+
19
+ (
20
+ chmod a-w .git/objects
21
+ test_must_fail git write-tree
22
+ )
23
+ status=$?
24
+ chmod 775 .git/objects
25
+ (exit $status)
26
+
27
+'
28
+
29
+test_expect_success 'commit should notice unwritable repository' '
30
+
31
+ (
32
+ chmod a-w .git/objects
33
+ test_must_fail git commit -m second
34
+ )
35
+ status=$?
36
+ chmod 775 .git/objects
37
+ (exit $status)
38
+
39
+'
40
+
41
+test_expect_success 'update-index should notice unwritable repository' '
42
+
43
+ (
44
+ echo a >file &&
45
+ chmod a-w .git/objects
46
+ test_must_fail git update-index file
47
+ )
48
+ status=$?
49
+ chmod 775 .git/objects
50
+ (exit $status)
51
+
52
+'
53
+
54
+test_expect_success 'add should notice unwritable repository' '
55
+
56
+ (
57
+ echo b >file &&
58
+ chmod a-w .git/objects
59
+ test_must_fail git add file
60
+ )
61
+ status=$?
62
+ chmod 775 .git/objects
63
+ (exit $status)
64
+
65
+'
66
+
67
+test_done