All of lore.kernel.org
 help / color / mirror / Atom feed
From: Phillip Wood <phillip.wood123@gmail.com>
To: Denton Liu <liu.denton@gmail.com>,
	Git Mailing List <git@vger.kernel.org>
Cc: "Eric Sunshine" <sunshine@sunshineco.com>,
	"Ramsay Jones" <ramsay@ramsayjones.plus.com>,
	"Junio C Hamano" <gitster@pobox.com>,
	"SZEDER Gábor" <szeder.dev@gmail.com>,
	"Phillip Wood" <phillip.wood@dunelm.org.uk>
Subject: [PATCH v10 10/10] cherry-pick/revert: add scissors line on merge conflict
Date: Wed, 17 Apr 2019 11:23:30 +0100	[thread overview]
Message-ID: <20190417102330.24434-11-phillip.wood123@gmail.com> (raw)
In-Reply-To: <20190417102330.24434-1-phillip.wood123@gmail.com>

From: Denton Liu <liu.denton@gmail.com>

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

Helped-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Signed-off-by: Denton Liu <liu.denton@gmail.com>
---
 Documentation/git-cherry-pick.txt |  7 +++
 Documentation/git-revert.txt      |  7 +++
 builtin/merge.c                   | 10 +---
 builtin/revert.c                  |  7 +++
 sequencer.c                       | 16 ++++--
 sequencer.h                       |  3 +-
 t/t3507-cherry-pick-conflict.sh   | 86 +++++++++++++++++++++++++++++++
 7 files changed, 122 insertions(+), 14 deletions(-)

diff --git a/Documentation/git-cherry-pick.txt b/Documentation/git-cherry-pick.txt
index b8cfeec67e..cbb663a843 100644
--- a/Documentation/git-cherry-pick.txt
+++ b/Documentation/git-cherry-pick.txt
@@ -57,6 +57,13 @@ OPTIONS
 	With this option, 'git cherry-pick' will let you edit the commit
 	message prior to committing.
 
+--cleanup=<mode>::
+	This option determines how the commit message will be cleaned up before
+	being passed on to the commit machinery. See linkgit:git-commit[1] for more
+	details. In particular, if the '<mode>' is given a value of `scissors`,
+	scissors will be appended to `MERGE_MSG` before being passed on in the case
+	of a conflict.
+
 -x::
 	When recording the commit, append a line that says
 	"(cherry picked from commit ...)" to the original commit
diff --git a/Documentation/git-revert.txt b/Documentation/git-revert.txt
index 837707a8fd..7fd254df92 100644
--- a/Documentation/git-revert.txt
+++ b/Documentation/git-revert.txt
@@ -66,6 +66,13 @@ more details.
 	With this option, 'git revert' will not start the commit
 	message editor.
 
+--cleanup=<mode>::
+	This option determines how the commit message will be cleaned up before
+	being passed on to the commit machinery. See linkgit:git-commit[1] for more
+	details. In particular, if the '<mode>' is given a value of `scissors`,
+	scissors will be appended to `MERGE_MSG` before being passed on in the case
+	of a conflict.
+
 -n::
 --no-commit::
 	Usually the command automatically creates some commits with
diff --git a/builtin/merge.c b/builtin/merge.c
index 03b9f7230a..e96f72af80 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -927,14 +927,8 @@ static int suggest_conflicts(void)
 	 * Thus, we will get the cleanup mode which is returned when we _are_
 	 * using an editor.
 	 */
