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>
This commit is contained in:
Linus Torvalds 2007-08-23 10:18:54 -07:00 коммит произвёл Junio C Hamano
Родитель 1d25c8cf82
Коммит 9ec398d200
2 изменённых файлов: 45 добавлений и 0 удалений

Просмотреть файл

@ -72,6 +72,7 @@ int cmd_write_tree(int argc, const char **argv, const char *unused_prefix)
const char *prefix = NULL;
unsigned char sha1[20];
git_config(git_default_config);
while (1 < argc) {
const char *arg = argv[1];
if (!strcmp(arg, "--missing-ok"))

44
t/t0023-crlf-am.sh Executable file
Просмотреть файл

@ -0,0 +1,44 @@
#!/bin/sh
test_description='Test am with auto.crlf'
. ./test-lib.sh
cat >patchfile <<\EOF
From 38be10072e45dd6b08ce40851e3fca60a31a340b Mon Sep 17 00:00:00 2001
From: Marius Storm-Olsen <x@y.com>
Date: Thu, 23 Aug 2007 13:00:00 +0200
Subject: test1
---
foo | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 foo
diff --git a/foo b/foo
new file mode 100644
index 0000000000000000000000000000000000000000..5716ca5987cbf97d6bb54920bea6adde242d87e6
--- /dev/null
+++ b/foo
@@ -0,0 +1 @@
+bar
EOF
test_expect_success 'setup' '
git config core.autocrlf true &&
echo foo >bar &&
git add bar &&
test_tick &&
git commit -m initial
'
test_expect_success 'am' '
git am --binary -3 <patchfile &&
git diff-files --name-status --exit-code
'
test_done