Re: [PATCH 02/30] merge-recursive: Fix logic ordering issue
- From
Stefan Beller <sbeller@google.com>
- Date
- Nov 13, 2017, 19:48 UTC
- Message-ID
- <CAGZ79kYXbvDL_SoEENf60DsDFA-yEWfvgv8bNv_v+mw042ZH=w@mail.gmail.com>
- In-Reply-To
- <20171110190550.27059-3-newren@gmail.com>
On Fri, Nov 10, 2017 at 11:05 AM, Elijah Newren <newren@gmail.com> wrote:
Show 9 quoted lines
> merge_trees() did a variety of work, including: > * Calling get_unmerged() to get unmerged entries > * Calling record_df_conflict_files() with all unmerged entries to > do some work to ensure we could handle D/F conflicts correctly > * Calling get_renames() to check for renames. > > An easily overlooked issue is that get_renames() can create more > unmerged entries and add them to the list, which have the possibility of > being involved in D/F conflicts.
I presume these are created via insert_stage_data called in get_renames, when the path entry is not found?
Show 5 quoted lines
> So the call to > record_df_conflict_files() should really be moved after all the rename > detection. I didn't come up with any testcases demonstrating any bugs > with the old ordering, but I suspect there were some for both normal > renames and for directory renames. Fix the ordering.
It is hard to trace this down, though looking at 3af244caa8 (Cumulative update of merge-recursive in C, 2006-07-27) may help us reason about it.
How would a bug look like?
Show 25 quoted lines
>
> Signed-off-by: Elijah Newren <newren@gmail.com>
> ---
> merge-recursive.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/merge-recursive.c b/merge-recursive.c
> index 1d3f8f0d22..52521faf09 100644
> --- a/merge-recursive.c
> +++ b/merge-recursive.c
> @@ -1981,10 +1981,10 @@ int merge_trees(struct merge_options *o,
> get_files_dirs(o, merge);
>
> entries = get_unmerged();
> - record_df_conflict_files(o, entries);
> re_head = get_renames(o, head, common, head, merge, entries);
> re_merge = get_renames(o, merge, common, head, merge, entries);
> clean = process_renames(o, re_head, re_merge);
> + record_df_conflict_files(o, entries);
> if (clean < 0)
> goto cleanup;
> for (i = entries->nr-1; 0 <= i; i--) {
> --
> 2.15.0.5.g9567be9905
>