threads / patch / 52704

patchMake git rm submodule succeed if .gitmodules index stat info is zero

Subject: [PATCH] Make git rm submodule succeed if .gitmodules index stat info is zero

## tl;dr

2 messages between Jan 27, 2020 and Jan 28, 2020. Diffs are folded; open one to read it.

replies: 1people: 2as markdown or json

David Turner· Jan 27, 2020, 18:58 UTC · lore

The bug was that ie_match_stat was used to compare if the stat info for the file was compatible with the stat info in the index, rather using ie_modified to check if the file was in fact different from the version in the index.

A version of this (with deinit instead of rm) was reported here: https://public-inbox.org/git/CAPOqYV+C-P9M2zcUBBkD2LALPm4K3sxSut+BjAkZ9T1AKLEr+A@mail.gmail.com/

It seems that in that case, the user's clone command left the index with empty stat info. The mailing list was unable to reproduce this. But we (Two Sigma) hit the bug while using some plumbing commands, so I'm fixing it. I manually confirmed that the fix also repairs deinit in this scenario.

Signed-off-by: David Turner <dturner@twosigma.com>
Reported-by: Thomas Bétous <th.betous@gmail.com>
---
 submodule.c   | 2 +-
 t/t3600-rm.sh | 7 +++++++
 2 files changed, 8 insertions(+), 1 deletion(-)
Show changes to 2 files +8 −1

submodule.c, t/t3600-rm.sh

diff --git a/submodule.c b/submodule.c
index 9da7181321..86e46d3dce 100644
--- a/submodule.c
+++ b/submodule.c
@@ -82,7 +82,7 @@ int is_staging_gitmodules_ok(struct index_state *istate)
 	if ((pos >= 0) && (pos < istate->cache_nr)) {
 		struct stat st;
 		if (lstat(GITMODULES_FILE, &st) == 0 &&
-		    ie_match_stat(istate, istate->cache[pos], &st, 0) & DATA_CHANGED)
+		    ie_modified(istate, istate->cache[pos], &st, 0) & DATA_CHANGED)
 			return 0;
 	}
 
diff --git a/t/t3600-rm.sh b/t/t3600-rm.sh
index 0ea858d652..f2c0168941 100755
--- a/t/t3600-rm.sh
+++ b/t/t3600-rm.sh
@@ -425,6 +425,13 @@ test_expect_success 'rm will error out on a modified .gitmodules file unless sta
 	git status -s -uno >actual &&
 	test_cmp expect actual
 '
+test_expect_success 'rm will not error out on .gitmodules file with zero stat data' '
+	git reset --hard &&
+	git submodule update &&
+	git read-tree HEAD &&
+	git rm submod &&
+	test_path_is_missing submod
+'
 
 test_expect_success 'rm issues a warning when section is not found in .gitmodules' '
 	git reset --hard &&
-- 
2.11.GIT
Junio C Hamano· Jan 28, 2020, 23:16 UTC · re: David Turner · lore

Re: [PATCH] Make git rm submodule succeed if .gitmodules index stat info is zero

David Turner <dturner@twosigma.com> writes:
> The bug was that ie_match_stat was used to compare if the stat info
> for the file was compatible with the stat info in the index, rather
> using ie_modified to check if the file was in fact different from the
> version in the index.

Makes sense. ie_match_stat() often ends up comparing the file contents in our tests due to sequence Git commands firing too rapidly, leading to a racy-index status, but read-tree is a reliable way to clear the cached stat information to force it say "I dunno--- suspect it got modified". Will queue.

Show 10 quoted lines
> +test_expect_success 'rm will not error out on .gitmodules file with zero stat data' '
> +	git reset --hard &&
> +	git submodule update &&
> +	git read-tree HEAD &&
> +	git rm submod &&
> +	test_path_is_missing submod
> +'
>  
>  test_expect_success 'rm issues a warning when section is not found in .gitmodules' '
>  	git reset --hard &&

← back to recent threads