From: Clemens Buchacher <drizzd@aon.at>
To: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Cc: git@vger.kernel.org, gitster@pobox.com
Subject: [PATCH] merge-recursive: handle file mode changes
Date: Thu, 13 Mar 2008 23:47:41 +0100 [thread overview]
Message-ID: <20080313224741.GA5000@localhost> (raw)
In-Reply-To: <alpine.LSU.1.00.0803132216580.4174@racer.site>
Handle file mode changes similarly to changes of content. If the file mode
changed in only one branch, keep the changed version. If the file mode
changed in both branches, prompt the user to choose one by reporting a
conflict.
This also fixes a bug which caused the merge to fail if the merged files were
empty.
Signed-off-by: Clemens Buchacher <drizzd@aon.at>
---
Hi,
On Thu, Mar 13, 2008 at 10:17:07PM +0100, Johannes Schindelin wrote:
> If the modes are different, the merge is not clean.
If the mode has only changed in either the head or the remote tree, I believe
we should keep the changed version without conflict - just like we do for
non-overlapping changes of content.
If, however, both files changed in a different way, we report a conflict and
keep the remote version by default. I based this decision on the assumption
that the user is more likely to have acknowledged the head branch, while he may
want to think about whether or not the change in the remote version is ok.
I cleaned up the code a bit and added a comment, so I hope the behavior is
clearer now.
> The point is not that they are empty. Maybe you want to fix that message.
Indeed.
I am not exactly sure how I should set the result.merge flag. In this context
it seems to have the exact opposite meaning of result.clean. Is that correct?
Regards,
Clemens
merge-recursive.c | 21 ++++++++++++++++-----
t/t6031-merge-recursive.sh | 39 +++++++++++++++++++++++++++++++++++++++
2 files changed, 55 insertions(+), 5 deletions(-)
create mode 100755 t/t6031-merge-recursive.sh
diff --git a/merge-recursive.c b/merge-recursive.c
index 34e3167..d8938cc 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -1025,12 +1025,21 @@ static struct merge_file_info merge_file(struct diff_filespec *o,
hashcpy(result.sha, b->sha1);
}
} else {
- if (!sha_eq(a->sha1, o->sha1) && !sha_eq(b->sha1, o->sha1))
- result.merge = 1;
-
- result.mode = a->mode == o->mode ? b->mode: a->mode;
+ /*
+ * If mode changed in only one branch, keep the changed
+ * version. Otherwise, keep remote version and create a
+ * conflict.
+ */
+ if (a->mode != o->mode && b->mode != o->mode &&
+ a->mode != b->mode) {
+ result.clean = 0;
+ result.mode = b->mode;
+ } else
+ result.mode = o->mode == a->mode ? b->mode : a->mode;
- if (sha_eq(a->sha1, o->sha1))
+ if (sha_eq(a->sha1, b->sha1))
+ hashcpy(result.sha, b->sha1);
+ else if (sha_eq(a->sha1, o->sha1))
hashcpy(result.sha, b->sha1);
else if (sha_eq(b->sha1, o->sha1))
hashcpy(result.sha, a->sha1);
@@ -1062,6 +1071,8 @@ static struct merge_file_info merge_file(struct diff_filespec *o,
} else {
die("unsupported object type in the tree");
}
+
+ result.merge = !result.clean;
}
return result;
diff --git a/t/t6031-merge-recursive.sh b/t/t6031-merge-recursive.sh
new file mode 100755
index 0000000..36cd664
--- /dev/null
+++ b/t/t6031-merge-recursive.sh
@@ -0,0 +1,39 @@
+#!/bin/sh
+
+test_description='merge-recursive: handle file mode'
+. ./test-lib.sh
+
+test_expect_success 'mode change in one branch: keep changed version' '
+ : >file1 &&
+ git add file1 &&
+ git commit -m initial &&
+ git checkout -b a1 master &&
+ : >dummy &&
+ git add dummy &&
+ git commit -m a &&
+ git checkout -b b1 master &&
+ chmod +x file1 &&
+ git add file1 &&
+ git commit -m b1 &&
+ git checkout a1 &&
+ git merge-recursive master -- a1 b1 &&
+ test -x file1
+'
+
+test_expect_success 'mode change in both branches: expect conflict' '
+ git reset --hard HEAD &&
+ git checkout -b a2 master &&
+ : >file2 &&
+ chmod +x file2 &&
+ git add file2 &&
+ git commit -m a2 &&
+ git checkout -b b2 master &&
+ : >file2 &&
+ git add file2 &&
+ git commit -m b2 &&
+ git checkout a2 &&
+ ! (git merge-recursive master -- a2 b2 || test $? -ne 1) &&
+ ! test -x file2
+'
+
+test_done
--
1.5.4.4
next prev parent reply other threads:[~2008-03-13 22:48 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-03-08 17:17 [PATCH] fix recursive-merge of empty files with different permissions Clemens Buchacher
2008-03-08 17:51 ` Johannes Schindelin
2008-03-13 12:52 ` Clemens Buchacher
2008-03-13 15:19 ` Johannes Schindelin
2008-03-13 18:50 ` Junio C Hamano
2008-03-13 21:28 ` Johannes Schindelin
2008-03-13 19:22 ` [PATCH] merge-recursive: cause a conflict if file mode does not match Clemens Buchacher
2008-03-13 21:17 ` Johannes Schindelin
2008-03-13 22:47 ` Clemens Buchacher [this message]
2008-03-13 23:40 ` [PATCH] merge-recursive: handle file mode changes Johannes Schindelin
2008-03-14 9:21 ` [PATCH] merge-recursive: handle file mode and links similarly to file content Clemens Buchacher
2008-03-14 10:13 ` Clemens Buchacher
2008-03-14 0:08 ` [PATCH] merge-recursive: handle file mode changes Junio C Hamano
2008-03-14 0:12 ` Junio C Hamano
2008-03-14 13:02 ` Clemens Buchacher
2008-03-14 0:17 ` Jakub Narebski
2008-03-14 12:56 ` Clemens Buchacher
2008-03-14 10:15 ` Junio C Hamano
2008-03-14 12:17 ` Clemens Buchacher
2008-03-14 16:01 ` Junio C Hamano
2008-03-14 17:28 ` Clemens Buchacher
2008-03-14 17:49 ` Junio C Hamano
2008-03-14 10:07 ` [PATCH] merge-recursive: cause a conflict if file mode does not match Clemens Buchacher
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=20080313224741.GA5000@localhost \
--to=drizzd@aon.at \
--cc=Johannes.Schindelin@gmx.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.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.
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).