Skip to content

Commit 9ec398d

Browse files
torvaldsgitster
authored andcommitted
Fix racy-git handling in git-write-tree.
After git-write-tree finishes computing the tree, it updates the index so that later operations can take advantage of fully populated cache tree. However, anybody writing the index file has to mark the entries that are racily clean. For each entry whose cached lstat(3) data in the index exactly matches what is obtained from the filesystem, if the timestamp on the index file was the same or older than the modification timestamp of the file, the blob contents and the work tree file, after convert_to_git(), need to be compared, and if they are different, its index entry needs to be marked not to match the lstat(3) data from the filesystem. In order for this to work, convert_to_git() needs to work correctly, which in turn means you need to read the config file to get the settings of core.crlf and friends. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent 1d25c8c commit 9ec398d

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

builtin-write-tree.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ int cmd_write_tree(int argc, const char **argv, const char *unused_prefix)
7272
const char *prefix = NULL;
7373
unsigned char sha1[20];
7474

75+
git_config(git_default_config);
7576
while (1 < argc) {
7677
const char *arg = argv[1];
7778
if (!strcmp(arg, "--missing-ok"))

t/t0023-crlf-am.sh

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#!/bin/sh
2+
3+
test_description='Test am with auto.crlf'
4+
5+
. ./test-lib.sh
6+
7+
cat >patchfile <<\EOF
8+
From 38be10072e45dd6b08ce40851e3fca60a31a340b Mon Sep 17 00:00:00 2001
9+
From: Marius Storm-Olsen <x@y.com>
10+
Date: Thu, 23 Aug 2007 13:00:00 +0200
11+
Subject: test1
12+
13+
---
14+
foo | 1 +
15+
1 files changed, 1 insertions(+), 0 deletions(-)
16+
create mode 100644 foo
17+
18+
diff --git a/foo b/foo
19+
new file mode 100644
20+
index 0000000000000000000000000000000000000000..5716ca5987cbf97d6bb54920bea6adde242d87e6
21+
--- /dev/null
22+
+++ b/foo
23+
@@ -0,0 +1 @@
24+
+bar
25+
EOF
26+
27+
test_expect_success 'setup' '
28+
29+
git config core.autocrlf true &&
30+
echo foo >bar &&
31+
git add bar &&
32+
test_tick &&
33+
git commit -m initial
34+
35+
'
36+
37+
test_expect_success 'am' '
38+
39+
git am --binary -3 <patchfile &&
40+
git diff-files --name-status --exit-code
41+
42+
'
43+
44+
test_done

0 commit comments

Comments
 (0)