git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 2/5] Treat D/F conflict entry more carefully in unpack-trees.c::threeway_merge()
@ 2007-04-07 14:40 Junio C Hamano
  2007-04-07 19:08 ` Daniel Barkalow
  0 siblings, 1 reply; 4+ messages in thread
From: Junio C Hamano @ 2007-04-07 14:40 UTC (permalink / raw)
  To: git; +Cc: Daniel Barkalow, Alex Riesen, Johannes Schindelin

This fixes three buglets in threeway_merge() regarding D/F
conflict entries.

* After finishing with path D and handling path D/F, some stages
  have D/F conflict entry which are obviously non-NULL.  For the
  purpose of determining if the path D/F is missing in the
  ancestor, they should not be taken into account.

* D/F conflict entry is a phony entry and does not record the
  path being processed, so do not pick up the name from there.

* D/F conflict entry is a marker to say "this stage does _not_
  have the path", so do not send them to keep_entry().

There might be more glitches, but I am slowly digging this mess
through, which unfortunately was made even more work since
merge-recursive is a built-in now.

Signed-off-by: Junio C Hamano <junkio@cox.net>
---
 unpack-trees.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/unpack-trees.c b/unpack-trees.c
index a0b6769..4039653 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -675,10 +675,10 @@ int threeway_merge(struct cache_entry **stages,
 	int i;
 
 	for (i = 1; i < o->head_idx; i++) {
-		if (!stages[i])
+		if (!stages[i] || stages[i] == o->df_conflict_entry)
 			any_anc_missing = 1;
 		else {
-			if (!path)
+			if (!path && stages[i] != o->df_conflict_entry)
 				path = stages[i]->name;
 			no_anc_exists = 0;
 		}
@@ -790,7 +790,7 @@ int threeway_merge(struct cache_entry **stages,
 	count = 0;
 	if (!head_match || !remote_match) {
 		for (i = 1; i < o->head_idx; i++) {
-			if (stages[i]) {
+			if (stages[i] && stages[i] != o->df_conflict_entry) {
 				keep_entry(stages[i], o);
 				count++;
 				break;
-- 
1.5.1.81.gee969

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/5] Treat D/F conflict entry more carefully in unpack-trees.c::threeway_merge()
  2007-04-07 14:40 [PATCH 2/5] Treat D/F conflict entry more carefully in unpack-trees.c::threeway_merge() Junio C Hamano
@ 2007-04-07 19:08 ` Daniel Barkalow
  2007-04-08  0:14   ` Junio C Hamano
  0 siblings, 1 reply; 4+ messages in thread
From: Daniel Barkalow @ 2007-04-07 19:08 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Alex Riesen, Johannes Schindelin

On Sat, 7 Apr 2007, Junio C Hamano wrote:

> This fixes three buglets in threeway_merge() regarding D/F
> conflict entries.
> 
> * After finishing with path D and handling path D/F, some stages
>   have D/F conflict entry which are obviously non-NULL.  For the
>   purpose of determining if the path D/F is missing in the
>   ancestor, they should not be taken into account.
> 
> * D/F conflict entry is a phony entry and does not record the
>   path being processed, so do not pick up the name from there.

This bit is unnecessary, because the first bit means we treat D/F conflict 
as missing in that conditional, and don't count it as an entry at all, let 
alone one with a useful name.

> * D/F conflict entry is a marker to say "this stage does _not_
>   have the path", so do not send them to keep_entry().
> 
> There might be more glitches, but I am slowly digging this mess
> through, which unfortunately was made even more work since
> merge-recursive is a built-in now.

Looks good, although it might be wise to add an "exists" function that 
returns false for df_conflict_entry and for NULL, to make the tests 
clearer, and to get a comment to point out the meaning of 
df_conflict_entry. Also, I think df_conflict_entry can be static bss in 
unpack-trees and not accessed through o->df_conflict_entry, since it's 
always the same value (being now universally initialized to a static 
pointer to heap...).

	-Daniel
*This .sig left intentionally blank*

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/5] Treat D/F conflict entry more carefully in unpack-trees.c::threeway_merge()
  2007-04-07 19:08 ` Daniel Barkalow
