diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt index e608d5ffef..af374ee2e0 100644 --- a/Documentation/git-config.txt +++ b/Documentation/git-config.txt @@ -9,9 +9,9 @@ git-config - Get and set repository or global options SYNOPSIS -------- [verse] -'git config' [] [--type=] [--comment=] [--fixed-value] [--show-origin] [--show-scope] [-z|--null] [ []] -'git config' [] [--type=] [--comment=] --add -'git config' [] [--type=] [--comment=] [--fixed-value] --replace-all [] +'git config' [] [--type=] [--comment=] [--fixed-value] [--show-origin] [--show-scope] [-z|--null] [ []] +'git config' [] [--type=] [--comment=] --add +'git config' [] [--type=] [--comment=] [--fixed-value] --replace-all [] 'git config' [] [--type=] [--show-origin] [--show-scope] [-z|--null] [--fixed-value] --get [] 'git config' [] [--type=] [--show-origin] [--show-scope] [-z|--null] [--fixed-value] --get-all [] 'git config' [] [--type=] [--show-origin] [--show-scope] [-z|--null] [--fixed-value] [--name-only] --get-regexp [] @@ -87,10 +87,11 @@ OPTIONS values. This is the same as providing '^$' as the `value-pattern` in `--replace-all`. ---comment :: - Append a comment to new or modified lines. A '#' character will be - unconditionally prepended to the value. The value must not contain - linefeed characters (no multi-line comments are permitted). +--comment :: + Append a comment at the end of new or modified lines. + Unless __ begins with "#", a string "# " (hash + followed by a space) is prepended to it. The __ must not + contain linefeed characters (no multi-line comments are permitted). --get:: Get the value for a given key (optionally filtered by a regex diff --git a/builtin/config.c b/builtin/config.c index c54e9941a5..e859a659f4 100644 --- a/builtin/config.c +++ b/builtin/config.c @@ -174,7 +174,7 @@ static struct option builtin_config_options[] = { OPT_BOOL(0, "show-origin", &show_origin, N_("show origin of config (file, standard input, blob, command line)")), OPT_BOOL(0, "show-scope", &show_scope, N_("show scope of config (worktree, local, global, system, command)")), OPT_STRING(0, "default", &default_value, N_("value"), N_("with --get, use default value when missing entry")), - OPT_STRING(0, "comment", &comment, N_("value"), N_("human-readable comment string (# will be prepended automatically)")), + OPT_STRING(0, "comment", &comment, N_("value"), N_("human-readable comment string (# will be prepended as needed)")), OPT_END(), }; @@ -800,9 +800,9 @@ int cmd_config(int argc, const char **argv, const char *prefix) } if (comment && - !(actions & (ACTION_ADD|ACTION_SET|ACTION_SET_ALL|ACTION_REPLACE_ALL))) { - error(_("--comment is only applicable to add/set/replace operations")); - usage_builtin_config(); + !(actions & (ACTION_ADD|ACTION_SET|ACTION_SET_ALL|ACTION_REPLACE_ALL))) { + error(_("--comment is only applicable to add/set/replace operations")); + usage_builtin_config(); } /* check usage of --fixed-value */ @@ -841,6 +841,13 @@ int cmd_config(int argc, const char **argv, const char *prefix) flags |= CONFIG_FLAGS_FIXED_VALUE; } + if (comment) { + if (strchr(comment, '\n')) + die(_("no multi-line comment allowed: '%s'"), comment); + if (comment[0] != '#') + comment = xstrfmt("# %s", comment); + } + if (actions & PAGING_ACTIONS) setup_auto_pager("config", 1); diff --git a/config.c b/config.c index 2f3f6d123c..15019cb9a5 100644 --- a/config.c +++ b/config.c @@ -3043,12 +3043,9 @@ static ssize_t write_pair(int fd, const char *key, const char *value, break; } - if (comment) { - if (strchr(comment, '\n')) - die(_("multi-line comments are not permitted: '%s'"), comment); - else - strbuf_addf(&sb, "%s #%s\n", quote, comment); - } else + if (comment) + strbuf_addf(&sb, "%s %s\n", quote, comment); + else strbuf_addf(&sb, "%s\n", quote); ret = write_in_full(fd, sb.buf, sb.len); @@ -3214,6 +3211,17 @@ int git_config_set_multivar_in_file_gently(const char *config_filename, size_t contents_sz; struct config_store_data store = CONFIG_STORE_INIT; + if (comment) { + /* + * The front-end must have massaged the comment string + * properly before calling us. + */ + if (strchr(comment, '\n')) + BUG("multi-line comments are not permitted: '%s'", comment); + if (comment[0] != '#') + BUG("comment should begin with '#': '%s'", comment); + } + /* parse-key returns negative; flip the sign to feed exit(3) */ ret = 0 - git_config_parse_key(key, &store.key, &store.baselen); if (ret) diff --git a/t/t1300-config.sh b/t/t1300-config.sh index ac7b02e6b0..d5dfb45877 100755 --- a/t/t1300-config.sh +++ b/t/t1300-config.sh @@ -71,16 +71,17 @@ cat > expect << EOF [section] Movie = BadPhysics UPPERCASE = true - penguin = gentoo #Pygoscelis papua - disposition = peckish #find fish - foo = bar ## abc + penguin = gentoo # Pygoscelis papua + disposition = peckish # find fish + foo = bar #abc [Sections] WhatEver = Second EOF + test_expect_success 'append comments' ' git config --replace-all --comment="Pygoscelis papua" section.penguin gentoo && git config --comment="find fish" section.disposition peckish && - git config --comment="# abc" section.foo bar && + git config --comment="#abc" section.foo bar && test_cmp expect .git/config '