Merge branch 'rr/submodule-diff-config'
Allow "git diff --submodule=log" to set to be the default via configuration. * rr/submodule-diff-config: submodule: display summary header in bold diff: rename "set" variable diff: introduce diff.submodule configuration variable Documentation: move diff.wordRegex from config.txt to diff-config.txt
This commit is contained in:
commit
be95387af2
@ -962,12 +962,6 @@ difftool.<tool>.cmd::
|
||||
difftool.prompt::
|
||||
Prompt before each invocation of the diff tool.
|
||||
|
||||
diff.wordRegex::
|
||||
A POSIX Extended Regular Expression used to determine what is a "word"
|
||||
when performing word-by-word difference calculations. Character
|
||||
sequences that match the regular expression are "words", all other
|
||||
characters are *ignorable* whitespace.
|
||||
|
||||
fetch.recurseSubmodules::
|
||||
This option can be either set to a boolean value or to 'on-demand'.
|
||||
Setting it to a boolean changes the behavior of fetch and pull to
|
||||
|
@ -107,6 +107,19 @@ 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
|
||||
sequences that match the regular expression are "words", all other
|
||||
characters are *ignorable* whitespace.
|
||||
|
||||
diff.<driver>.command::
|
||||
The custom diff driver command. See linkgit:gitattributes[5]
|
||||
for details.
|
||||
|
@ -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.
|
||||
|
46
diff.c
46
diff.c
@ -123,6 +123,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)
|
||||
@ -178,6 +189,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;
|
||||
|
||||
@ -2223,7 +2241,7 @@ static void builtin_diff(const char *name_a,
|
||||
mmfile_t mf1, mf2;
|
||||
const char *lbl[2];
|
||||
char *a_one, *b_two;
|
||||
const char *set = diff_get_color_opt(o, DIFF_METAINFO);
|
||||
const char *meta = diff_get_color_opt(o, DIFF_METAINFO);
|
||||
const char *reset = diff_get_color_opt(o, DIFF_RESET);
|
||||
const char *a_prefix, *b_prefix;
|
||||
struct userdiff_driver *textconv_one = NULL;
|
||||
@ -2244,7 +2262,7 @@ static void builtin_diff(const char *name_a,
|
||||
const char *add = diff_get_color_opt(o, DIFF_FILE_NEW);
|
||||
show_submodule_summary(o->file, one ? one->path : two->path,
|
||||
one->sha1, two->sha1, two->dirty_submodule,
|
||||
del, add, reset);
|
||||
meta, del, add, reset);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2270,24 +2288,24 @@ static void builtin_diff(const char *name_a,
|
||||
b_two = quote_two(b_prefix, name_b + (*name_b == '/'));
|
||||
lbl[0] = DIFF_FILE_VALID(one) ? a_one : "/dev/null";
|
||||
lbl[1] = DIFF_FILE_VALID(two) ? b_two : "/dev/null";
|
||||
strbuf_addf(&header, "%s%sdiff --git %s %s%s\n", line_prefix, set, a_one, b_two, reset);
|
||||
strbuf_addf(&header, "%s%sdiff --git %s %s%s\n", line_prefix, meta, a_one, b_two, reset);
|
||||
if (lbl[0][0] == '/') {
|
||||
/* /dev/null */
|
||||
strbuf_addf(&header, "%s%snew file mode %06o%s\n", line_prefix, set, two->mode, reset);
|
||||
strbuf_addf(&header, "%s%snew file mode %06o%s\n", line_prefix, meta, two->mode, reset);
|
||||
if (xfrm_msg)
|
||||
strbuf_addstr(&header, xfrm_msg);
|
||||
must_show_header = 1;
|
||||
}
|
||||
else if (lbl[1][0] == '/') {
|
||||
strbuf_addf(&header, "%s%sdeleted file mode %06o%s\n", line_prefix, set, one->mode, reset);
|
||||
strbuf_addf(&header, "%s%sdeleted file mode %06o%s\n", line_prefix, meta, one->mode, reset);
|
||||
if (xfrm_msg)
|
||||
strbuf_addstr(&header, xfrm_msg);
|
||||
must_show_header = 1;
|
||||
}
|
||||
else {
|
||||
if (one->mode != two->mode) {
|
||||
strbuf_addf(&header, "%s%sold mode %06o%s\n", line_prefix, set, one->mode, reset);
|
||||
strbuf_addf(&header, "%s%snew mode %06o%s\n", line_prefix, set, two->mode, reset);
|
||||
strbuf_addf(&header, "%s%sold mode %06o%s\n", line_prefix, meta, one->mode, reset);
|
||||
strbuf_addf(&header, "%s%snew mode %06o%s\n", line_prefix, meta, two->mode, reset);
|
||||
must_show_header = 1;
|
||||
}
|
||||
if (xfrm_msg)
|
||||
@ -3480,6 +3498,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];
|
||||
@ -3660,10 +3686,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"))
|
||||
|
@ -258,7 +258,7 @@ int parse_fetch_recurse_submodules_arg(const char *opt, const char *arg)
|
||||
|
||||
void show_submodule_summary(FILE *f, const char *path,
|
||||
unsigned char one[20], unsigned char two[20],
|
||||
unsigned dirty_submodule,
|
||||
unsigned dirty_submodule, const char *meta,
|
||||
const char *del, const char *add, const char *reset)
|
||||
{
|
||||
struct rev_info rev;
|
||||
@ -292,15 +292,15 @@ void show_submodule_summary(FILE *f, const char *path,
|
||||
return;
|
||||
}
|
||||
|
||||
strbuf_addf(&sb, "Submodule %s %s..", path,
|
||||
strbuf_addf(&sb, "%sSubmodule %s %s..", meta, path,
|
||||
find_unique_abbrev(one, DEFAULT_ABBREV));
|
||||
if (!fast_backward && !fast_forward)
|
||||
strbuf_addch(&sb, '.');
|
||||
strbuf_addf(&sb, "%s", find_unique_abbrev(two, DEFAULT_ABBREV));
|
||||
if (message)
|
||||
strbuf_addf(&sb, " %s\n", message);
|
||||
strbuf_addf(&sb, " %s%s\n", message, reset);
|
||||
else
|
||||
strbuf_addf(&sb, "%s:\n", fast_backward ? " (rewind)" : "");
|
||||
strbuf_addf(&sb, "%s:%s\n", fast_backward ? " (rewind)" : "", reset);
|
||||
fwrite(sb.buf, sb.len, 1, f);
|
||||
|
||||
if (!message) {
|
||||
|
@ -20,7 +20,7 @@ void handle_ignore_submodules_arg(struct diff_options *diffopt, const char *);
|
||||
int parse_fetch_recurse_submodules_arg(const char *opt, const char *arg);
|
||||
void show_submodule_summary(FILE *f, const char *path,
|
||||
unsigned char one[20], unsigned char two[20],
|
||||
unsigned dirty_submodule,
|
||||
unsigned dirty_submodule, const char *meta,
|
||||
const char *del, const char *add, const char *reset);
|
||||
void set_config_fetch_recurse_submodules(int value);
|
||||
void check_for_new_submodule_commits(unsigned char new_sha1[20]);
|
||||
|
@ -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,48 @@ 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
|
||||
"
|
||||
|
||||
test_expect_success 'diff.submodule does not affect plumbing' '
|
||||
test_config diff.submodule log &&
|
||||
git diff-index -p HEAD >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 +116,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…
Reference in New Issue
Block a user