Junio C Hamano <gitster@xxxxxxxxx> writes: > I also wonder, as a longer term alternative (which would require a > lot of code auditing and some refactoring), if it is useful to have > an option and/or configuration that lets you configure the "comment > in log message editor" character from the default "#" to something > else. "git -c log.commentchar=% commit" may start the log message > editor with something like this in it: > > % Please enter the commit message for your changes. Lines starting > % with '%' will be ignored, and an empty message aborts the commit. > > Naturally, setting log.commentchar to "none" would disable stripping > of any commented lines if such a feature existed, and stop issuing > these helpful comments altogether, but still strip excess blank > lines and trailing whitespaces. > > I wouldn't seriously suggest it as I am not sure if the usefulness > of such a feature would outweigh the cost of coding it, though; at > least not at this point yet. A beginning of a patch to do would be like this, which does not look too bad. There are some low hanging fruits I didn't bother to do in this illustration (see NEEDSWORK comment in builtin/branch.c if some of you are interested in pursuing it). -- >8 -- From: Junio C Hamano <gitster@xxxxxxxxx> Date: Thu, 10 Jan 2013 11:17:21 -0800 Subject: [PATCH] Allow custom "comment char" Some users do want to write a line that begin with a pound sign, #, in their commit log message. Many tracking system recognise a token of #<bugid> form, for example. The support we offer these use cases is not very friendly to the end users. They have a choice between - Don't do it. Avoid such a line by rewrapping or indenting; and - Use --cleanup=whitespace but remove all the hint lines we add. Give them a way to set a custom comment char, e.g. $ git -c core.commentchar="%" commit so that they do not have to do either of the two workarounds. Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> --- Documentation/config.txt | 6 ++++++ builtin/branch.c | 16 ++++++++++++---- builtin/commit.c | 15 ++++++++------- builtin/fmt-merge-msg.c | 4 +++- builtin/merge.c | 15 +++++++++++---- builtin/stripspace.c | 2 +- cache.h | 6 ++++++ config.c | 8 ++++++++ environment.c | 6 ++++++ wt-status.c | 10 ++++++---- 10 files changed, 67 insertions(+), 21 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index d5809e0..e99b9f2 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -528,6 +528,12 @@ core.editor:: variable when it is set, and the environment variable `GIT_EDITOR` is not set. See linkgit:git-var[1]. +core.commentchar:: + Commands such as `commit` and `tag` that lets you edit + messages consider a line that begins with this character + commented, and removes them after the editor returns + (default '#'). + sequence.editor:: Text editor used by `git rebase -i` for editing the rebase insn file. The value is meant to be interpreted by the shell when it is used. diff --git a/builtin/branch.c b/builtin/branch.c index 873f624..7f8865a 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -706,11 +706,19 @@ static int edit_branch_description(const char *branch_name) read_branch_desc(&buf, branch_name); if (!buf.len || buf.buf[buf.len-1] != '\n') strbuf_addch(&buf, '\n'); + /* + * NEEDSWORK: introduce a strbuf_commented_addf(), possibly + * sharing code with status_vprintf(), that makes each line + * commented with comment_line_char, and use it here and from + * other places (e.g. write_commented_object() and create_note() + * in builtin/notes.c and create_tag() in builtin/tag.c). + */ strbuf_addf(&buf, - "# Please edit the description for the branch\n" - "# %s\n" - "# Lines starting with '#' will be stripped.\n", - branch_name); + "%c Please edit the description for the branch\n" + "%c %s\n" + "%c Lines starting with '%c' will be stripped.\n", + comment_line_char, comment_line_char, + branch_name, comment_line_char, comment_line_char); fp = fopen(git_path(edit_description), "w"); if ((fwrite(buf.buf, 1, buf.len, fp) < buf.len) || fclose(fp)) { strbuf_release(&buf); diff --git a/builtin/commit.c b/builtin/commit.c index d6dd3df..a946a13 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -733,15 +733,16 @@ static int prepare_to_commit(const char *index_file, const char *prefix, if (cleanup_mode == CLEANUP_ALL) status_printf(s, GIT_COLOR_NORMAL, _("Please enter the commit message for your changes." - " Lines starting\nwith '#' will be ignored, and an empty" - " message aborts the commit.\n")); + " Lines starting\nwith '%c' will be ignored, and an empty" + " message aborts the commit.\n"), comment_line_char); else /* CLEANUP_SPACE, that is. */ status_printf(s, GIT_COLOR_NORMAL, - _("Please enter the commit message for your changes." - " Lines starting\n" - "with '#' will be kept; you may remove them" - " yourself if you want to.\n" - "An empty message aborts the commit.\n")); + _("Please enter the commit message for your changes." + " Lines starting\n" + "with '%c' will be kept; you may remove them" + " yourself if you want to.\n" + "An empty message aborts the commit.\n"), + comment_line_char); if (only_include_assumed) status_printf_ln(s, GIT_COLOR_NORMAL, "%s", only_include_assumed); diff --git a/builtin/fmt-merge-msg.c b/builtin/fmt-merge-msg.c index e2e27b2..2261e1f 100644 --- a/builtin/fmt-merge-msg.c +++ b/builtin/fmt-merge-msg.c @@ -463,8 +463,10 @@ static void fmt_tag_signature(struct strbuf *tagbuf, } strbuf_complete_line(tagbuf); if (sig->len) { + char comment_head[3]; + sprintf(comment_head, "%c ", comment_line_char); strbuf_addch(tagbuf, '\n'); - strbuf_add_lines(tagbuf, "# ", sig->buf, sig->len); + strbuf_add_lines(tagbuf, comment_head, sig->buf, sig->len); } } diff --git a/builtin/merge.c b/builtin/merge.c index 3a31c4b..632d860 100644 --- a/builtin/merge.c +++ b/builtin/merge.c @@ -788,17 +788,24 @@ static const char merge_editor_comment[] = N_("Please enter a commit message to explain why this merge is necessary,\n" "especially if it merges an updated upstream into a topic branch.\n" "\n" - "Lines starting with '#' will be ignored, and an empty message aborts\n" + "Lines starting with '%c' will be ignored, and an empty message aborts\n" "the commit.\n"); static void prepare_to_commit(struct commit_list *remoteheads) { struct strbuf msg = STRBUF_INIT; - const char *comment = _(merge_editor_comment); + const char *commentf = _(merge_editor_comment); strbuf_addbuf(&msg, &merge_msg); strbuf_addch(&msg, '\n'); - if (0 < option_edit) - strbuf_add_lines(&msg, "# ", comment, strlen(comment)); + if (0 < option_edit) { + struct strbuf hint = STRBUF_INIT; + char comment_head[3]; + + sprintf(comment_head, "%c ", comment_line_char); + strbuf_addf(&hint, commentf, comment_line_char); + strbuf_add_lines(&msg, comment_head, hint.buf, hint.len); + strbuf_release(&hint); + } write_merge_msg(&msg); if (run_hook(get_index_file(), "prepare-commit-msg", git_path("MERGE_MSG"), "merge", NULL, NULL)) diff --git a/builtin/stripspace.c b/builtin/stripspace.c index f16986c..600ca66 100644 --- a/builtin/stripspace.c +++ b/builtin/stripspace.c @@ -45,7 +45,7 @@ void stripspace(struct strbuf *sb, int skip_comments) eol = memchr(sb->buf + i, '\n', sb->len - i); len = eol ? eol - (sb->buf + i) + 1 : sb->len - i; - if (skip_comments && len && sb->buf[i] == '#') { + if (skip_comments && len && sb->buf[i] == comment_line_char) { newlen = 0; continue; } diff --git a/cache.h b/cache.h index c257953..0b435a4 100644 --- a/cache.h +++ b/cache.h @@ -562,6 +562,12 @@ extern int core_preload_index; extern int core_apply_sparse_checkout; extern int precomposed_unicode; +/* + * The character that begins a commented line in user-editable file + * that is subject to stripspace. + */ +extern char comment_line_char; + enum branch_track { BRANCH_TRACK_UNSPECIFIED = -1, BRANCH_TRACK_NEVER = 0, diff --git a/config.c b/config.c index 7b444b6..d873c59 100644 --- a/config.c +++ b/config.c @@ -717,6 +717,14 @@ static int git_default_core_config(const char *var, const char *value) if (!strcmp(var, "core.editor")) return git_config_string(&editor_program, var, value); + if (!strcmp(var, "core.commentchar")) { + const char *comment; + int ret = git_config_string(&comment, var, value); + if (!ret) + comment_line_char = comment[0]; + return ret; + } + if (!strcmp(var, "core.askpass")) return git_config_string(&askpass_program, var, value); diff --git a/environment.c b/environment.c index 85edd7f..a40c38b 100644 --- a/environment.c +++ b/environment.c @@ -62,6 +62,12 @@ int precomposed_unicode = -1; /* see probe_utf8_pathname_composition() */ struct startup_info *startup_info; unsigned long pack_size_limit_cfg; +/* + * The character that begins a commented line in user-editable file + * that is subject to stripspace. + */ +char comment_line_char = '#'; + /* Parallel index stat data preload? */ int core_preload_index = 0; diff --git a/wt-status.c b/wt-status.c index 2a9658b..f6f197e 100644 --- a/wt-status.c +++ b/wt-status.c @@ -45,7 +45,7 @@ static void status_vprintf(struct wt_status *s, int at_bol, const char *color, strbuf_vaddf(&sb, fmt, ap); if (!sb.len) { - strbuf_addch(&sb, '#'); + strbuf_addch(&sb, comment_line_char); if (!trail) strbuf_addch(&sb, ' '); color_print_strbuf(s->fp, color, &sb); @@ -59,7 +59,7 @@ static void status_vprintf(struct wt_status *s, int at_bol, const char *color, strbuf_reset(&linebuf); if (at_bol) { - strbuf_addch(&linebuf, '#'); + strbuf_addch(&linebuf, comment_line_char); if (*line != '\n' && *line != '\t') strbuf_addch(&linebuf, ' '); } @@ -760,8 +760,10 @@ static void wt_status_print_tracking(struct wt_status *s) for (cp = sb.buf; (ep = strchr(cp, '\n')) != NULL; cp = ep + 1) color_fprintf_ln(s->fp, color(WT_STATUS_HEADER, s), - "# %.*s", (int)(ep - cp), cp); - color_fprintf_ln(s->fp, color(WT_STATUS_HEADER, s), "#"); + "%c %.*s", comment_line_char, + (int)(ep - cp), cp); + color_fprintf_ln(s->fp, color(WT_STATUS_HEADER, s), "%c", + comment_line_char); } static int has_unmerged(struct wt_status *s) -- 1.8.1.351.g191b7b1 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html