@ 2007-04-08  0:14   ` Junio C Hamano
  2007-04-08  0:29     ` Daniel Barkalow
  0 siblings, 1 reply; 4+ messages in thread
From: Junio C Hamano @ 2007-04-08  0:14 UTC (permalink / raw)
  To: Daniel Barkalow; +Cc: git, Alex Riesen, Johannes Schindelin

Daniel Barkalow <barkalow@iabervon.org> writes:

> On Sat, 7 Apr 2007, Junio C Hamano wrote:
>
>> This fixes three buglets in threeway_merge() regarding D/F
>> conflict entries.
>> 
>> * After finishing with path D and handling path D/F, some stages
>>   have D/F conflict entry which are obviously non-NULL.  For the
>>   purpose of determining if the path D/F is missing in the
>>   ancestor, they should not be taken into account.
>> 
>> * D/F conflict entry is a phony entry and does not record the
>>   path being processed, so do not pick up the name from there.
>
> This bit is unnecessary, because the first bit means we treat D/F conflict 
> as missing in that conditional, and don't count it as an entry at all, let 
> alone one with a useful name.

I am not sure about what you mean by "first bit", but I added
this after noticing there was a case where the path was not
picked up from index/head/remote correctly because the "pick up
the path from ancestors, while we check for any_anc_missing and
no_anc_exists condition" loop at the beginning already set it to
point at stages[i]->name (which is an empty string "" name of
the df-conflict entry).

But I notice that "aggressive" codepath is the only thing that
wants to use the path (it uses it to check the working tree
status), so maybe we should move that path computation business
inside the aggressive codepath.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/5] Treat D/F conflict entry more carefully in unpack-trees.c::threeway_merge()
  2007-04-08  0:14   ` Junio C Hamano
@ 2007-04-08  0:29     ` Daniel Barkalow
  0 siblings, 0 replies; 4+ messages in thread
From: Daniel Barkalow @ 2007-04-08  0:29 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Alex Riesen, Johannes Schindelin

On Sat, 7 Apr 2007, Junio C Hamano wrote:

> Daniel Barkalow <barkalow@iabervon.org> writes:
> 
> > On Sat, 7 Apr 2007, Junio C Hamano wrote:
> >
> >> This fixes three buglets in threeway_merge() regarding D/F
> >> conflict entries.
> >> 
> >> * After finishing with path D and handling path D/F, some stages
> >>   have D/F conflict entry which are obviously non-NULL.  For the
> >>   purpose of determining if the path D/F is missing in the
> >>   ancestor, they should not be taken into account.
> >> 
> >> * D/F conflict entry is a phony entry and does not record the
> >>   path being processed, so do not pick up the name from there.
> >
> > This bit is unnecessary, because the first bit means we treat D/F conflict 
> > as missing in that conditional, and don't count it as an entry at all, let 
> > alone one with a useful name.
> 
> I am not sure about what you mean by "first bit"

Your first bullet point. You must have added the check to the path line 
before you added the same check to the condition a few lines above, making 
this check no longer necessary.

                if (!stages[i] || stages[i] == o->df_conflict_entry)
                        any_anc_missing = 1;
                else {

If we get here, stages[i] != o->df_conflict_entry...

                        if (!path && stages[i] != o->df_conflict_entry)
                                path = stages[i]->name;
                        no_anc_exists = 0;
                }

So you don't need the second check if you've got the first one, and the 
first one makes more sense anyway; for the purposes of this entire 
section, we want df_conflict_entry to count as missing, and we don't look 
at the paths of missing entries regardless of whether they're specially 
marked.

	-Daniel
*This .sig left intentionally blank*

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2007-04-08  0:29 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-04-07 14:40 [PATCH 2/5] Treat D/F conflict entry more carefully in unpack-trees.c::threeway_merge() Junio C Hamano
2007-04-07 19:08 ` Daniel Barkalow
2007-04-08  0:14   ` Junio C Hamano
2007-04-08  0:29     ` Daniel Barkalow

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).