Browse Source

diff: introduce diff.submodule configuration variable

Introduce a diff.submodule configuration variable corresponding to the
'--submodule' command-line option of 'git diff'.

Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
Acked-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Ramkumar Ramachandra 12 years ago committed by Junio C Hamano
parent
commit
c47ef57caa
  1. 7
      Documentation/diff-config.txt
  2. 3
      Documentation/diff-options.txt
  3. 32
      diff.c
  4. 29
      t/t4041-diff-submodule-option.sh

7
Documentation/diff-config.txt

@ -107,6 +107,13 @@ diff.suppressBlankEmpty:: @@ -107,6 +107,13 @@ diff.suppressBlankEmpty::
A boolean to inhibit the standard behavior of printing a space
before each empty output line. Defaults to false.

diff.submodule::
Specify the format in which differences in submodules are
shown. The "log" format lists the commits in the range like
linkgit:git-submodule[1] `summary` does. The "short" format
format just shows the names of the commits at the beginning
and end of the range. Defaults to short.

diff.wordRegex::
A POSIX Extended Regular Expression used to determine what is a "word"
when performing word-by-word difference calculations. Character

3
Documentation/diff-options.txt

@ -170,7 +170,8 @@ any of those replacements occurred. @@ -170,7 +170,8 @@ any of those replacements occurred.
the commits in the range like linkgit:git-submodule[1] `summary` does.
Omitting the `--submodule` option or specifying `--submodule=short`,
uses the 'short' format. This format just shows the names of the commits
at the beginning and end of the range.
at the beginning and end of the range. Can be tweaked via the
`diff.submodule` configuration variable.

--color[=<when>]::
Show colored diff.

32
diff.c

@ -121,6 +121,17 @@ static int parse_dirstat_params(struct diff_options *options, const char *params @@ -121,6 +121,17 @@ static int parse_dirstat_params(struct diff_options *options, const char *params
return ret;
}

static int parse_submodule_params(struct diff_options *options, const char *value)
{
if (!strcmp(value, "log"))
DIFF_OPT_SET(options, SUBMODULE_LOG);
else if (!strcmp(value, "short"))
DIFF_OPT_CLR(options, SUBMODULE_LOG);
else
return -1;
return 0;
}

static int git_config_rename(const char *var, const char *value)
{
if (!value)
@ -176,6 +187,13 @@ int git_diff_ui_config(const char *var, const char *value, void *cb) @@ -176,6 +187,13 @@ int git_diff_ui_config(const char *var, const char *value, void *cb)
if (!strcmp(var, "diff.ignoresubmodules"))
handle_ignore_submodules_arg(&default_diff_options, value);

if (!strcmp(var, "diff.submodule")) {
if (parse_submodule_params(&default_diff_options, value))
warning(_("Unknown value for 'diff.submodule' config variable: '%s'"),
value);
return 0;
}

if (git_color_config(var, value, cb) < 0)
return -1;

@ -3473,6 +3491,14 @@ static int parse_dirstat_opt(struct diff_options *options, const char *params) @@ -3473,6 +3491,14 @@ static int parse_dirstat_opt(struct diff_options *options, const char *params)
return 1;
}

static int parse_submodule_opt(struct diff_options *options, const char *value)
{
if (parse_submodule_params(options, value))
die(_("Failed to parse --submodule option parameter: '%s'"),
value);
return 1;
}

int diff_opt_parse(struct diff_options *options, const char **av, int ac)
{
const char *arg = av[0];
@ -3653,10 +3679,8 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac) @@ -3653,10 +3679,8 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac)
handle_ignore_submodules_arg(options, arg + 20);
} else if (!strcmp(arg, "--submodule"))
DIFF_OPT_SET(options, SUBMODULE_LOG);
else if (!prefixcmp(arg, "--submodule=")) {
if (!strcmp(arg + 12, "log"))
DIFF_OPT_SET(options, SUBMODULE_LOG);
}
else if (!prefixcmp(arg, "--submodule="))
return parse_submodule_opt(options, arg + 12);

/* misc options */
else if (!strcmp(arg, "-z"))

29
t/t4041-diff-submodule-option.sh

@ -33,6 +33,7 @@ test_create_repo sm1 && @@ -33,6 +33,7 @@ test_create_repo sm1 &&
add_file . foo >/dev/null

head1=$(add_file sm1 foo1 foo2)
fullhead1=$(cd sm1; git rev-list --max-count=1 $head1)

test_expect_success 'added submodule' "
git add sm1 &&
@ -43,6 +44,33 @@ EOF @@ -43,6 +44,33 @@ EOF
test_cmp expected actual
"

test_expect_success 'added submodule, set diff.submodule' "
git config diff.submodule log &&
git add sm1 &&
git diff --cached >actual &&
cat >expected <<-EOF &&
Submodule sm1 0000000...$head1 (new submodule)
EOF
git config --unset diff.submodule &&
test_cmp expected actual
"

test_expect_success '--submodule=short overrides diff.submodule' "
test_config diff.submodule log &&
git add sm1 &&
git diff --submodule=short --cached >actual &&
cat >expected <<-EOF &&
diff --git a/sm1 b/sm1
new file mode 160000
index 0000000..a2c4dab
--- /dev/null
+++ b/sm1
@@ -0,0 +1 @@
+Subproject commit $fullhead1
EOF
test_cmp expected actual
"

commit_file sm1 &&
head2=$(add_file sm1 foo3)

@ -73,7 +101,6 @@ EOF @@ -73,7 +101,6 @@ EOF
test_cmp expected actual
"

fullhead1=$(cd sm1; git rev-list --max-count=1 $head1)
fullhead2=$(cd sm1; git rev-list --max-count=1 $head2)
test_expect_success 'modified submodule(forward) --submodule=short' "
git diff --submodule=short >actual &&

Loading…
Cancel
Save