[PATCH v3 23/33] merge-recursive: add a new hashmap for storing file collisions
From: Elijah Newren <hidden>
Date: 2017-11-21 08:02:26
Subsystem:
the rest · Maintainer:
Linus Torvalds
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 <redacted> --- merge-recursive.c | 23 +++++++++++++++++++++++ merge-recursive.h | 7 +++++++ 2 files changed, 30 insertions(+)
diff --git a/merge-recursive.c b/merge-recursive.c
index c235b27c55..1fa3eb6fb5 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 a024949739..e02c1e1243 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.309.g62ce55426d