git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 3/3] diff-files: careful when inspecting work tree items

From
Junio C Hamano <gitster@pobox.com>
Date
Mar 31, 2008, 00:30 UTC
Message-ID
<7viqz3u44v.fsf@gitster.siamese.dyndns.org>
In-Reply-To
<7v4panyduy.fsf@gitster.siamese.dyndns.org>
This fixes the same breakage in diff-files.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 diff-lib.c                       |   17 +++++++++++------
 t/t2201-add-update-typechange.sh |    6 +++---
 2 files changed, 14 insertions(+), 9 deletions(-)
diff --git a/diff-lib.c b/diff-lib.c
index a8e107a..d4ad6b6 100644
--- a/diff-lib.c
+++ b/diff-lib.c
@@ -362,10 +362,12 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
 	int silent_on_removed = option & DIFF_SILENT_ON_REMOVED;
 	unsigned ce_option = ((option & DIFF_RACY_IS_MODIFIED)
 			      ? CE_MATCH_RACY_IS_DIRTY : 0);
+	char symcache[PATH_MAX];
 
 	if (diff_unmerged_stage < 0)
 		diff_unmerged_stage = 2;
 	entries = active_nr;
+	symcache[0] = '\0';
 	for (i = 0; i < entries; i++) {
 		struct stat st;
 		unsigned int oldmode, newmode;
@@ -397,16 +399,17 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
 			memset(&(dpath->parent[0]), 0,
 			       sizeof(struct combine_diff_parent)*5);
 
-			if (lstat(ce->name, &st) < 0) {
-				if (errno != ENOENT && errno != ENOTDIR) {
+			changed = check_work_tree_entity(ce, &st, symcache);
+			if (!changed)
+				dpath->mode = ce_mode_from_stat(ce, st.st_mode);
+			else {
+				if (changed < 0) {
 					perror(ce->name);
 					continue;
 				}
 				if (silent_on_removed)
 					continue;
 			}
-			else
-				dpath->mode = ce_mode_from_stat(ce, st.st_mode);
 
 			while (i < entries) {
 				struct cache_entry *nce = active_cache[i];
@@ -459,8 +462,10 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
 
 		if (ce_uptodate(ce))
 			continue;
-		if (lstat(ce->name, &st) < 0) {
-			if (errno != ENOENT && errno != ENOTDIR) {
+
+		changed = check_work_tree_entity(ce, &st, symcache);
+		if (changed) {
+			if (changed < 0) {
 				perror(ce->name);
 				continue;
 			}
diff --git a/t/t2201-add-update-typechange.sh b/t/t2201-add-update-typechange.sh
index 469a8e0..e15e3eb 100755
--- a/t/t2201-add-update-typechange.sh
+++ b/t/t2201-add-update-typechange.sh
@@ -104,7 +104,7 @@ test_expect_success modify '
 	} >expect-final
 '
 
-test_expect_failure diff-files '
+test_expect_success diff-files '
 	git diff-files --raw >actual &&
 	diff -u expect-files actual
 '
@@ -114,7 +114,7 @@ test_expect_success diff-index '
 	diff -u expect-index actual
 '
 
-test_expect_failure 'add -u' '
+test_expect_success 'add -u' '
 	rm -f ".git/saved-index" &&
 	cp -p ".git/index" ".git/saved-index" &&
 	git add -u &&
@@ -122,7 +122,7 @@ test_expect_failure 'add -u' '
 	diff -u expect-final actual
 '
 
-test_expect_failure 'commit -a' '
+test_expect_success 'commit -a' '
 	if test -f ".git/saved-index"
 	then
 		rm -f ".git/index" &&
-- 
1.5.5.rc2.131.g3d2f0
Previous: Christian Couder
Message 11 of 11 in “Possible d/f conflict bug or regression”
  1. Christian CouderMar 29, 2008
  2. Christian CouderMar 29, 2008
  3. Bryan DonlanMar 30, 2008
  4. Christian CouderMar 30, 2008
  5. Bryan DonlanMar 30, 2008
  6. Junio C HamanoMar 30, 2008
  7. 1/3 Add corner case tests for diff-index and diff-filesJunio C Hamano, Mar 31, 2008
  8. 2/3 diff-index: careful when inspecting work tree itemsJunio C Hamano, Mar 31, 2008
  9. Junio C HamanoMar 31, 2008
  10. Christian CouderMar 31, 2008
  11. 3/3 diff-files: careful when inspecting work tree itemsJunio C Hamano, Mar 31, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.