Re: [PATCH] modify/delete conflict resolution overwrites untracked file
- From
Johannes Schindelin <johannes.schindelin@gmx.de>
- Date
- Dec 15, 2008, 09:34 UTC
- Message-ID
- <alpine.DEB.1.00.0812151032230.14632@racer>
- In-Reply-To
- <7vmyeyyuuh.fsf@gitster.siamese.dyndns.org>
Hi,
On Sun, 14 Dec 2008, Junio C Hamano wrote:
Show 9 quoted lines
> 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 <gitster@pobox.com> > ---
Thanks, I had no time at all to look into this issue.
Show 30 quoted lines
> 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