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

[PATCH 3/4] Fix diff regression for submodules not checked out

From
Ping Yin <pkufranky@gmail.com>
Date
May 2, 2008, 13:35 UTC
Message-ID
<1209735336-4690-4-git-send-email-pkufranky@gmail.com>
In-Reply-To
<1209735336-4690-3-git-send-email-pkufranky@gmail.com>

This regression is introduced by f58dbf23c3, which calls check_work_tree_entity in run_diff_files. While check_work_tree_entity treats submodule not checked out as non stagable which causes that diff-files shows these submodules as deleted.

check_work_tree_entity considers a worktree entity having two statuses: stagable and inexistent. Actually, there is a 3rd status: a submodule entity can be existent but not stagable (for example, empty directory for non-checked-out submodule)

This patch redesigns the return value of check_work_tree_entity to consider both the 3 statuses.

Signed-off-by: Ping Yin <pkufranky@gmail.com>
---
 diff-lib.c |   22 +++++++++++++---------
 1 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/diff-lib.c b/diff-lib.c
index cfd629d..72c2a7b 100644
--- a/diff-lib.c
+++ b/diff-lib.c
@@ -337,25 +337,29 @@ int run_diff_files_cmd(struct rev_info *revs, int argc, const char **argv)
 	}
 	return run_diff_files(revs, options);
 }
+
+#define ENT_STAGABLE 1
+#define ENT_INEXISTENT 2
+#define ENT_NOTGITDIR 3		/* Existent but not stagable (not a git dir) */
 /*
- * See if work tree has an entity that can be staged.  Return 0 if so,
- * return 1 if not and return -1 if error.
+ * Check the status of a work tree entity
+ * Return ENT_{STAGABLE,INEXISTENT,NOTGITDIR} or -1 if error
  */
 static int check_work_tree_entity(const struct cache_entry *ce, struct stat *st, char *symcache)
 {
 	if (lstat(ce->name, st) < 0) {
 		if (errno != ENOENT && errno != ENOTDIR)
 			return -1;
-		return 1;
+		return ENT_INEXISTENT;
 	}
 	if (has_symlink_leading_path(ce->name, symcache))
-		return 1;
+		return ENT_INEXISTENT;
 	if (S_ISDIR(st->st_mode)) {
 		unsigned char sub[20];
 		if (resolve_gitlink_ref(ce->name, "HEAD", sub))
-			return 1;
+			return ENT_NOTGITDIR;
 	}
-	return 0;
+	return ENT_STAGABLE;
 }
 
 int run_diff_files(struct rev_info *revs, unsigned int option)
@@ -403,7 +407,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
 			       sizeof(struct combine_diff_parent)*5);
 
 			changed = check_work_tree_entity(ce, &st, symcache);
-			if (!changed)
+			if (changed != ENT_INEXISTENT)
 				dpath->mode = ce_mode_from_stat(ce, st.st_mode);
 			else {
 				if (changed < 0) {
@@ -467,7 +471,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
 			continue;
 
 		changed = check_work_tree_entity(ce, &st, symcache);
-		if (changed) {
+		if (changed == ENT_INEXISTENT) {
 			if (changed < 0) {
 				perror(ce->name);
 				continue;
@@ -527,7 +531,7 @@ static int get_stat_data(struct cache_entry *ce,
 		changed = check_work_tree_entity(ce, &st, cbdata->symcache);
 		if (changed < 0)
 			return -1;
-		else if (changed) {
+		else if (changed == ENT_INEXISTENT) {
 			if (match_missing) {
 				*sha1p = sha1;
 				*modep = mode;
-- 
1.5.5.1.116.ge4b9c.dirty
Previous: Ping YinNext: Ping Yin
Message 18 of 28 in “[regression?] "git status -a" reports modified for empty submodule directory”
  1. Ping YinApr 22, 2008
  2. Ping YinApr 22, 2008
  3. Johannes SixtApr 22, 2008
  4. Ping YinApr 22, 2008
  5. Johannes SixtApr 22, 2008
  6. Roman ShaposhnikApr 22, 2008
  7. Ping YinApr 29, 2008
  8. 0/2 Add tests for submodule with empty directoryPing Yin, Apr 29, 2008
  9. 1/2 t4027: test diff for submodule with empty directoryPing Yin, Apr 29, 2008
  10. 2/2 Add t7506 to test submodule related functions for git-statusPing Yin, Apr 29, 2008
  11. Junio C HamanoApr 29, 2008
  12. Johannes SixtApr 30, 2008
  13. Junio C HamanoApr 30, 2008
  14. Ping YinApr 30, 2008
  15. 0/4 Fix regression for unchecked out submodulesPing Yin, May 2, 2008
  16. 1/4 t4027: test diff for submodule with empty directoryPing Yin, May 2, 2008
  17. 2/4 Add t7506 to test submodule related functions for git-statusPing Yin, May 2, 2008
  18. 3/4 Fix diff regression for submodules not checked outPing Yin, May 2, 2008
  19. 4/4 Fix ie_match_stat for non-checked-out submodulePing Yin, May 2, 2008
  20. Junio C HamanoMay 2, 2008
  21. Ping YinMay 2, 2008
  22. Junio C HamanoMay 2, 2008
  23. Ping YinMay 2, 2008
  24. Ping YinMay 3, 2008
  25. Johannes SchindelinMay 3, 2008
  26. Junio C HamanoMay 3, 2008
  27. Junio C HamanoMay 4, 2008
  28. Ping YinMay 4, 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.