提交 5d5f1c23 编写于 作者: J Junio C Hamano

Merge branch 'pb/commit-verbose-config'

"git commit" learned to pay attention to "commit.verbose"
configuration variable and act as if "--verbose" option was
given from the command line.

* pb/commit-verbose-config:
  commit: add a commit.verbose config variable
  t7507-commit-verbose: improve test coverage by testing number of diffs
  parse-options.c: make OPTION_COUNTUP respect "unspecified" values
  t/t7507: improve test coverage
  t0040-parse-options: improve test coverage
  test-parse-options: print quiet as integer
  t0040-test-parse-options.sh: fix style issues
......@@ -1141,6 +1141,10 @@ commit.template::
Specify the pathname of a file to use as the template for
new commit messages.
commit.verbose::
A boolean or int to specify the level of verbose with `git commit`.
See linkgit:git-commit[1].
credential.helper::
Specify an external helper to be called when a username or
password credential is needed; the helper may consult external
......
......@@ -290,7 +290,8 @@ configuration variable documented in linkgit:git-config[1].
what changes the commit has.
Note that this diff output doesn't have its
lines prefixed with '#'. This diff will not be a part
of the commit message.
of the commit message. See the `commit.verbose` configuration
variable in linkgit:git-config[1].
+
If specified twice, show in addition the unified diff between
what would be committed and the worktree files, i.e. the unstaged
......
......@@ -144,8 +144,12 @@ There are some macros to easily define options:
`OPT_COUNTUP(short, long, &int_var, description)`::
Introduce a count-up option.
`int_var` is incremented on each use of `--option`, and
reset to zero with `--no-option`.
Each use of `--option` increments `int_var`, starting from zero
(even if initially negative), and `--no-option` resets it to
zero. To determine if `--option` or `--no-option` was encountered at
all, initialize `int_var` to a negative value, and if it is still
negative after parse_options(), then neither `--option` nor
`--no-option` was seen.
`OPT_BIT(short, long, &int_var, description, mask)`::
Introduce a boolean option.
......
......@@ -114,6 +114,7 @@ static char *fixup_message, *squash_message;
static int all, also, interactive, patch_interactive, only, amend, signoff;
static int edit_flag = -1; /* unspecified */
static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
static int config_commit_verbose = -1; /* unspecified */
static int no_post_rewrite, allow_empty_message;
static char *untracked_files_arg, *force_date, *ignore_submodule_arg;
static char *sign_commit;
......@@ -1515,6 +1516,11 @@ static int git_commit_config(const char *k, const char *v, void *cb)
sign_commit = git_config_bool(k, v) ? "" : NULL;
return 0;
}
if (!strcmp(k, "commit.verbose")) {
int is_bool;
config_commit_verbose = git_config_bool_or_int(k, v, &is_bool);
return 0;
}
status = git_gpg_config(k, v, NULL);
if (status)
......@@ -1661,9 +1667,13 @@ int cmd_commit(int argc, const char **argv, const char *prefix)
if (parse_commit(current_head))
die(_("could not parse HEAD commit"));
}
verbose = -1; /* unspecified */
argc = parse_and_validate_options(argc, argv, builtin_commit_options,
builtin_commit_usage,
prefix, current_head, &s);
if (verbose == -1)
verbose = (config_commit_verbose < 0) ? 0 : config_commit_verbose;
if (dry_run)
return dry_run_commit(argc, argv, prefix, current_head, &s);
index_file = prepare_index(argc, argv, prefix, current_head, 0);
......
......@@ -110,6 +110,8 @@ static int get_value(struct parse_opt_ctx_t *p,
return 0;
case OPTION_COUNTUP:
if (*(int *)opt->value < 0)
*(int *)opt->value = 0;
*(int *)opt->value = unset ? 0 : *(int *)opt->value + 1;
return 0;
......
......@@ -7,7 +7,8 @@ static int integer = 0;
static unsigned long magnitude = 0;
static unsigned long timestamp;
static int abbrev = 7;
static int verbose = 0, dry_run = 0, quiet = 0;
static int verbose = -1; /* unspecified */
static int dry_run = 0, quiet = 0;
static char *string = NULL;
static char *file = NULL;
static int ambiguous;
......@@ -90,7 +91,7 @@ int main(int argc, char **argv)
printf("string: %s\n", string ? string : "(not set)");
printf("abbrev: %d\n", abbrev);
printf("verbose: %d\n", verbose);
printf("quiet: %s\n", quiet ? "yes" : "no");
printf("quiet: %d\n", quiet);
printf("dry run: %s\n", dry_run ? "yes" : "no");
printf("file: %s\n", file ? file : "(not set)");
......
......@@ -7,7 +7,7 @@ test_description='our own option parser'
. ./test-lib.sh
cat > expect << EOF
cat >expect <<\EOF
usage: test-parse-options <options>
--yes get a boolean
......@@ -49,22 +49,22 @@ Standard options
EOF
test_expect_success 'test help' '
test_must_fail test-parse-options -h > output 2> output.err &&
test_must_fail test-parse-options -h >output 2>output.err &&
test_must_be_empty output.err &&
test_i18ncmp expect output
'
mv expect expect.err
cat >expect.template <<EOF
cat >expect.template <<\EOF
boolean: 0
integer: 0
magnitude: 0
timestamp: 0
string: (not set)
abbrev: 7
verbose: 0
quiet: no
verbose: -1
quiet: 0
dry run: no
file: (not set)
EOF
......@@ -156,7 +156,7 @@ test_expect_success 'OPT_MAGNITUDE() 3giga' '
check magnitude: 3221225472 -m 3g
'
cat > expect << EOF
cat >expect <<\EOF
boolean: 2
integer: 1729
magnitude: 16384
......@@ -164,7 +164,7 @@ timestamp: 0
string: 123
abbrev: 7
verbose: 2
quiet: no
quiet: 0
dry run: yes
file: prefix/my.file
EOF
......@@ -176,7 +176,7 @@ test_expect_success 'short options' '
test_must_be_empty output.err
'
cat > expect << EOF
cat >expect <<\EOF
boolean: 2
integer: 1729
magnitude: 16384
......@@ -184,7 +184,7 @@ timestamp: 0
string: 321
abbrev: 10
verbose: 2
quiet: no
quiet: 0
dry run: no
file: prefix/fi.le
EOF
......@@ -204,15 +204,15 @@ test_expect_success 'missing required value' '
test_expect_code 129 test-parse-options --file
'
cat > expect << EOF
cat >expect <<\EOF
boolean: 1
integer: 13
magnitude: 0
timestamp: 0
string: 123
abbrev: 7
verbose: 0
quiet: no
verbose: -1
quiet: 0
dry run: no
file: (not set)
arg 00: a1
......@@ -222,32 +222,32 @@ EOF
test_expect_success 'intermingled arguments' '
test-parse-options a1 --string 123 b1 --boolean -j 13 -- --boolean \
> output 2> output.err &&
>output 2>output.err &&
test_must_be_empty output.err &&
test_cmp expect output
'
cat > expect << EOF
cat >expect <<\EOF
boolean: 0
integer: 2
magnitude: 0
timestamp: 0
string: (not set)
abbrev: 7
verbose: 0
quiet: no
verbose: -1
quiet: 0
dry run: no
file: (not set)
EOF
test_expect_success 'unambiguously abbreviated option' '
test-parse-options --int 2 --boolean --no-bo > output 2> output.err &&
test-parse-options --int 2 --boolean --no-bo >output 2>output.err &&
test_must_be_empty output.err &&
test_cmp expect output
'
test_expect_success 'unambiguously abbreviated option with "="' '
test-parse-options --int=2 > output 2> output.err &&
test-parse-options --int=2 >output 2>output.err &&
test_must_be_empty output.err &&
test_cmp expect output
'
......@@ -256,74 +256,74 @@ test_expect_success 'ambiguously abbreviated option' '
test_expect_code 129 test-parse-options --strin 123
'
cat > expect << EOF
cat >expect <<\EOF
boolean: 0
integer: 0
magnitude: 0
timestamp: 0
string: 123
abbrev: 7
verbose: 0
quiet: no
verbose: -1
quiet: 0
dry run: no
file: (not set)
EOF
test_expect_success 'non ambiguous option (after two options it abbreviates)' '
test-parse-options --st 123 > output 2> output.err &&
test-parse-options --st 123 >output 2>output.err &&
test_must_be_empty output.err &&
test_cmp expect output
'
cat > typo.err << EOF
error: did you mean \`--boolean\` (with two dashes ?)
cat >typo.err <<\EOF
error: did you mean `--boolean` (with two dashes ?)
EOF
test_expect_success 'detect possible typos' '
test_must_fail test-parse-options -boolean > output 2> output.err &&
test_must_fail test-parse-options -boolean >output 2>output.err &&
test_must_be_empty output &&
test_cmp typo.err output.err
'
cat > typo.err << EOF
error: did you mean \`--ambiguous\` (with two dashes ?)
cat >typo.err <<\EOF
error: did you mean `--ambiguous` (with two dashes ?)
EOF
test_expect_success 'detect possible typos' '
test_must_fail test-parse-options -ambiguous > output 2> output.err &&
test_must_fail test-parse-options -ambiguous >output 2>output.err &&
test_must_be_empty output &&
test_cmp typo.err output.err
'
cat > expect <<EOF
cat >expect <<\EOF
boolean: 0
integer: 0
magnitude: 0
timestamp: 0
string: (not set)
abbrev: 7
verbose: 0
quiet: no
verbose: -1
quiet: 0
dry run: no
file: (not set)
arg 00: --quux
EOF
test_expect_success 'keep some options as arguments' '
test-parse-options --quux > output 2> output.err &&
test-parse-options --quux >output 2>output.err &&
test_must_be_empty output.err &&
test_cmp expect output
test_cmp expect output
'
cat > expect <<EOF
cat >expect <<\EOF
boolean: 0
integer: 0
magnitude: 0
timestamp: 1
string: (not set)
abbrev: 7
verbose: 0
quiet: yes
verbose: -1
quiet: 1
dry run: no
file: (not set)
arg 00: foo
......@@ -331,12 +331,12 @@ EOF
test_expect_success 'OPT_DATE() works' '
test-parse-options -t "1970-01-01 00:00:01 +0000" \
foo -q > output 2> output.err &&
foo -q >output 2>output.err &&
test_must_be_empty output.err &&
test_cmp expect output
'
cat > expect <<EOF
cat >expect <<\EOF
Callback: "four", 0
boolean: 5
integer: 4
......@@ -344,112 +344,112 @@ magnitude: 0
timestamp: 0
string: (not set)
abbrev: 7
verbose: 0
quiet: no
verbose: -1
quiet: 0
dry run: no
file: (not set)
EOF
test_expect_success 'OPT_CALLBACK() and OPT_BIT() work' '
test-parse-options --length=four -b -4 > output 2> output.err &&
test-parse-options --length=four -b -4 >output 2>output.err &&
test_must_be_empty output.err &&
test_cmp expect output
'
cat > expect <<EOF
cat >expect <<\EOF
Callback: "not set", 1
EOF
test_expect_success 'OPT_CALLBACK() and callback errors work' '
test_must_fail test-parse-options --no-length > output 2> output.err &&
test_must_fail test-parse-options --no-length >output 2>output.err &&
test_i18ncmp expect output &&
test_i18ncmp expect.err output.err
'
cat > expect <<EOF
cat >expect <<\EOF
boolean: 1
integer: 23
magnitude: 0
timestamp: 0
string: (not set)
abbrev: 7
verbose: 0
quiet: no
verbose: -1
quiet: 0
dry run: no
file: (not set)
EOF
test_expect_success 'OPT_BIT() and OPT_SET_INT() work' '
test-parse-options --set23 -bbbbb --no-or4 > output 2> output.err &&
test-parse-options --set23 -bbbbb --no-or4 >output 2>output.err &&
test_must_be_empty output.err &&
test_cmp expect output
'
test_expect_success 'OPT_NEGBIT() and OPT_SET_INT() work' '
test-parse-options --set23 -bbbbb --neg-or4 > output 2> output.err &&
test-parse-options --set23 -bbbbb --neg-or4 >output 2>output.err &&
test_must_be_empty output.err &&
test_cmp expect output
'
cat > expect <<EOF
cat >expect <<\EOF
boolean: 6
integer: 0
magnitude: 0
timestamp: 0
string: (not set)
abbrev: 7
verbose: 0
quiet: no
verbose: -1
quiet: 0
dry run: no
file: (not set)
EOF
test_expect_success 'OPT_BIT() works' '
test-parse-options -bb --or4 > output 2> output.err &&
test-parse-options -bb --or4 >output 2>output.err &&
test_must_be_empty output.err &&
test_cmp expect output
'
test_expect_success 'OPT_NEGBIT() works' '
test-parse-options -bb --no-neg-or4 > output 2> output.err &&
test-parse-options -bb --no-neg-or4 >output 2>output.err &&
test_must_be_empty output.err &&
test_cmp expect output
'
test_expect_success 'OPT_COUNTUP() with PARSE_OPT_NODASH works' '
test-parse-options + + + + + + > output 2> output.err &&
test-parse-options + + + + + + >output 2>output.err &&
test_must_be_empty output.err &&
test_cmp expect output
'
cat > expect <<EOF
cat >expect <<\EOF
boolean: 0
integer: 12345
magnitude: 0
timestamp: 0
string: (not set)
abbrev: 7
verbose: 0
quiet: no
verbose: -1
quiet: 0
dry run: no
file: (not set)
EOF
test_expect_success 'OPT_NUMBER_CALLBACK() works' '
test-parse-options -12345 > output 2> output.err &&
test-parse-options -12345 >output 2>output.err &&
test_must_be_empty output.err &&
test_cmp expect output
'
cat >expect <<EOF
cat >expect <<\EOF
boolean: 0
integer: 0
magnitude: 0
timestamp: 0
string: (not set)
abbrev: 7
verbose: 0
quiet: no
verbose: -1
quiet: 0
dry run: no
file: (not set)
EOF
......@@ -460,7 +460,7 @@ test_expect_success 'negation of OPT_NONEG flags is not ambiguous' '
test_cmp expect output
'
cat >>expect <<'EOF'
cat >>expect <<\EOF
list: foo
list: bar
list: baz
......@@ -476,4 +476,118 @@ test_expect_success '--no-list resets list' '
test_cmp expect output
'
cat >expect <<\EOF
boolean: 0
integer: 0
magnitude: 0
timestamp: 0
string: (not set)
abbrev: 7
verbose: -1
quiet: 3
dry run: no
file: (not set)
EOF
test_expect_success 'multiple quiet levels' '
test-parse-options -q -q -q >output 2>output.err &&
test_must_be_empty output.err &&
test_cmp expect output
'
cat >expect <<\EOF
boolean: 0
integer: 0
magnitude: 0
timestamp: 0
string: (not set)
abbrev: 7
verbose: 3
quiet: 0
dry run: no
file: (not set)
EOF
test_expect_success 'multiple verbose levels' '
test-parse-options -v -v -v >output 2>output.err &&
test_must_be_empty output.err &&
test_cmp expect output
'
cat >expect <<\EOF
boolean: 0
integer: 0
magnitude: 0
timestamp: 0
string: (not set)
abbrev: 7
verbose: -1
quiet: 0
dry run: no
file: (not set)
EOF
test_expect_success '--no-quiet sets --quiet to 0' '
test-parse-options --no-quiet >output 2>output.err &&
test_must_be_empty output.err &&
test_cmp expect output
'
cat >expect <<\EOF
boolean: 0
integer: 0
magnitude: 0
timestamp: 0
string: (not set)
abbrev: 7
verbose: -1
quiet: 0
dry run: no
file: (not set)
EOF
test_expect_success '--no-quiet resets multiple -q to 0' '
test-parse-options -q -q -q --no-quiet >output 2>output.err &&
test_must_be_empty output.err &&
test_cmp expect output
'
cat >expect <<\EOF
boolean: 0
integer: 0
magnitude: 0
timestamp: 0
string: (not set)
abbrev: 7
verbose: 0
quiet: 0
dry run: no
file: (not set)
EOF
test_expect_success '--no-verbose sets verbose to 0' '
test-parse-options --no-verbose >output 2>output.err &&
test_must_be_empty output.err &&
test_cmp expect output
'
cat >expect <<\EOF
boolean: 0
integer: 0
magnitude: 0
timestamp: 0
string: (not set)
abbrev: 7
verbose: 0
quiet: 0
dry run: no
file: (not set)
EOF
test_expect_success '--no-verbose resets multiple verbose to 0' '
test-parse-options -v -v -v --no-verbose >output 2>output.err &&
test_must_be_empty output.err &&
test_cmp expect output
'
test_done
......@@ -3,11 +3,10 @@
test_description='verbose commit template'
. ./test-lib.sh
cat >check-for-diff <<EOF
#!$SHELL_PATH
exec grep '^diff --git' "\$1"
write_script "check-for-diff" <<\EOF &&
grep '^diff --git' "$1" >out
exit 0
EOF
chmod +x check-for-diff
test_set_editor "$PWD/check-for-diff"
cat >message <<'EOF'
......@@ -23,7 +22,8 @@ test_expect_success 'setup' '
'
test_expect_success 'initial commit shows verbose diff' '
git commit --amend -v
git commit --amend -v &&
test_line_count = 1 out
'
test_expect_success 'second commit' '
......@@ -39,13 +39,15 @@ check_message() {
test_expect_success 'verbose diff is stripped out' '
git commit --amend -v &&
check_message message
check_message message &&
test_line_count = 1 out
'
test_expect_success 'verbose diff is stripped out (mnemonicprefix)' '
git config diff.mnemonicprefix true &&
git commit --amend -v &&
check_message message
check_message message &&
test_line_count = 1 out
'
cat >diff <<'EOF'
......@@ -96,4 +98,60 @@ test_expect_success 'verbose diff is stripped out with set core.commentChar' '
test_i18ngrep "Aborting commit due to empty commit message." err
'
test_expect_success 'status does not verbose without --verbose' '
git status >actual &&
! grep "^diff --git" actual
'
test_expect_success 'setup -v -v' '
echo dirty >file
'
for i in true 1
do
test_expect_success "commit.verbose=$i and --verbose omitted" "
git -c commit.verbose=$i commit --amend &&
test_line_count = 1 out
"
done
for i in false -2 -1 0
do
test_expect_success "commit.verbose=$i and --verbose omitted" "
git -c commit.verbose=$i commit --amend &&
test_line_count = 0 out
"
done
for i in 2 3
do
test_expect_success "commit.verbose=$i and --verbose omitted" "
git -c commit.verbose=$i commit --amend &&
test_line_count = 2 out
"
done
for i in true false -2 -1 0 1 2 3
do
test_expect_success "commit.verbose=$i and --verbose" "
git -c commit.verbose=$i commit --amend --verbose &&
test_line_count = 1 out
"
test_expect_success "commit.verbose=$i and --no-verbose" "
git -c commit.verbose=$i commit --amend --no-verbose &&
test_line_count = 0 out
"
test_expect_success "commit.verbose=$i and -v -v" "
git -c commit.verbose=$i commit --amend -v -v &&
test_line_count = 2 out
"
done
test_expect_success "status ignores commit.verbose=true" '
git -c commit.verbose=true status >actual &&
! grep "^diff --git actual"
'
test_done
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册