From: Johannes Schindelin Date: Mon, 15 Dec 2008 09:34:05 GMT Subject: Re: [PATCH] modify/delete conflict resolution overwrites untracked file Message-ID: In-Reply-To: <7vmyeyyuuh.fsf@gitster.siamese.dyndns.org> Hi, On Sun, 14 Dec 2008, Junio C Hamano wrote: > merge-recursive: do not clobber untracked working tree garbage > > When merge-recursive wanted to create a new file in the work tree (either > as the final result, or a hint for reference purposes while delete/modify > conflicts), it unconditionally overwrote an untracked file in the working > tree. Be careful not to lose whatever the user has that is not tracked. > > Signed-off-by: Junio C Hamano > --- Thanks, I had no time at all to look into this issue. > diff --git c/merge-recursive.c w/merge-recursive.c > index a0c804c..2da4333 100644 > --- c/merge-recursive.c > +++ w/merge-recursive.c > @@ -447,6 +447,30 @@ static void flush_buffer(int fd, const char *buf, unsigned long size) > } > } > > +static int would_lose_untracked(const char *path) > +{ > + int pos = cache_name_pos(path, strlen(path)); > + > + if (pos < 0) > + pos = -1 - pos; > + while (pos < active_nr && > + !strcmp(path, active_cache[pos]->name)) { > + /* > + * If stage #0, it is definitely tracked. > + * If it has stage #2 then it was tracked > + * before this merge started. All other > + * cases the path was not tracked. > + */ > + switch (ce_stage(active_cache[pos])) { > + case 0: > + case 2: > + return 0; > + } > + pos++; > + } > + return file_exists(path); I wonder if it is cheaper to test file_exists() when the index contains a lot of files... Thanks, Dscho