-	if (get_cleanup_mode(cleanup_arg, 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);
+	append_conflicts_hint(&the_index, &msgbuf,
+			      get_cleanup_mode(cleanup_arg, 1));
 	fputs(msgbuf.buf, fp);
 	strbuf_release(&msgbuf);
 	fclose(fp);
diff --git a/builtin/revert.c b/builtin/revert.c
index a47b53ceaf..d4dcedbdc6 100644
--- a/builtin/revert.c
+++ b/builtin/revert.c
@@ -96,11 +96,13 @@ static int run_sequencer(int argc, const char **argv, struct replay_opts *opts)
 {
 	const char * const * usage_str = revert_or_cherry_pick_usage(opts);
 	const char *me = action_name(opts);
+	const char *cleanup_arg = NULL;
 	int cmd = 0;
 	struct option base_options[] = {
 		OPT_CMDMODE(0, "quit", &cmd, N_("end revert or cherry-pick sequence"), 'q'),
 		OPT_CMDMODE(0, "continue", &cmd, N_("resume revert or cherry-pick sequence"), 'c'),
 		OPT_CMDMODE(0, "abort", &cmd, N_("cancel revert or cherry-pick sequence"), 'a'),
+		OPT_CLEANUP(&cleanup_arg),
 		OPT_BOOL('n', "no-commit", &opts->no_commit, N_("don't automatically commit")),
 		OPT_BOOL('e', "edit", &opts->edit, N_("edit the commit message")),
 		OPT_NOOP_NOARG('r', NULL),
@@ -137,6 +139,11 @@ static int run_sequencer(int argc, const char **argv, struct replay_opts *opts)
 	if (opts->keep_redundant_commits)
 		opts->allow_empty = 1;
 
+	if (cleanup_arg) {
+		opts->default_msg_cleanup = get_cleanup_mode(cleanup_arg, 1);
+		opts->explicit_cleanup = 1;
+	}
+
 	/* Check for incompatible command line arguments */
 	if (cmd) {
 		char *this_operation;
diff --git a/sequencer.c b/sequencer.c
index 3f4b0896e3..cff07c1907 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -182,7 +182,7 @@ static int git_sequencer_config(const char *k, const char *v, void *cb)
 			opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_ALL;
 			opts->explicit_cleanup = 1;
 		} else if (!strcmp(s, "scissors")) {
-			opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SPACE;
+			opts->default_msg_cleanup = COMMIT_MSG_CLEANUP_SCISSORS;
 			opts->explicit_cleanup = 1;
 		} else {
 			warning(_("invalid commit message cleanup mode '%s'"),
@@ -554,10 +554,16 @@ static const char *describe_cleanup_mode(int cleanup_mode)
 }
 
 void append_conflicts_hint(struct index_state *istate,
-			   struct strbuf *msgbuf)
+	struct strbuf *msgbuf, enum commit_msg_cleanup_mode cleanup_mode)
 {
 	int i;
 
+	if (cleanup_mode == COMMIT_MSG_CLEANUP_SCISSORS) {
+		strbuf_addch(msgbuf, '\n');
+		wt_status_append_cut_line(msgbuf);
+		strbuf_addch(msgbuf, comment_line_char);
+	}
+
 	strbuf_addch(msgbuf, '\n');
 	strbuf_commented_addf(msgbuf, "Conflicts:\n");
 	for (i = 0; i < istate->cache_nr;) {
@@ -625,7 +631,8 @@ static int do_recursive_merge(struct repository *r,
 			_(action_name(opts)));
 
 	if (!clean)
-		append_conflicts_hint(r->index, msgbuf);
+		append_conflicts_hint(r->index, msgbuf,
+				      opts->default_msg_cleanup);
 
 	return !clean;
 }
@@ -944,7 +951,6 @@ static int run_git_commit(struct repository *r,
 			  unsigned int flags)
 {
 	struct child_process cmd = CHILD_PROCESS_INIT;
-	const char *value;
 
 	if ((flags & CREATE_ROOT_COMMIT) && !(flags & AMEND_MSG)) {
 		struct strbuf msg = STRBUF_INIT, script = STRBUF_INIT;
@@ -1014,7 +1020,7 @@ static int run_git_commit(struct repository *r,
 		argv_array_push(&cmd.args, "-e");
 	else if (!(flags & CLEANUP_MSG) &&
 		 !opts->signoff && !opts->record_origin &&
-		 git_config_get_value("commit.cleanup", &value))
+		 !opts->explicit_cleanup)
 		argv_array_push(&cmd.args, "--cleanup=verbatim");
 
 	if ((flags & ALLOW_EMPTY))
diff --git a/sequencer.h b/sequencer.h
index 8295c8406f..7023da9b13 100644
--- a/sequencer.h
+++ b/sequencer.h
@@ -116,7 +116,8 @@ int rearrange_squash(struct repository *r);
  */
 void append_signoff(struct strbuf *msgbuf, size_t ignore_footer, unsigned flag);
 
-void append_conflicts_hint(struct index_state *istate, struct strbuf *msgbuf);
+void append_conflicts_hint(struct index_state *istate,
+		struct strbuf *msgbuf, enum commit_msg_cleanup_mode cleanup_mode);
 enum commit_msg_cleanup_mode get_cleanup_mode(const char *cleanup_arg,
 	int use_editor);
 
diff --git a/t/t3507-cherry-pick-conflict.sh b/t/t3507-cherry-pick-conflict.sh
index 777fb23d18..a584b11c98 100755
--- a/t/t3507-cherry-pick-conflict.sh
+++ b/t/t3507-cherry-pick-conflict.sh
@@ -189,6 +189,46 @@ test_expect_success 'failed cherry-pick registers participants in index' '
 	test_cmp expected actual
 '
 
+test_expect_success \
+	'cherry-pick conflict, ensure commit.cleanup = scissors places scissors line properly' '
+	pristine_detach initial &&
+	git config commit.cleanup scissors &&
+	cat <<-EOF >expected &&
+		picked
+
+		# ------------------------ >8 ------------------------
+		# Do not modify or remove the line above.
+		# Everything below it will be ignored.
+		#
+		# Conflicts:
+		#	foo
+		EOF
+
+	test_must_fail git cherry-pick picked &&
+
+	test_i18ncmp expected .git/MERGE_MSG
+'
+
+test_expect_success \
+	'cherry-pick conflict, ensure cleanup=scissors places scissors line properly' '
+	pristine_detach initial &&
+	git config --unset commit.cleanup &&
+	cat <<-EOF >expected &&
+		picked
+
+		# ------------------------ >8 ------------------------
+		# Do not modify or remove the line above.
+		# Everything below it will be ignored.
+		#
+		# Conflicts:
+		#	foo
+		EOF
+
+	test_must_fail git cherry-pick --cleanup=scissors picked &&
+
+	test_i18ncmp expected .git/MERGE_MSG
+'
+
 test_expect_success 'failed cherry-pick describes conflict in work tree' '
 	pristine_detach initial &&
 	cat <<-EOF >expected &&
@@ -335,6 +375,52 @@ test_expect_success 'revert conflict, diff3 -m style' '
 	test_cmp expected actual
 '
 
+test_expect_success \
+	'revert conflict, ensure commit.cleanup = scissors places scissors line properly' '
+	pristine_detach initial &&
+	git config commit.cleanup scissors &&
+	cat >expected <<-EOF &&
+		Revert "picked"
+
+		This reverts commit OBJID.
+
+		# ------------------------ >8 ------------------------
+		# Do not modify or remove the line above.
+		# Everything below it will be ignored.
+		#
+		# Conflicts:
+		#	foo
+		EOF
+
+	test_must_fail git revert picked &&
+
+	sed "s/$OID_REGEX/OBJID/" .git/MERGE_MSG >actual &&
+	test_i18ncmp expected actual
+'
+
+test_expect_success \
+	'revert conflict, ensure cleanup=scissors places scissors line properly' '
+	pristine_detach initial &&
+	git config --unset commit.cleanup &&
+	cat >expected <<-EOF &&
+		Revert "picked"
+
+		This reverts commit OBJID.
+
+		# ------------------------ >8 ------------------------
+		# Do not modify or remove the line above.
+		# Everything below it will be ignored.
+		#
+		# Conflicts:
+		#	foo
+		EOF
+
+	test_must_fail git revert --cleanup=scissors picked &&
+
+	sed "s/$OID_REGEX/OBJID/" .git/MERGE_MSG >actual &&
+	test_i18ncmp expected actual
+'
+
 test_expect_success 'failed cherry-pick does not forget -s' '
 	pristine_detach initial &&
 	test_must_fail git cherry-pick -s picked &&
-- 
2.21.0


  parent reply	other threads:[~2019-04-17 10:25 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               ` [PATCH v8 09/11] merge: add scissors line on merge conflict Denton Liu
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                   ` Phillip Wood [this message]
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

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190417102330.24434-11-phillip.wood123@gmail.com \
    --to=phillip.wood123@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=liu.denton@gmail.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.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.