1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-10-28 04:49:43 +01:00

merge-recursive: introduce new functions to handle rename logic

The amount of logic in merge_trees() relative to renames was just a few
lines, but split it out into new handle_renames() and cleanup_renames()
functions to prepare for additional logic to be added to each.  No code or
logic changes, just a new place to put stuff for when the rename detection
gains additional checks.

Note that process_renames() records pointers to various information (such
as diff_filepairs) into rename_conflict_info structs.  Even though the
rename string_lists are not directly used once handle_renames() completes,
we should not immediately free the lists at the end of that function
because they store the information referenced in the rename_conflict_info,
which is used later in process_entry().  Thus the reason for a separate
cleanup_renames().

Reviewed-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Elijah Newren 2018-04-19 10:58:00 -07:00 committed by Junio C Hamano
parent 9ba915577f
commit f172589e59

View file

@ -1646,6 +1646,32 @@ static int process_renames(struct merge_options *o,
return clean_merge;
}
struct rename_info {
struct string_list *head_renames;
struct string_list *merge_renames;
};
static int handle_renames(struct merge_options *o,
struct tree *common,
struct tree *head,
struct tree *merge,
struct string_list *entries,
struct rename_info *ri)
{
ri->head_renames = get_renames(o, head, common, head, merge, entries);
ri->merge_renames = get_renames(o, merge, common, head, merge, entries);
return process_renames(o, ri->head_renames, ri->merge_renames);
}
static void cleanup_renames(struct rename_info *re_info)
{
string_list_clear(re_info->head_renames, 0);
string_list_clear(re_info->merge_renames, 0);
free(re_info->head_renames);
free(re_info->merge_renames);
}
static struct object_id *stage_oid(const struct object_id *oid, unsigned mode)
{
return (is_null_oid(oid) || mode == 0) ? NULL: (struct object_id *)oid;
@ -2005,7 +2031,8 @@ int merge_trees(struct merge_options *o,
}
if (unmerged_cache()) {
struct string_list *entries, *re_head, *re_merge;
struct string_list *entries;
struct rename_info re_info;
int i;
/*
* Only need the hashmap while processing entries, so
@ -2019,9 +2046,8 @@ int merge_trees(struct merge_options *o,
get_files_dirs(o, merge);
entries = get_unmerged();
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);
clean = handle_renames(o, common, head, merge, entries,
&re_info);
record_df_conflict_files(o, entries);
if (clean < 0)
goto cleanup;
@ -2046,16 +2072,13 @@ int merge_trees(struct merge_options *o,
}
cleanup:
string_list_clear(re_merge, 0);
string_list_clear(re_head, 0);
cleanup_renames(&re_info);
string_list_clear(entries, 1);
free(entries);
hashmap_free(&o->current_file_dir_set, 1);
free(re_merge);
free(re_head);
free(entries);
if (clean < 0)
return clean;
}