From: Elijah Newren <newren@gmail.com>
To: git@vger.kernel.org
Cc: sbeller@google.com, gitster@pobox.com, Elijah Newren <newren@gmail.com>
Subject: [PATCH v2 16/33] merge-recursive: introduce new functions to handle rename logic
Date: Mon, 20 Nov 2017 14:01:52 -0800 [thread overview]
Message-ID: <20171120220209.15111-17-newren@gmail.com> (raw)
In-Reply-To: <20171120220209.15111-1-newren@gmail.com>
The amount of logic in merge_trees() relative to renames was just a few
lines, but split it out into new handle_renames() and cleanup_renames()
functions to prepare for additional logic to be added to each. No code or
logic changes, just a new place to put stuff for when the rename detection
gains additional checks.
Note that process_renames() records pointers to various information (such
as diff_filepairs) into rename_conflict_info structs. Even though the
rename string_lists are not directly used once handle_renames() completes,
we should not immediately free the lists at the end of that function
because they store the information referenced in the rename_conflict_info,
which is used later in process_entry(). Thus the reason for a separate
cleanup_renames().
Signed-off-by: Elijah Newren <newren@gmail.com>
---
merge-recursive.c | 43 +++++++++++++++++++++++++++++++++----------
1 file changed, 33 insertions(+), 10 deletions(-)
diff --git a/merge-recursive.c b/merge-recursive.c
index 91bc354bec..4249caad4d 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -1636,6 +1636,32 @@ static int process_renames(struct merge_options *o,
return clean_merge;
}
+struct rename_info {
+ struct string_list *head_renames;
+ struct string_list *merge_renames;
+};
+
+static int handle_renames(struct merge_options *o,
+ struct tree *common,
+ struct tree *head,
+ struct tree *merge,
+ struct string_list *entries,
+ struct rename_info *ri)
+{
+ ri->head_renames = get_renames(o, head, common, head, merge, entries);
+ ri->merge_renames = get_renames(o, merge, common, head, merge, entries);
+ return process_renames(o, ri->head_renames, ri->merge_renames);
+}
+
+static void cleanup_renames(struct rename_info *re_info)
+{
+ string_list_clear(re_info->head_renames, 0);
+ string_list_clear(re_info->merge_renames, 0);
+
+ free(re_info->head_renames);
+ free(re_info->merge_renames);
+}
+
static struct object_id *stage_oid(const struct object_id *oid, unsigned mode)
{
return (is_null_oid(oid) || mode == 0) ? NULL: (struct object_id *)oid;
@@ -1987,7 +2013,8 @@ int merge_trees(struct merge_options *o,
}
if (unmerged_cache()) {
- struct string_list *entries, *re_head, *re_merge;
+ struct string_list *entries;
+ struct rename_info re_info;
int i;
/*
* Only need the hashmap while processing entries, so
@@ -2001,9 +2028,8 @@ int merge_trees(struct merge_options *o,
get_files_dirs(o, merge);
entries = get_unmerged();
- re_head = get_renames(o, head, common, head, merge, entries);
- re_merge = get_renames(o, merge, common, head, merge, entries);
- clean = process_renames(o, re_head, re_merge);
+ clean = handle_renames(o, common, head, merge, entries,
+ &re_info);
record_df_conflict_files(o, entries);
if (clean < 0)
goto cleanup;
@@ -2028,16 +2054,13 @@ int merge_trees(struct merge_options *o,
}
cleanup:
- string_list_clear(re_merge, 0);
- string_list_clear(re_head, 0);
+ cleanup_renames(&re_info);
+
string_list_clear(entries, 1);
+ free(entries);
hashmap_free(&o->current_file_dir_set, 1);
- free(re_merge);
- free(re_head);
- free(entries);
-
if (clean < 0)
return clean;
}
--
2.15.0.309.g00c152f825
next prev parent reply other threads:[~2017-11-20 22:04 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-20 22:01 [PATCH v2 00/33] Add directory rename detection to git Elijah Newren
2017-11-20 22:01 ` [PATCH v2 01/33] Tighten and correct a few testcases for merging and cherry-picking Elijah Newren
2017-11-20 22:01 ` [PATCH v2 02/33] merge-recursive: fix logic ordering issue Elijah Newren
2017-11-20 22:01 ` [PATCH v2 03/33] merge-recursive: add explanation for src_entry and dst_entry Elijah Newren
2017-11-20 22:01 ` [PATCH v2 04/33] directory rename detection: basic testcases Elijah Newren
2017-11-20 22:01 ` [PATCH v2 05/33] directory rename detection: directory splitting testcases Elijah Newren
2017-11-20 22:01 ` [PATCH v2 06/33] directory rename detection: testcases to avoid taking detection too far Elijah Newren
2017-11-20 22:01 ` [PATCH v2 07/33] directory rename detection: partially renamed directory testcase/discussion Elijah Newren
2017-11-20 22:01 ` [PATCH v2 08/33] directory rename detection: files/directories in the way of some renames Elijah Newren
2017-11-20 22:01 ` [PATCH v2 09/33] directory rename detection: testcases checking which side did the rename Elijah Newren
2017-11-20 22:01 ` [PATCH v2 10/33] directory rename detection: more involved edge/corner testcases Elijah Newren
2017-11-20 22:01 ` [PATCH v2 11/33] directory rename detection: testcases exploring possibly suboptimal merges Elijah Newren
2017-11-20 22:01 ` [PATCH v2 12/33] directory rename detection: miscellaneous testcases to complete coverage Elijah Newren
2017-11-20 22:01 ` [PATCH v2 13/33] directory rename detection: tests for handling overwriting untracked files Elijah Newren
2017-11-20 22:01 ` [PATCH v2 14/33] directory rename detection: tests for handling overwriting dirty files Elijah Newren
2017-11-20 22:01 ` [PATCH v2 15/33] merge-recursive: move the get_renames() function Elijah Newren
2017-11-20 22:01 ` Elijah Newren [this message]
2017-11-20 22:01 ` [PATCH v2 17/33] merge-recursive: fix leaks of allocated renames and diff_filepairs Elijah Newren
2017-11-20 22:01 ` [PATCH v2 18/33] merge-recursive: make !o->detect_rename codepath more obvious Elijah Newren
2017-11-20 22:01 ` [PATCH v2 19/33] merge-recursive: split out code for determining diff_filepairs Elijah Newren
2017-11-20 22:01 ` [PATCH v2 20/33] merge-recursive: add a new hashmap for storing directory renames Elijah Newren
2017-11-20 22:01 ` [PATCH v2 21/33] merge-recursive: add get_directory_renames() Elijah Newren
2017-11-20 22:01 ` [PATCH v2 22/33] merge-recursive: check for directory level conflicts Elijah Newren
2017-11-20 22:01 ` [PATCH v2 23/33] merge-recursive: add a new hashmap for storing file collisions Elijah Newren
2017-11-20 22:02 ` [PATCH v2 24/33] merge-recursive: add computation of collisions due to dir rename & merging Elijah Newren
2017-11-20 22:02 ` [PATCH v2 25/33] merge-recursive: check for file level conflicts then get new name Elijah Newren
2017-11-20 22:02 ` [PATCH v2 26/33] merge-recursive: when comparing files, don't include trees Elijah Newren
2017-11-20 22:02 ` [PATCH v2 27/33] merge-recursive: apply necessary modifications for directory renames Elijah Newren
2017-11-20 22:02 ` [PATCH v2 28/33] merge-recursive: avoid clobbering untracked files with " Elijah Newren
2017-11-20 22:02 ` [PATCH v2 29/33] merge-recursive: fix overwriting dirty files involved in renames Elijah Newren
2017-11-20 22:02 ` [PATCH v2 30/33] merge-recursive: fix remaining directory rename + dirty overwrite cases Elijah Newren
2017-11-20 22:02 ` [PATCH v2 31/33] directory rename detection: new testcases showcasing a pair of bugs Elijah Newren
2017-11-20 22:02 ` [PATCH v2 32/33] merge-recursive: avoid spurious rename/rename conflict from dir renames Elijah Newren
2017-11-20 22:02 ` [PATCH v2 33/33] merge-recursive: ensure we write updates for directory-renamed file Elijah Newren
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20171120220209.15111-17-newren@gmail.com \
--to=newren@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=sbeller@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).