git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Denton Liu <liu.denton@gmail.com>
To: Git Mailing List <git@vger.kernel.org>
Cc: "Denton Liu" <liu.denton@gmail.com>,
	"Eric Sunshine" <sunshine@sunshineco.com>,
	"Junio C Hamano" <gitster@pobox.com>,
	"Phillip Wood" <phillip.wood@dunelm.org.uk>,
	"Ramsay Jones" <ramsay@ramsayjones.plus.com>,
	"SZEDER Gábor" <szeder.dev@gmail.com>
Subject: [PATCH v8 09/11] merge: add scissors line on merge conflict
Date: Sun, 17 Mar 2019 03:16:16 -0700	[thread overview]
Message-ID: <41e399af28495e0fdec87992526daf23bafef272.1552817044.git.liu.denton@gmail.com> (raw)
In-Reply-To: <cover.1552817044.git.liu.denton@gmail.com>

This fixes a bug where the scissors line is placed after the Conflicts:
section, in the case where a merge conflict occurs and
commit.cleanup = scissors.

Next, if commit.cleanup = scissors is specified, don't produce a
scissors line in commit if one already exists in the MERGE_MSG file.

Reviewed-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Denton Liu <liu.denton@gmail.com>
---
 Documentation/merge-options.txt |  4 ++-
 builtin/commit.c                | 20 ++++++++++----
 builtin/merge.c                 | 14 ++++++++++
 t/t7600-merge.sh                | 48 +++++++++++++++++++++++++++++++++
 4 files changed, 80 insertions(+), 6 deletions(-)

diff --git a/Documentation/merge-options.txt b/Documentation/merge-options.txt
index 646100ea9a..405e16c617 100644
--- a/Documentation/merge-options.txt
+++ b/Documentation/merge-options.txt
@@ -35,7 +35,9 @@ set to `no` at the beginning of them.
 --cleanup=<mode>::
 	This option determines how the merge message will be cleaned up
 	before commiting or being passed on. See linkgit:git-commit[1] for more
-	details.
+	details. In addition, if the '<mode>' is given a value of `scissors`,
+	scissors will be appended to `MERGE_MSG` before being passed on to the
+	commit machinery in the case of a merge conflict.
 
 --ff::
 	When the merge resolves as a fast-forward, only update the branch
diff --git a/builtin/commit.c b/builtin/commit.c
index ba1e6027ba..b9159c2e7b 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -668,6 +668,7 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
 	const char *hook_arg2 = NULL;
 	int clean_message_contents = (cleanup_mode != COMMIT_MSG_CLEANUP_NONE);
 	int old_display_comment_prefix;
+	int merge_contains_scissors = 0;
 
 	/* This checks and barfs if author is badly specified */
 	determine_author_info(author_ident);
