merge-ort: add helper functions for using cached renames
If we have a usable rename cache, then we can remove from relevant_sources all the paths that were cached; diffcore_rename_extended() can then consider an even smaller set of relevant_sources in its rename detection. However, when diffcore_rename_extended() is done, we will need to take the renames it detected and then add back in all the ones we had cached from before. Add helper functions for doing these two operations; the next commit will make use of them. Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Elijah Newren committed
May 20, 2021 at 06:09 UTC
86b41b389546e68164ed58f6e60297a391cdca83
1 file changed
+47
merge-ort.c
+47
@@ -2371,6 +2371,53 @@ static void resolve_diffpair_statuses(struct diff_queue_struct *q)
2371
}
2372
}
2373
2374
+MAYBE_UNUSED
2375
+static void prune_cached_from_relevant(struct rename_info *renames,
2376
+ unsigned side)
2377
+{
2378
+ /* Reason for this function described in add_pair() */
2379
+ struct hashmap_iter iter;
2380
+ struct strmap_entry *entry;
2381
+
2382
+ /* Remove from relevant_sources all entries in cached_pairs[side] */
2383
+ strmap_for_each_entry(&renames->cached_pairs[side], &iter, entry) {
2384
+ strintmap_remove(&renames->relevant_sources[side],
2385
+ entry->key);
2386
+ }
2387
+ /* Remove from relevant_sources all entries in cached_irrelevant[side] */
2388
+ strset_for_each_entry(&renames->cached_irrelevant[side], &iter, entry) {
2389
+ strintmap_remove(&renames->relevant_sources[side],
2390
+ entry->key);
2391
+ }
2392
+}
2393
+
2394
+MAYBE_UNUSED
2395
+static void use_cached_pairs(struct merge_options *opt,
2396
+ struct strmap *cached_pairs,
2397
+ struct diff_queue_struct *pairs)
2398
+{
2399
+ struct hashmap_iter iter;
2400
+ struct strmap_entry *entry;
2401
+
2402
+ /*
2403
+ * Add to side_pairs all entries from renames->cached_pairs[side_index].
2404
+ * (Info in cached_irrelevant[side_index] is not relevant here.)
2405
+ */
2406
+ strmap_for_each_entry(cached_pairs, &iter, entry) {
2407
+ struct diff_filespec *one, *two;
2408
+ const char *old_name = entry->key;
2409
+ const char *new_name = entry->value;
2410
+ if (!new_name)
2411
+ new_name = old_name;
2412
+
2413
+ /* We don't care about oid/mode, only filenames and status */
2414
+ one = alloc_filespec(old_name);
2415
+ two = alloc_filespec(new_name);
2416
+ diff_queue(pairs, one, two);
2417
+ pairs->queue[pairs->nr-1]->status = entry->value ? 'R' : 'D';
2418
+ }
2419
+}
2420
+
2421
static void cache_new_pair(struct rename_info *renames,
2422
int side,
2423
char *old_path,