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

Re: Expected Behavior?

From
Junio C Hamano <junkio@cox.net>
Date
Nov 7, 2005, 01:38 UTC
Message-ID
<7vy841utif.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<E1EYsny-0004hq-IW@jdl.com>
Jon Loeliger <jdl@freescale.com> writes:
Show 9 quoted lines
>     # Untracked files:
>     #   (use "git add" to add to commit)
>     #
>     #       file3
>
> Why is file3 considered untracked and needing to be added?
> It was present in both "dev" and "master" branches before
> the merge.  It doesn't end up with "<<< one === other >>>"
> style diffs either.

It is because Untracked uses different program than git-diff-* and, it mishandles unmerged paths. Let me see...

Yup, it uses "git-ls-files --others", which considers that unmerged paths do not "exist" in the index. This is wrong.

The attached is a patch to fix ls-files.

I also think that file3 should not appear in "Updated but not checked in (will commit)" list -- we are _not_ going to commit unmerged paths until you tell git what you want to do with them. The patch in the next message fixes it.

-- >8 -- cut here -- >8 --
Subject: ls-files: --others should not say unmerged paths are unknown.

Jon Loeliger noticed that an unmerged path appears as "Untracked" in git-status output, even though we show the same path as updated/changed. Since --others means "we have not told git about that path", we should not show unmerged paths -- obviously, git knows about them; it just does not know what we want to do about them yet.

Signed-off-by: Junio C Hamano <junkio@cox.net>
---
 ls-files.c |   26 ++++++++++++++++++++++++--
 1 files changed, 24 insertions(+), 2 deletions(-)

applies-to: f571975209b0bc38ca099684f9731efe4163b396 fcbc3083e37f3c025d85d7b2c8a1c53d07a81fac

diff --git a/ls-files.c b/ls-files.c
index d9c8b21..f7653e7 100644
--- a/ls-files.c
+++ b/ls-files.c
@@ -348,6 +348,29 @@ static void show_dir_entry(const char *t
 	putchar(line_terminator);
 }
 
+static void show_other_files(void)
+{
+	int i;
+	for (i = 0; i < nr_dir; i++) {
+		/* We should not have a matching entry, but we
+		 * may have an unmerged entry for this path.
+		 */
+		struct nond_on_fs *ent = dir[i];
+		int pos = cache_name_pos(ent->name, ent->len);
+		struct cache_entry *ce;
+		if (0 <= pos)
+			die("bug in show-other-files");
+		pos = -pos - 1;
+		if (pos < active_nr) { 
+			ce = active_cache[pos];
+			if (ce_namelen(ce) == ent->len &&
+			    !memcmp(ce->name, ent->name, ent->len))
+				continue; /* Yup, this one exists unmerged */
+		}
+		show_dir_entry(tag_other, ent);
+	}
+}
+
 static void show_killed_files(void)
 {
 	int i;
@@ -438,8 +461,7 @@ static void show_files(void)
 		read_directory(path, base, baselen);
 		qsort(dir, nr_dir, sizeof(struct nond_on_fs *), cmp_name);
 		if (show_others)
-			for (i = 0; i < nr_dir; i++)
-				show_dir_entry(tag_other, dir[i]);
+			show_other_files();
 		if (show_killed)
 			show_killed_files();
 	}
---
0.99.9.GIT
Previous: Jon LoeligerNext: Junio C Hamano
Message 2 of 3 in “Expected Behavior?”
  1. Jon LoeligerNov 6, 2005
  2. Junio C HamanoNov 7, 2005
  3. Junio C HamanoNov 7, 2005

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.