From: Eyvind Bernhardsen <eyvind.bernhardsen@gmail.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: Johannes Sixt <j.sixt@viscovery.net>,
Finn Arne Gangstad <finnag@pvv.org>,
"git@vger.kernel.org List" <git@vger.kernel.org>
Subject: [PATCH v4 2/3] Try normalizing files to avoid delete/modify conflicts when merging
Date: Sun, 27 Jun 2010 21:43:06 +0200 [thread overview]
Message-ID: <0497dd2d68e65e9d2ec1d40f82231557ff95c04c.1277667177.git.eyvind.bernhardsen@gmail.com> (raw)
In-Reply-To: <cover.1277667177.git.eyvind.bernhardsen@gmail.com>
In-Reply-To: <cover.1277667177.git.eyvind.bernhardsen@gmail.com>
If a file is modified due to normalization on one branch, and deleted on
another, a merge of the two branches will result in a delete/modify
conflict for that file even if it is otherwise unchanged.
Try to avoid the conflict by normalizing and comparing the "base" file
and the modified file when their sha1s differ. If they compare equal,
the file is considered unmodified and is deleted.
Signed-off-by: Eyvind Bernhardsen <eyvind.bernhardsen@gmail.com>
---
merge-recursive.c | 44 ++++++++++++++++++++++++++++++++++++++++++--
t/t6038-merge-text-auto.sh | 2 +-
2 files changed, 43 insertions(+), 3 deletions(-)
diff --git a/merge-recursive.c b/merge-recursive.c
index 206c103..f4f09a2 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -1056,6 +1056,44 @@ static unsigned char *stage_sha(const unsigned char *sha, unsigned mode)
return (is_null_sha1(sha) || mode == 0) ? NULL: (unsigned char *)sha;
}
+static int read_sha1_strbuf(const unsigned char *sha, const char *path,
+ struct strbuf *dst)
+{
+ void *buf;
+ enum object_type type;
+ unsigned long size;
+ buf = read_sha1_file(sha, &type, &size);
+ if (!buf)
+ return 0;
+ if (type != OBJ_BLOB) {
+ free(buf);
+ return 0;
+ }
+ strbuf_attach(dst, buf, size, size + 1);
+ return 1;
+}
+
+static int normalized_eq(const unsigned char *a_sha,
+ const unsigned char *b_sha,
+ const char *path)
+{
+ struct strbuf a = STRBUF_INIT;
+ struct strbuf b = STRBUF_INIT;
+ int ret = 0;
+ if (a_sha && b_sha &&
+ read_sha1_strbuf(a_sha, path, &a) &&
+ read_sha1_strbuf(b_sha, path, &b)) {
+ /* Both files must be normalized, so we can't use || */
+ if ((renormalize_buffer(path, a.buf, a.len, &a) |
+ renormalize_buffer(path, b.buf, b.len, &b)) &&
+ (a.len == b.len))
+ ret = memcmp(a.buf, b.buf, a.len) == 0;
+ }
+ strbuf_release(&a);
+ strbuf_release(&b);
+ return ret;
+}
+
/* Per entry merge function */
static int process_entry(struct merge_options *o,
const char *path, struct stage_data *entry)
@@ -1075,8 +1113,10 @@ static int process_entry(struct merge_options *o,
if (o_sha && (!a_sha || !b_sha)) {
/* Case A: Deleted in one */
if ((!a_sha && !b_sha) ||
- (sha_eq(a_sha, o_sha) && !b_sha) ||
- (!a_sha && sha_eq(b_sha, o_sha))) {
+ (!b_sha && sha_eq(a_sha, o_sha) ||
+ normalized_eq(a_sha, o_sha, path)) ||
+ (!a_sha && sha_eq(b_sha, o_sha) ||
+ normalized_eq(b_sha, o_sha, path))) {
/* Deleted in both or deleted in one and
* unchanged in the other */
if (a_sha)
diff --git a/t/t6038-merge-text-auto.sh b/t/t6038-merge-text-auto.sh
index 44e6003..5e45256 100755
--- a/t/t6038-merge-text-auto.sh
+++ b/t/t6038-merge-text-auto.sh
@@ -45,7 +45,7 @@ test_expect_success 'Check merging addition of text=auto' '
test_cmp file file.temp
'
-test_expect_failure 'Test delete/normalize conflict' '
+test_expect_success 'Test delete/normalize conflict' '
git checkout side &&
git reset --hard initial &&
git rm file &&
--
1.7.1.575.g383de
next prev parent reply other threads:[~2010-06-27 19:43 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-27 19:43 [PATCH v4 0/3] CRLF merge conflict reduction, take 4 Eyvind Bernhardsen
2010-06-27 19:43 ` [PATCH v4 1/3] Avoid conflicts when merging branches with mixed normalization Eyvind Bernhardsen
2010-06-28 8:02 ` Finn Arne Gangstad
2010-06-28 19:32 ` [PATCH] Clarify text filter merge conflict reduction docs Eyvind Bernhardsen
2010-06-28 20:31 ` Finn Arne Gangstad
2010-06-29 16:19 ` Junio C Hamano
2010-06-29 21:18 ` Eyvind Bernhardsen
2010-06-30 17:46 ` Junio C Hamano
2010-06-30 21:32 ` Eyvind Bernhardsen
2010-07-01 3:33 ` Junio C Hamano
2010-06-30 8:20 ` Eyvind Bernhardsen
2010-06-30 15:15 ` Junio C Hamano
2010-06-27 19:43 ` Eyvind Bernhardsen [this message]
2010-06-27 19:43 ` [PATCH v4 3/3] Don't expand CRLFs when normalizing text during merge Eyvind Bernhardsen
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=0497dd2d68e65e9d2ec1d40f82231557ff95c04c.1277667177.git.eyvind.bernhardsen@gmail.com \
--to=eyvind.bernhardsen@gmail.com \
--cc=finnag@pvv.org \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=j.sixt@viscovery.net \
/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).