All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
To: git@vger.kernel.org
Cc: "Nguyễn Thái Ngọc Duy" <pclouds@gmail.com>
Subject: [PATCH 2/2] commit: allow core.commentChar=auto for character auto selection
Date: Fri, 16 May 2014 20:51:23 +0700	[thread overview]
Message-ID: <1400248283-303-2-git-send-email-pclouds@gmail.com> (raw)
In-Reply-To: <1400248283-303-1-git-send-email-pclouds@gmail.com>

core.commentChar starts with '#' as in default but if it's already in
the prepared message, find another one among a small subset. This
should stop surprises because git strips some lines unexpectedly.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 Documentation/config.txt |  3 +++
 builtin/commit.c         | 36 ++++++++++++++++++++++++++++++++++++
 cache.h                  |  1 +
 config.c                 |  2 ++
 environment.c            |  1 +
 t/t7502-commit.sh        | 25 +++++++++++++++++++++++++
 6 files changed, 68 insertions(+)

diff --git a/Documentation/config.txt b/Documentation/config.txt
index 1932e9b..d5bf4d0 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -544,6 +544,9 @@ core.commentchar::
 	messages consider a line that begins with this character
 	commented, and removes them after the editor returns
 	(default '#').
++
+If set to "auto", `git-commit` would select a character that is not
+the beginning character of any line of existing commit messages.
 
 sequence.editor::
 	Text editor used by `git rebase -i` for editing the rebase instruction file.
diff --git a/builtin/commit.c b/builtin/commit.c
index 9cfef6c..039b426 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -594,6 +594,40 @@ static char *cut_ident_timestamp_part(char *string)
 	return ket;
 }
 
+static void adjust_comment_line_char(const struct strbuf *sb)
+{
+	char candidates[] = " @!#$%^&|:;~";
+	char *candidate;
+	const char *p;
+
+	if (!sb->len)
+		return;
+
+	if (!strchr(candidates, comment_line_char))
+		candidates[0] = comment_line_char;
+	p = sb->buf;
+	candidate = strchr(candidates, *p);
+	if (candidate)
+		*candidate = ' ';
+	for (p = sb->buf; *p; p++) {
+		if ((p[0] == '\n' || p[0] == '\r') && p[1]) {
+			candidate = strchr(candidates, p[1]);
+			if (candidate)
+				*candidate = ' ';
+		}
+	}
+
+	if (candidates[0] == comment_line_char)
+		return;
+	for (p = candidates; *p == ' '; p++)
+		;
+	if (!*p)
+		die(_("the comment character '%c' exists in the commit message\n"
+		      "Please choose another character for core.commentChar"),
+		    comment_line_char);
+	comment_line_char = *p;
+}
+
 static int prepare_to_commit(const char *index_file, const char *prefix,
 			     struct commit *current_head,
 			     struct wt_status *s,
@@ -748,6 +782,8 @@ static int prepare_to_commit(const char *index_file, const char *prefix,
 	if (fwrite(sb.buf, 1, sb.len, s->fp) < sb.len)
 		die_errno(_("could not write commit template"));
 
+	if (auto_comment_line_char)
+		adjust_comment_line_char(&sb);
 	strbuf_release(&sb);
 
 	/* This checks if committer ident is explicitly given */
diff --git a/cache.h b/cache.h
index 107ac61..646fb81 100644
--- a/cache.h
+++ b/cache.h
@@ -602,6 +602,7 @@ extern int precomposed_unicode;
  * that is subject to stripspace.
  */
 extern char comment_line_char;
+extern int auto_comment_line_char;
 
 enum branch_track {
 	BRANCH_TRACK_UNSPECIFIED = -1,
diff --git a/config.c b/config.c
index 05d909b..5ec3520 100644
--- a/config.c
+++ b/config.c
@@ -829,6 +829,8 @@ static int git_default_core_config(const char *var, const char *value)
 		if (!ret) {
 			if (comment[0] && !comment[1])
 				comment_line_char = comment[0];
+			else if (!strcasecmp(comment, "auto"))
+				auto_comment_line_char = 1;
 			else
 				return error("core.commentChar should only be one character");
 		}
diff --git a/environment.c b/environment.c
index 5c4815d..f2de1ee 100644
--- a/environment.c
+++ b/environment.c
@@ -69,6 +69,7 @@ unsigned long pack_size_limit_cfg;
  * that is subject to stripspace.
  */
 char comment_line_char = '#';
+int auto_comment_line_char;
 
 /* Parallel index stat data preload? */
 int core_preload_index = 0;
diff --git a/t/t7502-commit.sh b/t/t7502-commit.sh
index 9a3f3a1..5cff300 100755
--- a/t/t7502-commit.sh
+++ b/t/t7502-commit.sh
@@ -563,4 +563,29 @@ test_expect_success 'commit --status with custom comment character' '
 	test_i18ngrep "^; Changes to be committed:" .git/COMMIT_EDITMSG
 '
 
+test_expect_success 'switch core.commentchar' '
+	test_commit "#foo" foo &&
+	GIT_EDITOR=.git/FAKE_EDITOR git -c core.commentChar=auto commit --amend &&
+	test_i18ngrep "^@ Changes to be committed:" .git/COMMIT_EDITMSG
+'
+
+test_expect_success 'switch core.commentchar but out of options' '
+	cat >text <<\EOF &&
+# 1
+@ 2
+! 3
+$ 4
+% 5
+^ 6
+& 7
+| 8
+: 9
+; 10
+~ 11
+EOF
+	git commit --amend -F text &&
+	GIT_EDITOR=.git/FAKE_EDITOR test_must_fail \
+		git -c core.commentChar=auto commit --amend
+'
+
 test_done
-- 
1.9.1.346.ga2b5940

  reply	other threads:[~2014-05-16 13:51 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-16 10:18 Fwd: [Bug] - Processing commit message after amend Michal Stasa
2014-05-16 10:28 ` Duy Nguyen
2014-05-16 10:34   ` Michal Stasa
2014-05-16 10:59   ` [PATCH] commit: switch core.commentChar if it's found in existing commit Nguyễn Thái Ngọc Duy
2014-05-16 13:51     ` [PATCH 1/2] config: be strict on core.commentChar Nguyễn Thái Ngọc Duy
2014-05-16 13:51       ` Nguyễn Thái Ngọc Duy [this message]
2014-05-16 16:40         ` [PATCH 2/2] commit: allow core.commentChar=auto for character auto selection Jonathan Nieder
2014-05-16 17:38           ` Junio C Hamano
2014-05-16 23:41           ` Duy Nguyen
2014-05-16 14:42       ` [PATCH 1/2] config: be strict on core.commentChar Felipe Contreras
2014-05-16 16:25       ` Jonathan Nieder
2014-05-16 17:36         ` Junio C Hamano
2014-05-17  1:52       ` [PATCH v2 " Nguyễn Thái Ngọc Duy
2014-05-17  1:52         ` [PATCH v2 2/2] commit: allow core.commentChar=auto for character auto selection Nguyễn Thái Ngọc Duy
2014-05-16 17:27     ` [PATCH] commit: switch core.commentChar if it's found in existing commit Junio C Hamano
2014-05-16 18:53       ` Junio C Hamano
2014-05-16 10:34 ` Fwd: [Bug] - Processing commit message after amend David Kastrup

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=1400248283-303-2-git-send-email-pclouds@gmail.com \
    --to=pclouds@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 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.