git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCHv6 12/31] merge-recursive: move the get_renames() function

From
Elijah Newren <newren@gmail.com>
Date
Jan 5, 2018, 20:26 UTC
Message-ID
<20180105202711.24311-13-newren@gmail.com>
In-Reply-To
<20180105202711.24311-1-newren@gmail.com>

I want to re-use some other functions in the file without moving those other functions or dealing with a handful of annoying split function declarations and definitions.

Signed-off-by: Elijah Newren <newren@gmail.com>
---
 merge-recursive.c | 139 +++++++++++++++++++++++++++---------------------------
 1 file changed, 70 insertions(+), 69 deletions(-)
diff --git a/merge-recursive.c b/merge-recursive.c
index d78853d5e..08bf26b9c 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -537,75 +537,6 @@ struct rename {
 	unsigned processed:1;
 };
 
-/*
- * Get information of all renames which occurred between 'o_tree' and
- * 'tree'. We need the three trees in the merge ('o_tree', 'a_tree' and
- * 'b_tree') to be able to associate the correct cache entries with
- * the rename information. 'tree' is always equal to either a_tree or b_tree.
- */
-static struct string_list *get_renames(struct merge_options *o,
-				       struct tree *tree,
-				       struct tree *o_tree,
-				       struct tree *a_tree,
-				       struct tree *b_tree,
-				       struct string_list *entries)
-{
-	int i;
-	struct string_list *renames;
-	struct diff_options opts;
-
-	renames = xcalloc(1, sizeof(struct string_list));
-	if (!o->detect_rename)
-		return renames;
-
-	diff_setup(&opts);
-	opts.flags.recursive = 1;
-	opts.flags.rename_empty = 0;
-	opts.detect_rename = DIFF_DETECT_RENAME;
-	opts.rename_limit = o->merge_rename_limit >= 0 ? o->merge_rename_limit :
-			    o->diff_rename_limit >= 0 ? o->diff_rename_limit :
-			    1000;
-	opts.rename_score = o->rename_score;
-	opts.show_rename_progress = o->show_rename_progress;
-	opts.output_format = DIFF_FORMAT_NO_OUTPUT;
-	diff_setup_done(&opts);
-	diff_tree_oid(&o_tree->object.oid, &tree->object.oid, "", &opts);
-	diffcore_std(&opts);
-	if (opts.needed_rename_limit > o->needed_rename_limit)
-		o->needed_rename_limit = opts.needed_rename_limit;
-	for (i = 0; i < diff_queued_diff.nr; ++i) {
-		struct string_list_item *item;
-		struct rename *re;
-		struct diff_filepair *pair = diff_queued_diff.queue[i];
-		if (pair->status != 'R') {
-			diff_free_filepair(pair);
-			continue;
-		}
-		re = xmalloc(sizeof(*re));
-		re->processed = 0;
-		re->pair = pair;
-		item = string_list_lookup(entries, re->pair->one->path);
-		if (!item)
-			re->src_entry = insert_stage_data(re->pair->one->path,
-					o_tree, a_tree, b_tree, entries);
-		else
-			re->src_entry = item->util;
-
-		item = string_list_lookup(entries, re->pair->two->path);
-		if (!item)
-			re->dst_entry = insert_stage_data(re->pair->two->path,
-					o_tree, a_tree, b_tree, entries);
-		else
-			re->dst_entry = item->util;
-		item = string_list_insert(renames, pair->one->path);
-		item->util = re;
-	}
-	opts.output_format = DIFF_FORMAT_NO_OUTPUT;
-	diff_queued_diff.nr = 0;
-	diff_flush(&opts);
-	return renames;
-}
-
 static int update_stages(struct merge_options *opt, const char *path,
 			 const struct diff_filespec *o,
 			 const struct diff_filespec *a,
@@ -1380,6 +1311,76 @@ static int conflict_rename_rename_2to1(struct merge_options *o,
 	return ret;
 }
 
+/*
+ * Get information of all renames which occurred between 'o_tree' and
+ * 'tree'. We need the three trees in the merge ('o_tree', 'a_tree' and
+ * 'b_tree') to be able to associate the correct cache entries with
+ * the rename information. 'tree' is always equal to either a_tree or b_tree.
+ */
+static struct string_list *get_renames(struct merge_options *o,
+				       struct tree *tree,
+				       struct tree *o_tree,
+				       struct tree *a_tree,
+				       struct tree *b_tree,
+				       struct string_list *entries)
+{
+	int i;
+	struct string_list *renames;
+	struct diff_options opts;
+
+	renames = xcalloc(1, sizeof(struct string_list));
+	if (!o->detect_rename)
+		return renames;
+
+	diff_setup(&opts);
+	opts.flags.recursive = 1;
+	opts.flags.rename_empty = 0;
+	opts.detect_rename = DIFF_DETECT_RENAME;
+	opts.rename_limit = o->merge_rename_limit >= 0 ? o->merge_rename_limit :
+			    o->diff_rename_limit >= 0 ? o->diff_rename_limit :
+			    1000;
+	opts.rename_score = o->rename_score;
+	opts.show_rename_progress = o->show_rename_progress;
+	opts.output_format = DIFF_FORMAT_NO_OUTPUT;
+	diff_setup_done(&opts);
+	diff_tree_oid(&o_tree->object.oid, &tree->object.oid, "", &opts);
+	diffcore_std(&opts);
+	if (opts.needed_rename_limit > o->needed_rename_limit)
+		o->needed_rename_limit = opts.needed_rename_limit;
+	for (i = 0; i < diff_queued_diff.nr; ++i) {
+		struct string_list_item *item;
+		struct rename *re;
+		struct diff_filepair *pair = diff_queued_diff.queue[i];
+
+		if (pair->status != 'R') {
+			diff_free_filepair(pair);
+			continue;
+		}
+		re = xmalloc(sizeof(*re));
+		re->processed = 0;
+		re->pair = pair;
+		item = string_list_lookup(entries, re->pair->one->path);
+		if (!item)
+			re->src_entry = insert_stage_data(re->pair->one->path,
+					o_tree, a_tree, b_tree, entries);
+		else
+			re->src_entry = item->util;
+
+		item = string_list_lookup(entries, re->pair->two->path);
+		if (!item)
+			re->dst_entry = insert_stage_data(re->pair->two->path,
+					o_tree, a_tree, b_tree, entries);
+		else
+			re->dst_entry = item->util;
+		item = string_list_insert(renames, pair->one->path);
+		item->util = re;
+	}
+	opts.output_format = DIFF_FORMAT_NO_OUTPUT;
+	diff_queued_diff.nr = 0;
+	diff_flush(&opts);
+	return renames;
+}
+
 static int process_renames(struct merge_options *o,
 			   struct string_list *a_renames,
 			   struct string_list *b_renames)
-- 
2.14.2
Previous: Elijah NewrenNext: Elijah Newren
Message 30 of 34 in “[PATCHv6 00/31] Add directory rename detection to git”
  1. Elijah NewrenJan 5, 2018
  2. 01/31 directory rename detection: basic testcasesElijah Newren, Jan 5, 2018
  3. 07/31 directory rename detection: more involved edge/corner testcasesElijah Newren, Jan 5, 2018
  4. 08/31 directory rename detection: testcases exploring possibly suboptimal mergesElijah Newren, Jan 5, 2018
  5. 05/31 directory rename detection: files/directories in the way of some renamesElijah Newren, Jan 5, 2018
  6. 15/31 merge-recursive: make !o->detect_rename codepath more obviousElijah Newren, Jan 5, 2018
  7. 17/31 merge-recursive: add a new hashmap for storing directory renamesElijah Newren, Jan 5, 2018
  8. 19/31 merge-recursive: add get_directory_renames()Elijah Newren, Jan 5, 2018
  9. 18/31 merge-recursive: make a helper function for cleanup for handle_renamesElijah Newren, Jan 5, 2018
  10. 23/31 merge-recursive: check for file level conflicts then get new nameElijah Newren, Jan 5, 2018
  11. 25/31 merge-recursive: apply necessary modifications for directory renamesElijah Newren, Jan 5, 2018
  12. 28/31 merge-recursive: fix remaining directory rename + dirty overwrite casesElijah Newren, Jan 5, 2018
  13. 30/31 merge-recursive: avoid spurious rename/rename conflict from dir renamesElijah Newren, Jan 5, 2018
  14. 29/31 directory rename detection: new testcases showcasing a pair of bugsElijah Newren, Jan 5, 2018
  15. 31/31 merge-recursive: ensure we write updates for directory-renamed fileElijah Newren, Jan 5, 2018
  16. 26/31 merge-recursive: avoid clobbering untracked files with directory renamesElijah Newren, Jan 5, 2018
  17. 27/31 merge-recursive: fix overwriting dirty files involved in renamesElijah Newren, Jan 5, 2018
  18. 24/31 merge-recursive: when comparing files, don't include treesElijah Newren, Jan 5, 2018
  19. 22/31 merge-recursive: add computation of collisions due to dir rename & mergingElijah Newren, Jan 5, 2018
  20. 20/31 merge-recursive: check for directory level conflictsElijah Newren, Jan 5, 2018
  21. 21/31 merge-recursive: add a new hashmap for storing file collisionsElijah Newren, Jan 5, 2018
  22. 10/31 directory rename detection: tests for handling overwriting untracked filesElijah Newren, Jan 5, 2018
  23. 16/31 merge-recursive: split out code for determining diff_filepairsElijah Newren, Jan 5, 2018
  24. 06/31 directory rename detection: testcases checking which side did the renameElijah Newren, Jan 5, 2018
  25. 14/31 merge-recursive: fix leaks of allocated renames and diff_filepairsElijah Newren, Jan 5, 2018
  26. 09/31 directory rename detection: miscellaneous testcases to complete coverageElijah Newren, Jan 5, 2018
  27. 13/31 merge-recursive: introduce new functions to handle rename logicElijah Newren, Jan 5, 2018
  28. 02/31 directory rename detection: directory splitting testcasesElijah Newren, Jan 5, 2018
  29. 11/31 directory rename detection: tests for handling overwriting dirty filesElijah Newren, Jan 5, 2018
  30. 12/31 merge-recursive: move the get_renames() functionElijah Newren, Jan 5, 2018
  31. 04/31 directory rename detection: partially renamed directory testcase/discussionElijah Newren, Jan 5, 2018
  32. 03/31 directory rename detection: testcases to avoid taking detection too farElijah Newren, Jan 5, 2018
  33. SZEDER GáborJan 26, 2018
  34. Elijah NewrenJan 26, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.