Re: [PATCH 2/2] read-cache.c: fix timestamp comparison

Subsystems: the rest

2 messages, 2 authors, 2016-06-15 · open the first message on its own page

Re: [PATCH 2/2] read-cache.c: fix timestamp comparison

From: Junio C Hamano <hidden>
Date: 2016-06-15 22:44:07

Linus Torvalds [off-list ref] writes:
Ok, having looked a bit more, I found another two cases that my grep had 
missed. They were regular if-statements, just more complex than my stupid 
grep pattern had taken into account.

Both are in read-cache.c:

read-cache.c:                   if (stage || istate->cache[pos]->ce_mode) {
read-cache.c:                   if (ce_stage(p) == stage && (stage || p->ce_mode))

and I'd send a patch, except my tree right now is in pretty bad shape 
because I'm also trying to see if I can add a name hash to the index.
-- >8 --
read-cache.c: fix a couple more CE_REMOVE conversion

It is a D/F conflict if you want to add "foo/bar" to the index
when "foo" already exists.  Also it is a conflict if you want to
add a file "foo" when "foo/bar" exists.

An exception is when the existing entry is there only to mark "I
used to be here but I am being removed".  This is needed for
operations such as "git read-tree -m -u" that update the index
and then reflect the result to the work tree --- we need to
remember what to remove somewhere, and we use the index for
that.  In such a case, an existing file "foo" is being removed
and we can create "foo/" directory and hang "bar" underneath it
without any conflict.

We used to use (ce->ce_mode == 0) to mark an entry that is being
removed, but (CE_REMOVE & ce->ce_flags) is used for that purpose
these days.  An earlier commit forgot to convert the logic in
the code that checks D/F conflict condition.

The old code knew that "to be removed" entries cannot be at
higher stage and actively checked that condition, but it was an
unnecessary check.  This patch removes the extra check as well.

Signed-off-by: Junio C Hamano <redacted>
---
 read-cache.c |    7 ++++---
 1 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/read-cache.c b/read-cache.c
index 8ba8f0f..8f5d02a 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -615,7 +615,7 @@ static int has_dir_name(struct index_state *istate,
 			 * it is Ok to have a directory at the same
 			 * path.
 			 */
-			if (stage || istate->cache[pos]->ce_mode) {
+			if (!(istate->cache[pos]->ce_flags & CE_REMOVE)) {
 				retval = -1;
 				if (!ok_to_replace)
 					break;
@@ -637,8 +637,9 @@ static int has_dir_name(struct index_state *istate,
 			    (p->name[len] != '/') ||
 			    memcmp(p->name, name, len))
 				break; /* not our subdirectory */
-			if (ce_stage(p) == stage && (stage || p->ce_mode))
-				/* p is at the same stage as our entry, and
+			if (ce_stage(p) == stage && !(p->ce_flags & CE_REMOVE))
+				/*
+				 * p is at the same stage as our entry, and
 				 * is a subdirectory of what we are looking
 				 * at, so we cannot have conflicts at our
 				 * level or anything shorter.

Re: [PATCH 2/2] read-cache.c: fix timestamp comparison

From: Linus Torvalds <torvalds@linux-foundation.org>
Date: 2016-06-15 22:44:07


On Tue, 22 Jan 2008, Junio C Hamano wrote:
read-cache.c: fix a couple more CE_REMOVE conversion
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>

			Linus
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help