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:
parent
a706e8f6fc
commit
2dd6f8aa84
@ -1636,6 +1636,32 @@ cleanup_and_return:
|
||||
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;
|
||||
@ -1995,7 +2021,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
|
||||
@ -2009,9 +2036,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;
|
||||
@ -2036,16 +2062,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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user