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:
Johan Herland 2011-04-29 11:36:19 +02:00 committed by Junio C Hamano
parent 333f3fb0c5
commit 2d17495196
4 changed files with 119 additions and 1 deletions

View file

@ -8,6 +8,42 @@ diff.autorefreshindex::
affects only 'git diff' Porcelain, and not lower level affects only 'git diff' Porcelain, and not lower level
'diff' commands such as 'git diff-files'. '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:: diff.external::
If this config variable is set, diff generation is not If this config variable is set, diff generation is not
performed using the internal diff machinery, but using the performed using the internal diff machinery, but using the

View file

@ -70,6 +70,8 @@ endif::git-format-patch[]
Output the distribution of relative amount of changes for each Output the distribution of relative amount of changes for each
sub-directory. The behavior of `--dirstat` can be customized by sub-directory. The behavior of `--dirstat` can be customized by
passing it a comma separated list of parameters. 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: The following parameters are available:
+ +
-- --

10
diff.c
View file

@ -31,6 +31,7 @@ static const char *external_diff_cmd_cfg;
int diff_auto_refresh_index = 1; int diff_auto_refresh_index = 1;
static int diff_mnemonic_prefix; static int diff_mnemonic_prefix;
static int diff_no_prefix; static int diff_no_prefix;
static int diff_dirstat_percent_default = 3;
static struct diff_options default_diff_options; static struct diff_options default_diff_options;
static char diff_colors[][COLOR_MAXLEN] = { 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; 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.")) if (!prefixcmp(var, "submodule."))
return parse_submodule_config_option(var, value); return parse_submodule_config_option(var, value);
@ -2926,7 +2934,7 @@ void diff_setup(struct diff_options *options)
options->line_termination = '\n'; options->line_termination = '\n';
options->break_opt = -1; options->break_opt = -1;
options->rename_limit = -1; options->rename_limit = -1;
options->dirstat_percent = 3; options->dirstat_percent = diff_dirstat_percent_default;
options->context = 3; options->context = 3;
options->change = diff_change; options->change = diff_change;

View file

@ -386,6 +386,15 @@ test_expect_success 'later options override earlier options:' '
test_cmp expect_diff_dirstat_CC actual_diff_dirstat_CC 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 cat <<EOF >expect_diff_dirstat
2.1% changed/ 2.1% changed/
10.8% dst/copy/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_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 cat <<EOF >expect_diff_dirstat
2.1% changed/ 2.1% changed/
10.8% dst/copy/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_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 cat <<EOF >expect_diff_dirstat
9.0% changed/ 9.0% changed/
9.0% dst/copy/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_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 cat <<EOF >expect_diff_dirstat
27.2% dst/copy/ 27.2% dst/copy/
27.2% dst/move/ 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_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 cat <<EOF >expect_diff_dirstat
9.0% changed/ 9.0% changed/
9.0% dst/copy/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_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 cat <<EOF >expect_diff_dirstat
27.2% dst/copy/ 27.2% dst/copy/
27.2% dst/move/ 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_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 test_done