From 7fe40b88efc721bfcbe69f00f950eb9f7a9cd236 Mon Sep 17 00:00:00 2001 From: Elijah Newren Date: Thu, 19 Apr 2018 10:58:05 -0700 Subject: merge-recursive: add get_directory_renames() This populates a set of directory renames for us. The set of directory renames is not yet used, but will be in subsequent commits. Note that the use of a string_list for possible_new_dirs in the new dir_rename_entry struct implies an O(n^2) algorithm; however, in practice I expect the number of distinct directories that files were renamed into from a single original directory to be O(1). My guess is that n has a mode of 1 and a mean of less than 2, so, for now, string_list seems good enough for possible_new_dirs. Reviewed-by: Stefan Beller Signed-off-by: Elijah Newren Signed-off-by: Junio C Hamano --- merge-recursive.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'merge-recursive.h') diff --git a/merge-recursive.h b/merge-recursive.h index 80d69d1401..fe64c78de4 100644 --- a/merge-recursive.h +++ b/merge-recursive.h @@ -29,6 +29,24 @@ struct merge_options { struct string_list df_conflict_file_set; }; +/* + * For dir_rename_entry, directory names are stored as a full path from the + * toplevel of the repository and do not include a trailing '/'. Also: + * + * dir: original name of directory being renamed + * non_unique_new_dir: if true, could not determine new_dir + * new_dir: final name of directory being renamed + * possible_new_dirs: temporary used to help determine new_dir; see comments + * in get_directory_renames() for details + */ +struct dir_rename_entry { + struct hashmap_entry ent; /* must be the first member! */ + char *dir; + unsigned non_unique_new_dir:1; + struct strbuf new_dir; + struct string_list possible_new_dirs; +}; + /* merge_trees() but with recursive ancestor consolidation */ int merge_recursive(struct merge_options *o, struct commit *h1, -- cgit v1.2.3