merge-recursive: split out code for determining diff_filepairs

Create a new function, get_diffpairs() to compute the diff_filepairs between two trees. While these are currently only used in get_renames(), I want them to be available to some new functions. No actual logic changes yet. Reviewed-by: Stefan Beller <sbeller@google.com> Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Elijah Newren committed Feb 14, 2018 at 10:51 UTC 3f646871a31d95576e11e74fc5db2e3ed2380b52
1 file changed +62 -22
merge-recursive.c
+62 -22
@@ -1312,24 +1312,15 @@ static int conflict_rename_rename_2to1(struct merge_options *o,
1312 }
1313
1314 /*
1315 - * Get information of all renames which occurred between 'o_tree' and
1316 - * 'tree'. We need the three trees in the merge ('o_tree', 'a_tree' and
1317 - * 'b_tree') to be able to associate the correct cache entries with
1318 - * the rename information. 'tree' is always equal to either a_tree or b_tree.
1315 + * Get the diff_filepairs changed between o_tree and tree.
1316 */
1320 -static struct string_list *get_renames(struct merge_options *o,
1321 - struct tree *tree,
1322 - struct tree *o_tree,
1323 - struct tree *a_tree,
1324 - struct tree *b_tree,
1325 - struct string_list *entries)
1317 +static struct diff_queue_struct *get_diffpairs(struct merge_options *o,
1318 + struct tree *o_tree,
1319 + struct tree *tree)
1320 {
1327 - int i;
1328 - struct string_list *renames;
1321 + struct diff_queue_struct *ret;
1322 struct diff_options opts;
1323
1331 - renames = xcalloc(1, sizeof(struct string_list));
1332 -
1324 diff_setup(&opts);
1325 opts.flags.recursive = 1;
1326 opts.flags.rename_empty = 0;
@@ -1345,10 +1336,41 @@ static struct string_list *get_renames(struct merge_options *o,
1336 diffcore_std(&opts);
1337 if (opts.needed_rename_limit > o->needed_rename_limit)
1338 o->needed_rename_limit = opts.needed_rename_limit;
1348 - for (i = 0; i < diff_queued_diff.nr; ++i) {
1339 +
1340 + ret = xmalloc(sizeof(*ret));
1341 + *ret = diff_queued_diff;
1342 +
1343 + opts.output_format = DIFF_FORMAT_NO_OUTPUT;
1344 + diff_queued_diff.nr = 0;
1345 + diff_queued_diff.queue = NULL;
1346 + diff_flush(&opts);
1347 + return ret;
1348 +}
1349 +
1350 +/*
1351 + * Get information of all renames which occurred in 'pairs', making use of
1352 + * any implicit directory renames inferred from the other side of history.
1353 + * We need the three trees in the merge ('o_tree', 'a_tree' and 'b_tree')
1354 + * to be able to associate the correct cache entries with the rename
1355 + * information; tree is always equal to either a_tree or b_tree.
1356 + */
1357 +static struct string_list *get_renames(struct merge_options *o,
1358 + struct diff_queue_struct *pairs,
1359 + struct tree *tree,
1360 + struct tree *o_tree,
1361 + struct tree *a_tree,
1362 + struct tree *b_tree,
1363 + struct string_list *entries)
1364 +{
1365 + int i;
1366 + struct string_list *renames;
1367 +
1368 + renames = xcalloc(1, sizeof(struct string_list));
1369 +
1370 + for (i = 0; i < pairs->nr; ++i) {
1371 struct string_list_item *item;
1372 struct rename *re;
1351 - struct diff_filepair *pair = diff_queued_diff.queue[i];
1373 + struct diff_filepair *pair = pairs->queue[i];
1374
1375 if (pair->status != 'R') {
1376 diff_free_filepair(pair);
@@ -1373,9 +1395,6 @@ static struct string_list *get_renames(struct merge_options *o,
1395 item = string_list_insert(renames, pair->one->path);
1396 item->util = re;
1397 }
1376 - opts.output_format = DIFF_FORMAT_NO_OUTPUT;
1377 - diff_queued_diff.nr = 0;
1378 - diff_flush(&opts);
1398 return renames;
1399 }
1400
@@ -1646,15 +1665,36 @@ static int handle_renames(struct merge_options *o,
1665 struct string_list *entries,
1666 struct rename_info *ri)
1667 {
1668 + struct diff_queue_struct *head_pairs, *merge_pairs;
1669 + int clean;
1670 +
1671 ri->head_renames = NULL;
1672 ri->merge_renames = NULL;
1673
1674 if (!o->detect_rename)
1675 return 1;
1676
1655 - ri->head_renames = get_renames(o, head, common, head, merge, entries);
1656 - ri->merge_renames = get_renames(o, merge, common, head, merge, entries);
1657 - return process_renames(o, ri->head_renames, ri->merge_renames);
1677 + head_pairs = get_diffpairs(o, common, head);
1678 + merge_pairs = get_diffpairs(o, common, merge);
1679 +
1680 + ri->head_renames = get_renames(o, head_pairs, head,
1681 + common, head, merge, entries);
1682 + ri->merge_renames = get_renames(o, merge_pairs, merge,
1683 + common, head, merge, entries);
1684 + clean = process_renames(o, ri->head_renames, ri->merge_renames);
1685 +
1686 + /*
1687 + * Some cleanup is deferred until cleanup_renames() because the
1688 + * data structures are still needed and referenced in
1689 + * process_entry(). But there are a few things we can free now.
1690 + */
1691 +
1692 + free(head_pairs->queue);
1693 + free(head_pairs);
1694 + free(merge_pairs->queue);
1695 + free(merge_pairs);
1696 +
1697 + return clean;
1698 }
1699
1700 static void cleanup_rename(struct string_list *rename)