path: root/merge-recursive.h
diff options
authorElijah Newren <>2018-04-19 17:58:05 (GMT)
committerJunio C Hamano <>2018-05-08 07:11:00 (GMT)
commit7fe40b88efc721bfcbe69f00f950eb9f7a9cd236 (patch)
tree3a2883c0f0693231dbf2a5f92559076b3438401d /merge-recursive.h
parentffc16c490ad533bc07e6d8ec0226b426166e8442 (diff)
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 <>
Diffstat (limited to 'merge-recursive.h')
1 files changed, 18 insertions, 0 deletions
diff --git a/merge-recursive.h b/merge-recursive.h
index 80d69d1..fe64c78 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,