@@ -728,6 +729,8 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
 			strbuf_addbuf(&sb, &message);
 		hook_arg1 = "message";
 	} else if (!stat(git_path_merge_msg(the_repository), &statbuf)) {
+		size_t merge_msg_start;
+
 		/*
 		 * prepend SQUASH_MSG here if it exists and a
 		 * "merge --squash" was originally performed
@@ -738,8 +741,14 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
 			hook_arg1 = "squash";
 		} else
 			hook_arg1 = "merge";
+
+		merge_msg_start = sb.len;
 		if (strbuf_read_file(&sb, git_path_merge_msg(the_repository), 0) < 0)
 			die_errno(_("could not read MERGE_MSG"));
+
+		if (cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS &&
+		    wt_status_locate_end(sb.buf + merge_msg_start, sb.len - merge_msg_start) < sb.len - merge_msg_start)
+			merge_contains_scissors = 1;
 	} else if (!stat(git_path_squash_msg(the_repository), &statbuf)) {
 		if (strbuf_read_file(&sb, git_path_squash_msg(the_repository), 0) < 0)
 			die_errno(_("could not read SQUASH_MSG"));
@@ -807,7 +816,8 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
 		struct ident_split ci, ai;
 
 		if (whence != FROM_COMMIT) {
-			if (cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS)
+			if (cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS &&
+				!merge_contains_scissors)
 				wt_status_add_cut_line(s->fp);
 			status_printf_ln(s, GIT_COLOR_NORMAL,
 			    whence == FROM_MERGE
@@ -832,10 +842,10 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
 				_("Please enter the commit message for your changes."
 				  " Lines starting\nwith '%c' will be ignored, and an empty"
 				  " message aborts the commit.\n"), comment_line_char);
-		else if (cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS &&
-			 whence == FROM_COMMIT)
-			wt_status_add_cut_line(s->fp);
-		else /* COMMIT_MSG_CLEANUP_SPACE, that is. */
+		else if (cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS) {
+			if (whence == FROM_COMMIT && !merge_contains_scissors)
+				wt_status_add_cut_line(s->fp);
+		} else /* COMMIT_MSG_CLEANUP_SPACE, that is. */
 			status_printf(s, GIT_COLOR_NORMAL,
 				_("Please enter the commit message for your changes."
 				  " Lines starting\n"
diff --git a/builtin/merge.c b/builtin/merge.c
index 7be03a2610..86c54bff76 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -916,6 +916,20 @@ static int suggest_conflicts(void)
 	filename = git_path_merge_msg(the_repository);
 	fp = xfopen(filename, "a");
 
+	/*
+	 * We can't use cleanup_mode because if we're not using the editor,
+	 * get_cleanup_mode will return COMMIT_MSG_CLEANUP_SPACE instead, even
+	 * though the message is meant to be processed later by git-commit.
+	 * Thus, we will get the cleanup mode which is returned when we _are_ using
+	 * an editor.
+	 */
+	if (get_cleanup_mode(cleanup_arg, 1, 1) == COMMIT_MSG_CLEANUP_SCISSORS) {
+	    fputc('\n', fp);
+	    wt_status_add_cut_line(fp);
+	    /* comments out the newline from append_conflicts_hint */
+	    fputc(comment_line_char, fp);
+	}
+
 	append_conflicts_hint(&the_index, &msgbuf);
 	fputs(msgbuf.buf, fp);
 	strbuf_release(&msgbuf);
diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh
index a9620cd991..ed11b08db2 100755
--- a/t/t7600-merge.sh
+++ b/t/t7600-merge.sh
@@ -247,6 +247,54 @@ test_expect_success 'merge --squash c3 with c7' '
 	test_cmp expect actual
 '
 
+test_expect_success 'merge c3 with c7 with commit.cleanup = scissors' '
+	git config commit.cleanup scissors &&
+	git reset --hard c3 &&
+	test_must_fail git merge c7 &&
+	cat result.9z >file &&
+	git commit --no-edit -a &&
+
+	cat >expect <<-\EOF &&
+	Merge tag '"'"'c7'"'"'
+
+	# ------------------------ >8 ------------------------
+	# Do not modify or remove the line above.
+	# Everything below it will be ignored.
+	#
+	# Conflicts:
+	#	file
+	EOF
+	git cat-file commit HEAD >actual &&
+	sed -e '1,/^$/d' <actual >tmp &&
+	mv tmp actual &&
+	test_i18ncmp expect actual
+'
+
+test_expect_success 'merge c3 with c7 with --squash commit.cleanup = scissors' '
+	git config commit.cleanup scissors &&
+	git reset --hard c3 &&
+	test_must_fail git merge --squash c7 &&
+	cat result.9z >file &&
+	git commit --no-edit -a &&
+
+	cat >expect <<-EOF &&
+	Squashed commit of the following:
+
+	$(git show -s c7)
+
+	# ------------------------ >8 ------------------------
+	# Do not modify or remove the line above.
+	# Everything below it will be ignored.
+	#
+	# Conflicts:
+	#	file
+	EOF
+	git cat-file commit HEAD >actual &&
+	sed -e '1,/^$/d' <actual >tmp &&
+	mv tmp actual &&
+	test_i18ncmp expect actual
+'
+
 test_debug 'git log --graph --decorate --oneline --all'
 
 test_expect_success 'merge c1 with c2 and c3' '
-- 
2.21.0.512.g57bf1b23e1


  parent reply	other threads:[~2019-03-17 10:16 UTC|newest]

Thread overview: 105+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-11-14  5:24 [RFC PATCH 0/2] Fix scissors bug during merge conflict Denton Liu
2018-11-14  5:24 ` [RFC PATCH 1/2] commit: don't add scissors line if one exists Denton Liu
2018-11-14  8:06   ` Junio C Hamano
2018-11-14 18:06     ` Denton Liu
2018-11-16  3:32       ` Junio C Hamano
2018-11-14  5:25 ` [RFC PATCH 2/2] merge: add scissors line on merge conflict Denton Liu
2018-11-14  7:52 ` [RFC PATCH 0/2] Fix scissors bug during " Junio C Hamano
2018-11-14  8:10   ` Denton Liu
2018-11-16 15:19 ` [PATCH v2 " Denton Liu
2018-11-16 15:20   ` [PATCH v2 2/2] merge: add scissors line on " Denton Liu
2018-11-17 23:32   ` [PATCH v3 0/1] Fix scissors bug during " Denton Liu
2018-11-17 23:32     ` [PATCH v3 1/1] merge: add scissors line on " Denton Liu
2018-11-18 14:18       ` SZEDER Gábor
2018-11-18  6:54     ` [PATCH v3 0/1] Fix scissors bug during " Junio C Hamano
2018-11-21  3:13     ` [PATCH v4 0/2] " Denton Liu
2018-11-21  3:13       ` [PATCH v4 1/2] t7600: clean up 'merge --squash c3 with c7' test Denton Liu
2018-11-21  3:13       ` [PATCH v4 2/2] merge: add scissors line on merge conflict Denton Liu
2018-11-21  9:38       ` [PATCH v4 0/2] Fix scissors bug during " Junio C Hamano
2018-11-22  1:10         ` Denton Liu
2018-11-24  2:05           ` Junio C Hamano
2018-12-25 13:55       ` [PATCH v5 0/4] Add git-merge --cleanup support Denton Liu
2018-12-25 13:55         ` [PATCH v5 1/4] commit: extract cleanup_mode functions to sequencer Denton Liu
2018-12-25 13:56         ` [PATCH v5 2/4] t7600: clean up 'merge --squash c3 with c7' test Denton Liu
2018-12-25 13:56         ` [PATCH v5 3/4] merge: cleanup messages like commit Denton Liu
2018-12-25 13:56         ` [PATCH v5 4/4] merge: add scissors line on merge conflict Denton Liu
2019-01-23  5:06         ` [PATCH v6 0/4] Add git-merge --cleanup support Denton Liu
2019-01-23  5:06           ` [PATCH v6 1/4] commit: extract cleanup_mode functions to sequencer Denton Liu
2019-01-23  5:06           ` [PATCH v6 2/4] t7600: clean up 'merge --squash c3 with c7' test Denton Liu
2019-01-23  5:06           ` [PATCH v6 3/4] merge: cleanup messages like commit Denton Liu
2019-01-23  5:06           ` [PATCH v6 4/4] merge: add scissors line on merge conflict Denton Liu
2019-03-11  3:42           ` [PATCH v7 0/8] Fix scissors bug during conflict Denton Liu
2019-03-11  3:42             ` [PATCH v7 1/8] t7600: clean up 'merge --squash c3 with c7' test Denton Liu
2019-03-12  1:03               ` Junio C Hamano
2019-03-11  3:42             ` [PATCH v7 2/8] t3507: cleanup space after redirection operators Denton Liu
2019-03-11  3:42             ` [PATCH v7 3/8] commit: extract cleanup_mode functions to sequencer Denton Liu
2019-03-11  3:42             ` [PATCH v7 4/8] sequencer.c: remove duplicate code Denton Liu
2019-03-11 16:45               ` Phillip Wood
2019-03-11  3:42             ` [PATCH v7 5/8] merge: cleanup messages like commit Denton Liu
2019-03-11  5:49               ` Eric Sunshine
2019-03-11 10:14                 ` Phillip Wood
2019-03-11 17:00                   ` Eric Sunshine
2019-03-11 16:58               ` Phillip Wood
2019-03-12  5:50                 ` Junio C Hamano
2019-03-11  3:42             ` [PATCH v7 6/8] merge: add scissors line on merge conflict Denton Liu
2019-03-11  5:55               ` Eric Sunshine
2019-03-11  3:42             ` [PATCH v7 7/8] sequencer.c: define get_config_from_cleanup Denton Liu
2019-03-11  6:19               ` Eric Sunshine
2019-03-12  6:29               ` Junio C Hamano
2019-03-11  3:42             ` [PATCH v7 8/8] cherry-pick/revert: add scissors line on merge conflict Denton Liu
2019-03-12 11:11               ` Phillip Wood
2019-03-11  6:44             ` [PATCH v7 0/8] Fix scissors bug during conflict Junio C Hamano
2019-03-17 10:15             ` [PATCH v8 00/11] " Denton Liu
2019-03-17 10:15               ` [PATCH v8 01/11] t7600: clean up style Denton Liu
2019-03-17 10:15               ` [PATCH v8 02/11] t3507: cleanup space after redirection operators Denton Liu
2019-03-17 10:15               ` [PATCH v8 03/11] t7604: refactor out Git commands upstream of pipe Denton Liu
2019-03-17 10:16               ` [PATCH v8 04/11] t7502: clean up test style Denton Liu
2019-03-17 10:16               ` [PATCH v8 05/11] commit: extract cleanup_mode functions to sequencer Denton Liu
2019-03-17 10:16               ` [PATCH v8 06/11] parse-options.h: extract common --cleanup option Denton Liu
2019-03-17 10:16               ` [PATCH v8 07/11] sequencer.c: remove duplicate code Denton Liu
2019-03-17 10:16               ` [PATCH v8 08/11] merge: cleanup messages like commit Denton Liu
2019-03-19 11:13                 ` Phillip Wood
2019-03-20  6:32                   ` Denton Liu
2019-03-17 10:16               ` Denton Liu [this message]
2019-03-17 10:16               ` [PATCH v8 10/11] sequencer.c: define describe_cleanup_mode Denton Liu
2019-03-18 20:04                 ` Eric Sunshine
2019-03-18 20:30                   ` Denton Liu
2019-03-18 20:32                     ` Eric Sunshine
2019-03-19  0:55                   ` Ramsay Jones
2019-03-17 10:16               ` [PATCH v8 11/11] cherry-pick/revert: add scissors line on merge conflict Denton Liu
2019-03-17 13:05               ` [PATCH v8 00/11] Fix scissors bug during conflict SZEDER Gábor
2019-03-18  3:02                 ` Denton Liu
2019-03-18  6:35                 ` Junio C Hamano
2019-03-18  8:03                   ` Denton Liu
2019-03-18  8:25                     ` Junio C Hamano
2019-03-21  6:53               ` [PATCH v9 " Denton Liu
2019-03-21  6:53                 ` [PATCH v9 01/11] t7600: clean up style Denton Liu
2019-03-21  6:53                 ` [PATCH v9 02/11] t3507: " Denton Liu
2019-03-21  6:53                 ` [PATCH v9 03/11] t7604: " Denton Liu
2019-03-21  6:53                 ` [PATCH v9 04/11] t7502: " Denton Liu
2019-03-21  6:53                 ` [PATCH v9 05/11] commit: extract cleanup_mode functions to sequencer Denton Liu
2019-03-21  6:53                 ` [PATCH v9 06/11] parse-options.h: extract common --cleanup option Denton Liu
2019-03-21  6:53                 ` [PATCH v9 07/11] sequencer.c: remove duplicate code Denton Liu
2019-03-26 10:44                   ` Phillip Wood
2019-03-21  6:53                 ` [PATCH v9 08/11] merge: cleanup messages like commit Denton Liu
2019-03-21  6:53                 ` [PATCH v9 09/11] merge: add scissors line on merge conflict Denton Liu
2019-03-21  6:54                 ` [PATCH v9 10/11] sequencer.c: define describe_cleanup_mode Denton Liu
2019-03-21  6:54                 ` [PATCH v9 11/11] cherry-pick/revert: add scissors line on merge conflict Denton Liu
2019-04-17 10:23                 ` [PATCH v10 00/10] Fix scissors bug during conflict Phillip Wood
2019-04-17 10:23                   ` [PATCH v10 01/10] t7600: clean up style Phillip Wood
2019-04-17 10:23                   ` [PATCH v10 02/10] t3507: " Phillip Wood
2019-04-17 10:23                   ` [PATCH v10 03/10] t7604: " Phillip Wood
2019-04-17 10:23                   ` [PATCH v10 04/10] t7502: " Phillip Wood
2019-04-17 10:23                   ` [PATCH v10 05/10] commit: extract cleanup_mode functions to sequencer Phillip Wood
2019-04-17 10:23                   ` [PATCH v10 06/10] parse-options.h: extract common --cleanup option Phillip Wood
2019-04-17 10:23                   ` [PATCH v10 07/10] merge: cleanup messages like commit Phillip Wood
2019-04-17 10:23                   ` [PATCH v10 08/10] merge: add scissors line on merge conflict Phillip Wood
2019-04-17 10:23                   ` [PATCH v10 09/10] sequencer.c: save and restore cleanup mode Phillip Wood
2019-04-17 17:02                     ` Denton Liu
2019-04-17 19:53                       ` Phillip Wood
2019-04-18 17:21                       ` Denton Liu
2019-04-17 10:23                   ` [PATCH v10 10/10] cherry-pick/revert: add scissors line on merge conflict Phillip Wood
2019-04-18  5:19                   ` [PATCH v10 00/10] Fix scissors bug during conflict Junio C Hamano
2019-04-18  9:14                     ` Phillip Wood
     [not found] ` <cover.1542380865.git.liu.denton@gmail.com>
2018-11-16 15:19   ` [PATCH v2 1/2] commit: don't add scissors line if one exists in MERGE_MSG Denton Liu
2018-11-17  8:06     ` Junio C Hamano

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=41e399af28495e0fdec87992526daf23bafef272.1552817044.git.liu.denton@gmail.com \
    --to=liu.denton@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=phillip.wood@dunelm.org.uk \
    --cc=ramsay@ramsayjones.plus.com \
    --cc=sunshine@sunshineco.com \
    --cc=szeder.dev@gmail.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).