Directory renames with the ability to merge directories opens up the possibility of add/add/add/.../add conflicts, if each of the N directories being merged into one target directory all had a file with the same name. We need a way to check for and report on such collisions; this hashmap will be used for this purpose.
Signed-off-by: Elijah Newren <new...@gmail.com> --- merge-recursive.c | 23 +++++++++++++++++++++++ merge-recursive.h | 7 +++++++ 2 files changed, 30 insertions(+) diff --git a/merge-recursive.c b/merge-recursive.c index d92fba2775..6bd4f34d55 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -84,6 +84,29 @@ static void dir_rename_entry_init(struct dir_rename_entry *entry, string_list_init(&entry->possible_new_dirs, 0); } +static struct collision_entry *collision_find_entry(struct hashmap *hashmap, + char *target_file) +{ + struct collision_entry key; + + hashmap_entry_init(&key, strhash(target_file)); + key.target_file = target_file; + return hashmap_get(hashmap, &key, NULL); +} + +static int collision_cmp(void *unused_cmp_data, + const struct collision_entry *e1, + const struct collision_entry *e2, + const void *unused_keydata) +{ + return strcmp(e1->target_file, e2->target_file); +} + +static void collision_init(struct hashmap *map) +{ + hashmap_init(map, (hashmap_cmp_fn) collision_cmp, NULL, 0); +} + static void flush_output(struct merge_options *o) { if (o->buffer_output < 2 && o->obuf.len) { diff --git a/merge-recursive.h b/merge-recursive.h index d7f4cc80c1..e1be27f57c 100644 --- a/merge-recursive.h +++ b/merge-recursive.h @@ -37,6 +37,13 @@ struct dir_rename_entry { struct string_list possible_new_dirs; }; +struct collision_entry { + struct hashmap_entry ent; /* must be the first member! */ + char *target_file; + struct string_list source_files; + unsigned reported_already:1; +}; + /* merge_trees() but with recursive ancestor consolidation */ int merge_recursive(struct merge_options *o, struct commit *h1, -- 2.15.0.408.g850bc54b15