@@ -480,6 +480,27 @@ static void setup_path_info(struct merge_options *opt,
result->util = mi;
}
+static void collect_rename_info(struct merge_options *opt,
+ struct name_entry *names,
+ const char *dirname,
+ const char *fullname,
+ unsigned filemask,
+ unsigned dirmask,
+ unsigned match_mask)
+{
+ struct rename_info *renames = &opt->priv->renames;
+
+ /* Update dirs_removed, as needed */
+ if (dirmask == 1 || dirmask == 3 || dirmask == 5) {
+ /* absent_mask = 0x07 - dirmask; sides = absent_mask/2 */
+ unsigned sides = (0x07 - dirmask)/2;
+ if (sides & 1)
+ strset_add(&renames->dirs_removed[1], fullname);
+ if (sides & 2)
+ strset_add(&renames->dirs_removed[2], fullname);
+ }
+}
+
static int collect_merge_info_callback(int n,
unsigned long mask,
unsigned long dirmask,
@@ -580,6 +601,12 @@ static int collect_merge_info_callback(int n,
return mask;
}
+ /*
+ * Gather additional information used in rename detection.
+ */
+ collect_rename_info(opt, names, dirname, fullpath,
+ filemask, dirmask, match_mask);
+
/*
* Record information about the path so we can resolve later in
* process_entries.