From: Elijah Newren <newren@gmail.com>
To: git@vger.kernel.org
Cc: Elijah Newren <newren@gmail.com>
Subject: [PATCH 19/37] merge-recursive: Move process_entry's content merging into a function
Date: Mon, 20 Sep 2010 02:28:52 -0600 [thread overview]
Message-ID: <1284971350-30590-20-git-send-email-newren@gmail.com> (raw)
In-Reply-To: <1284971350-30590-1-git-send-email-newren@gmail.com>
This move is in preparation for merge_content growing and being called from
multiple places in order to handle D/F conflicts.
I also snuck in a small change to the output in the case that the merged
content for the file matches the current file contents, to make it better
match (and thus more able to take over) how other merge_file() calls in
process_renames() are handled.
Signed-off-by: Elijah Newren <newren@gmail.com>
---
merge-recursive.c | 71 ++++++++++++++++++++++++++++++++---------------------
1 files changed, 43 insertions(+), 28 deletions(-)
diff --git a/merge-recursive.c b/merge-recursive.c
index a6da2cc..1f8b2d5 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -1139,6 +1139,47 @@ static void handle_delete_modify(struct merge_options *o,
}
}
+
+static int merge_content(struct merge_options *o,
+ const char *path,
+ unsigned char *o_sha, int o_mode,
+ unsigned char *a_sha, int a_mode,
+ unsigned char *b_sha, int b_mode)
+{
+ const char *reason = "content";
+ struct merge_file_info mfi;
+ struct diff_filespec one, a, b;
+
+ if (!o_sha) {
+ reason = "add/add";
+ o_sha = (unsigned char *)null_sha1;
+ }
+ one.path = a.path = b.path = (char *)path;
+ hashcpy(one.sha1, o_sha);
+ one.mode = o_mode;
+ hashcpy(a.sha1, a_sha);
+ a.mode = a_mode;
+ hashcpy(b.sha1, b_sha);
+ b.mode = b_mode;
+
+ mfi = merge_file(o, &one, &a, &b, o->branch1, o->branch2);
+ if (mfi.clean && sha_eq(mfi.sha, a_sha) && mfi.mode == a.mode)
+ output(o, 3, "Skipped %s (merged same as existing)", path);
+ else
+ output(o, 2, "Auto-merging %s", path);
+
+ if (!mfi.clean) {
+ if (S_ISGITLINK(mfi.mode))
+ reason = "submodule";
+ output(o, 1, "CONFLICT (%s): Merge conflict in %s",
+ reason, path);
+ }
+
+ update_file(o, mfi.clean, mfi.sha, mfi.mode, path);
+ return mfi.clean;
+
+}
+
/* Per entry merge function */
static int process_entry(struct merge_options *o,
const char *path, struct stage_data *entry)
@@ -1207,34 +1248,8 @@ static int process_entry(struct merge_options *o,
} else if (a_sha && b_sha) {
/* Case C: Added in both (check for same permissions) and */
/* case D: Modified in both, but differently. */
- const char *reason = "content";
- struct merge_file_info mfi;
- struct diff_filespec one, a, b;
-
- if (!o_sha) {
- reason = "add/add";
- o_sha = (unsigned char *)null_sha1;
- }
- output(o, 2, "Auto-merging %s", path);
- one.path = a.path = b.path = (char *)path;
- hashcpy(one.sha1, o_sha);
- one.mode = o_mode;
- hashcpy(a.sha1, a_sha);
- a.mode = a_mode;
- hashcpy(b.sha1, b_sha);
- b.mode = b_mode;
-
- mfi = merge_file(o, &one, &a, &b,
- o->branch1, o->branch2);
-
- clean_merge = mfi.clean;
- if (!mfi.clean) {
- if (S_ISGITLINK(mfi.mode))
- reason = "submodule";
- output(o, 1, "CONFLICT (%s): Merge conflict in %s",
- reason, path);
- }
- update_file(o, mfi.clean, mfi.sha, mfi.mode, path);
+ clean_merge = merge_content(o, path,
+ o_sha, o_mode, a_sha, a_mode, b_sha, b_mode);
} else if (!o_sha && !a_sha && !b_sha) {
/*
* this entry was deleted altogether. a_mode == 0 means
--
1.7.3.271.g16009
next prev parent reply other threads:[~2010-09-20 8:28 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-20 8:28 [PATCH 00/37] Audit and fix corner case bugs in recursive merge Elijah Newren
2010-09-20 8:28 ` [PATCH 01/37] t3030: Add a testcase for resolvable rename/add conflict with symlinks Elijah Newren
2010-09-20 9:15 ` Johannes Sixt
2010-09-20 9:34 ` Jakub Narebski
2010-09-20 8:28 ` [PATCH 02/37] merge-recursive: Restructure showing how to chain more process_* functions Elijah Newren
2010-09-20 8:28 ` [PATCH 03/37] t6032: Add a test checking for excessive output from merge Elijah Newren
2010-09-20 8:28 ` [PATCH 04/37] t6022: Add test combinations of {content conflict?, D/F conflict remains?} Elijah Newren
2010-09-20 8:28 ` [PATCH 05/37] t6022: Add tests for reversing order of merges when D/F conflicts present Elijah Newren
2010-09-20 8:28 ` [PATCH 06/37] t6022: Add tests with both rename source & dest involved in D/F conflicts Elijah Newren
2010-09-20 8:28 ` [PATCH 07/37] t6022: Add paired rename+D/F conflict: (two/file, one/file) -> (one, two) Elijah Newren
2010-09-20 8:28 ` [PATCH 08/37] t6022: Add tests for rename/rename combined with D/F conflicts Elijah Newren
2010-09-20 8:28 ` [PATCH 09/37] t6020: Modernize style a bit Elijah Newren
2010-09-20 9:24 ` Johannes Sixt
2010-09-20 16:03 ` Elijah Newren
2010-09-22 1:44 ` Junio C Hamano
2010-09-22 4:41 ` Elijah Newren
2010-09-20 8:28 ` [PATCH 10/37] t6020: Add a testcase for modify/delete + directory/file conflict Elijah Newren
2010-09-20 8:28 ` [PATCH 11/37] t6036: Test index and worktree state, not just that merge fails Elijah Newren
2010-09-20 8:28 ` [PATCH 12/37] t6036: Add a second testcase similar to the first but with content changes Elijah Newren
2010-09-20 8:28 ` [PATCH 13/37] t6036: Add testcase for undetected conflict Elijah Newren
2010-09-20 8:28 ` [PATCH 14/37] merge-recursive: Small code clarification -- variable name and comments Elijah Newren
2010-09-20 8:28 ` [PATCH 15/37] merge-recursive: Rename conflict_rename_rename*() for clarity Elijah Newren
2010-09-20 8:28 ` [PATCH 16/37] merge-recursive: Nuke rename/directory conflict detection Elijah Newren
2010-09-20 8:28 ` [PATCH 17/37] merge-recursive: Move rename/delete handling into dedicated function Elijah Newren
2010-09-20 8:28 ` [PATCH 18/37] merge-recursive: Move delete/modify " Elijah Newren
2010-09-20 8:28 ` Elijah Newren [this message]
2010-09-20 8:28 ` [PATCH 20/37] merge-recursive: New data structures for deferring of D/F conflicts Elijah Newren
2010-09-20 8:28 ` [PATCH 21/37] merge-recursive: New function to assist resolving renames in-core only Elijah Newren
2010-09-20 8:28 ` [PATCH 22/37] merge-recursive: Have process_entry() skip D/F or rename entries Elijah Newren
2010-09-20 8:28 ` [PATCH 23/37] merge-recursive: Structure process_df_entry() to handle more cases Elijah Newren
2010-09-20 8:28 ` [PATCH 24/37] merge-recursive: Update conflict_rename_rename_1to2() call signature Elijah Newren
2010-09-20 8:28 ` [PATCH 25/37] merge-recursive: Update merge_content() " Elijah Newren
2010-09-20 8:28 ` [PATCH 26/37] merge-recursive: Avoid doubly merging rename/add conflict contents Elijah Newren
2010-09-20 8:29 ` [PATCH 27/37] merge-recursive: Move handling of double rename of one file to two Elijah Newren
2010-09-20 8:29 ` [PATCH 28/37] merge-recursive: Move handling of double rename of one file to other file Elijah Newren
2010-09-20 8:29 ` [PATCH 29/37] merge-recursive: Delay handling of rename/delete conflicts Elijah Newren
2010-09-20 8:29 ` [PATCH 30/37] merge-recursive: Delay content merging for renames Elijah Newren
2010-09-20 8:29 ` [PATCH 31/37] merge-recursive: Delay modify/delete conflicts if D/F conflict present Elijah Newren
2010-09-20 8:29 ` [PATCH 32/37] conflict_rename_delete(): Check whether D/F conflicts are still present Elijah Newren
2010-09-20 8:29 ` [PATCH 33/37] conflict_rename_rename_1to2(): Fix checks for presence of D/F conflicts Elijah Newren
2010-09-20 8:29 ` [PATCH 34/37] merge_content(): Check whether D/F conflicts are still present Elijah Newren
2010-09-20 8:29 ` [PATCH 35/37] handle_delete_modify(): " Elijah Newren
2010-09-20 8:29 ` [PATCH 36/37] merge-recursive: Make room for directories in D/F conflicts Elijah Newren
2010-09-20 11:40 ` Johannes Sixt
2010-09-20 16:06 ` Elijah Newren
2010-09-20 8:29 ` [PATCH 37/37] merge-recursive: Remove redundant path clearing for " 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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1284971350-30590-20-git-send-email-newren@gmail.com \
--to=newren@gmail.com \
--cc=git@vger.kernel.org \
/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.
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 NNTP newsgroup(s).