зеркало из https://github.com/microsoft/git.git
Add config variable for specifying default --dirstat behavior
The new diff.dirstat config variable takes the same arguments as '--dirstat=<args>', and specifies the default arguments for --dirstat. The config is obviously overridden by --dirstat arguments passed on the command line. When not specified, the --dirstat defaults are 'changes,noncumulative,3'. The patch also adds several tests verifying the interaction between the diff.dirstat config variable, and the --dirstat command line option. Improved-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Johan Herland <johan@herland.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
333f3fb0c5
Коммит
2d17495196
|
@ -8,6 +8,42 @@ diff.autorefreshindex::
|
|||
affects only 'git diff' Porcelain, and not lower level
|
||||
'diff' commands such as 'git diff-files'.
|
||||
|
||||
diff.dirstat::
|
||||
A comma separated list of `--dirstat` parameters specifying the
|
||||
default behavior of the `--dirstat` option to linkgit:git-diff[1]`
|
||||
and friends. The defaults can be overridden on the command line
|
||||
(using `--dirstat=<param1,param2,...>`). The fallback defaults
|
||||
(when not changed by `diff.dirstat`) are `changes,noncumulative,3`.
|
||||
The following parameters are available:
|
||||
+
|
||||
--
|
||||
`changes`;;
|
||||
Compute the dirstat numbers by counting the lines that have been
|
||||
removed from the source, or added to the destination. This ignores
|
||||
the amount of pure code movements within a file. In other words,
|
||||
rearranging lines in a file is not counted as much as other changes.
|
||||
This is the default behavior when no parameter is given.
|
||||
`files`;;
|
||||
Compute the dirstat numbers by counting the number of files changed.
|
||||
Each changed file counts equally in the dirstat analysis. This is
|
||||
the computationally cheapest `--dirstat` behavior, since it does
|
||||
not have to look at the file contents at all.
|
||||
`cumulative`;;
|
||||
Count changes in a child directory for the parent directory as well.
|
||||
Note that when using `cumulative`, the sum of the percentages
|
||||
reported may exceed 100%. The default (non-cumulative) behavior can
|
||||
be specified with the `noncumulative` parameter.
|
||||
<limit>;;
|
||||
An integer parameter specifies a cut-off percent (3% by default).
|
||||
Directories contributing less than this percentage of the changes
|
||||
are not shown in the output.
|
||||
--
|
||||
+
|
||||
Example: The following will count changed files, while ignoring
|
||||
directories with less than 10% of the total amount of changed files,
|
||||
and accumulating child directory counts in the parent directories:
|
||||
`files,10,cumulative`.
|
||||
|
||||
diff.external::
|
||||
If this config variable is set, diff generation is not
|
||||
performed using the internal diff machinery, but using the
|
||||
|
|
|
@ -70,6 +70,8 @@ endif::git-format-patch[]
|
|||
Output the distribution of relative amount of changes for each
|
||||
sub-directory. The behavior of `--dirstat` can be customized by
|
||||
passing it a comma separated list of parameters.
|
||||
The defaults are controlled by the `diff.dirstat` configuration
|
||||
variable (see linkgit:git-config[1]).
|
||||
The following parameters are available:
|
||||
+
|
||||
--
|
||||
|
|
10
diff.c
10
diff.c
|
@ -31,6 +31,7 @@ static const char *external_diff_cmd_cfg;
|
|||
int diff_auto_refresh_index = 1;
|
||||
static int diff_mnemonic_prefix;
|
||||
static int diff_no_prefix;
|
||||
static int diff_dirstat_percent_default = 3;
|
||||
static struct diff_options default_diff_options;
|
||||
|
||||
static char diff_colors[][COLOR_MAXLEN] = {
|
||||
|
@ -180,6 +181,13 @@ int git_diff_basic_config(const char *var, const char *value, void *cb)
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (!strcmp(var, "diff.dirstat")) {
|
||||
default_diff_options.dirstat_percent = diff_dirstat_percent_default;
|
||||
(void) parse_dirstat_params(&default_diff_options, value);
|
||||
diff_dirstat_percent_default = default_diff_options.dirstat_percent;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!prefixcmp(var, "submodule."))
|
||||
return parse_submodule_config_option(var, value);
|
||||
|
||||
|
@ -2926,7 +2934,7 @@ void diff_setup(struct diff_options *options)
|
|||
options->line_termination = '\n';
|
||||
options->break_opt = -1;
|
||||
options->rename_limit = -1;
|
||||
options->dirstat_percent = 3;
|
||||
options->dirstat_percent = diff_dirstat_percent_default;
|
||||
options->context = 3;
|
||||
|
||||
options->change = diff_change;
|
||||
|
|
|
@ -386,6 +386,15 @@ test_expect_success 'later options override earlier options:' '
|
|||
test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
|
||||
'
|
||||
|
||||
test_expect_success 'non-defaults in config overridden by explicit defaults on command line' '
|
||||
git -c diff.dirstat=files,cumulative,50 diff --dirstat=changes,noncumulative,3 HEAD^..HEAD >actual_diff_dirstat &&
|
||||
test_cmp expect_diff_dirstat actual_diff_dirstat &&
|
||||
git -c diff.dirstat=files,cumulative,50 diff --dirstat=changes,noncumulative,3 -M HEAD^..HEAD >actual_diff_dirstat_M &&
|
||||
test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
|
||||
git -c diff.dirstat=files,cumulative,50 diff --dirstat=changes,noncumulative,3 -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
|
||||
test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
|
||||
'
|
||||
|
||||
cat <<EOF >expect_diff_dirstat
|
||||
2.1% changed/
|
||||
10.8% dst/copy/changed/
|
||||
|
@ -437,6 +446,15 @@ test_expect_success '-X0' '
|
|||
test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
|
||||
'
|
||||
|
||||
test_expect_success 'diff.dirstat=0' '
|
||||
git -c diff.dirstat=0 diff --dirstat HEAD^..HEAD >actual_diff_dirstat &&
|
||||
test_cmp expect_diff_dirstat actual_diff_dirstat &&
|
||||
git -c diff.dirstat=0 diff --dirstat -M HEAD^..HEAD >actual_diff_dirstat_M &&
|
||||
test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
|
||||
git -c diff.dirstat=0 diff --dirstat -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
|
||||
test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
|
||||
'
|
||||
|
||||
cat <<EOF >expect_diff_dirstat
|
||||
2.1% changed/
|
||||
10.8% dst/copy/changed/
|
||||
|
@ -507,6 +525,24 @@ test_expect_success '-X0,cumulative' '
|
|||
test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
|
||||
'
|
||||
|
||||
test_expect_success 'diff.dirstat=0,cumulative' '
|
||||
git -c diff.dirstat=0,cumulative diff --dirstat HEAD^..HEAD >actual_diff_dirstat &&
|
||||
test_cmp expect_diff_dirstat actual_diff_dirstat &&
|
||||
git -c diff.dirstat=0,cumulative diff --dirstat -M HEAD^..HEAD >actual_diff_dirstat_M &&
|
||||
test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
|
||||
git -c diff.dirstat=0,cumulative diff --dirstat -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
|
||||
test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
|
||||
'
|
||||
|
||||
test_expect_success 'diff.dirstat=0 & --dirstat=cumulative' '
|
||||
git -c diff.dirstat=0 diff --dirstat=cumulative HEAD^..HEAD >actual_diff_dirstat &&
|
||||
test_cmp expect_diff_dirstat actual_diff_dirstat &&
|
||||
git -c diff.dirstat=0 diff --dirstat=cumulative -M HEAD^..HEAD >actual_diff_dirstat_M &&
|
||||
test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
|
||||
git -c diff.dirstat=0 diff --dirstat=cumulative -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
|
||||
test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
|
||||
'
|
||||
|
||||
cat <<EOF >expect_diff_dirstat
|
||||
9.0% changed/
|
||||
9.0% dst/copy/changed/
|
||||
|
@ -558,6 +594,15 @@ test_expect_success '--dirstat=files' '
|
|||
test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
|
||||
'
|
||||
|
||||
test_expect_success 'diff.dirstat=files' '
|
||||
git -c diff.dirstat=files diff --dirstat HEAD^..HEAD >actual_diff_dirstat &&
|
||||
test_cmp expect_diff_dirstat actual_diff_dirstat &&
|
||||
git -c diff.dirstat=files diff --dirstat -M HEAD^..HEAD >actual_diff_dirstat_M &&
|
||||
test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
|
||||
git -c diff.dirstat=files diff --dirstat -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
|
||||
test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
|
||||
'
|
||||
|
||||
cat <<EOF >expect_diff_dirstat
|
||||
27.2% dst/copy/
|
||||
27.2% dst/move/
|
||||
|
@ -601,6 +646,15 @@ test_expect_success '--dirstat=files,10' '
|
|||
test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
|
||||
'
|
||||
|
||||
test_expect_success 'diff.dirstat=10,files' '
|
||||
git -c diff.dirstat=10,files diff --dirstat HEAD^..HEAD >actual_diff_dirstat &&
|
||||
test_cmp expect_diff_dirstat actual_diff_dirstat &&
|
||||
git -c diff.dirstat=10,files diff --dirstat -M HEAD^..HEAD >actual_diff_dirstat_M &&
|
||||
test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
|
||||
git -c diff.dirstat=10,files diff --dirstat -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
|
||||
test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
|
||||
'
|
||||
|
||||
cat <<EOF >expect_diff_dirstat
|
||||
9.0% changed/
|
||||
9.0% dst/copy/changed/
|
||||
|
@ -662,6 +716,15 @@ test_expect_success '--dirstat=files,cumulative' '
|
|||
test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
|
||||
'
|
||||
|
||||
test_expect_success 'diff.dirstat=cumulative,files' '
|
||||
git -c diff.dirstat=cumulative,files diff --dirstat HEAD^..HEAD >actual_diff_dirstat &&
|
||||
test_cmp expect_diff_dirstat actual_diff_dirstat &&
|
||||
git -c diff.dirstat=cumulative,files diff --dirstat -M HEAD^..HEAD >actual_diff_dirstat_M &&
|
||||
test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
|
||||
git -c diff.dirstat=cumulative,files diff --dirstat -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
|
||||
test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
|
||||
'
|
||||
|
||||
cat <<EOF >expect_diff_dirstat
|
||||
27.2% dst/copy/
|
||||
27.2% dst/move/
|
||||
|
@ -703,4 +766,13 @@ test_expect_success '--dirstat=files,cumulative,10' '
|
|||
test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
|
||||
'
|
||||
|
||||
test_expect_success 'diff.dirstat=10,cumulative,files' '
|
||||
git -c diff.dirstat=10,cumulative,files diff --dirstat HEAD^..HEAD >actual_diff_dirstat &&
|
||||
test_cmp expect_diff_dirstat actual_diff_dirstat &&
|
||||
git -c diff.dirstat=10,cumulative,files diff --dirstat -M HEAD^..HEAD >actual_diff_dirstat_M &&
|
||||
test_cmp expect_diff_dirstat_M actual_diff_dirstat_M &&
|
||||
git -c diff.dirstat=10,cumulative,files diff --dirstat -C -C HEAD^..HEAD >actual_diff_dirstat_CC &&
|
||||
test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC
|
||||
'
|
||||
|
||||
test_done
|
||||
|
|
Загрузка…
Ссылка в новой задаче