Merge branch 'jl/status-ignore-submodules'
* jl/status-ignore-submodules: Add the option "--ignore-submodules" to "git status" git submodule: ignore dirty submodules for summary and status Conflicts: builtin/commit.c t/t7508-status.sh wt-status.c wt-status.h
This commit is contained in:
commit
a76b2084fb
@ -53,6 +53,17 @@ See linkgit:git-config[1] for configuration variable
|
|||||||
used to change the default for when the option is not
|
used to change the default for when the option is not
|
||||||
specified.
|
specified.
|
||||||
|
|
||||||
|
--ignore-submodules[=<when>]::
|
||||||
|
Ignore changes to submodules when looking for changes. <when> can be
|
||||||
|
either "untracked", "dirty" or "all", which is the default. When
|
||||||
|
"untracked" is used submodules are not considered dirty when they only
|
||||||
|
contain untracked content (but they are still scanned for modified
|
||||||
|
content). Using "dirty" ignores all changes to the work tree of submodules,
|
||||||
|
only changes to the commits stored in the superproject are shown (this was
|
||||||
|
the behavior before 1.7.0). Using "all" hides all changes to submodules
|
||||||
|
(and suppresses the output of submodule summaries when the config option
|
||||||
|
`status.submodulesummary` is set).
|
||||||
|
|
||||||
-z::
|
-z::
|
||||||
Terminate entries with NUL, instead of LF. This implies
|
Terminate entries with NUL, instead of LF. This implies
|
||||||
the `--porcelain` output format if no other format is given.
|
the `--porcelain` output format if no other format is given.
|
||||||
|
@ -72,7 +72,7 @@ static char *author_name, *author_email, *author_date;
|
|||||||
static int all, edit_flag, also, interactive, only, amend, signoff;
|
static int all, edit_flag, also, interactive, only, amend, signoff;
|
||||||
static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
|
static int quiet, verbose, no_verify, allow_empty, dry_run, renew_authorship;
|
||||||
static int no_post_rewrite, allow_empty_message;
|
static int no_post_rewrite, allow_empty_message;
|
||||||
static char *untracked_files_arg, *force_date;
|
static char *untracked_files_arg, *force_date, *ignore_submodule_arg;
|
||||||
/*
|
/*
|
||||||
* The default commit message cleanup mode will remove the lines
|
* The default commit message cleanup mode will remove the lines
|
||||||
* beginning with # (shell comments) and leading and trailing
|
* beginning with # (shell comments) and leading and trailing
|
||||||
@ -1059,6 +1059,9 @@ int cmd_status(int argc, const char **argv, const char *prefix)
|
|||||||
PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
|
PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
|
||||||
OPT_BOOLEAN(0, "ignored", &show_ignored_in_status,
|
OPT_BOOLEAN(0, "ignored", &show_ignored_in_status,
|
||||||
"show ignored files"),
|
"show ignored files"),
|
||||||
|
{ OPTION_STRING, 0, "ignore-submodules", &ignore_submodule_arg, "when",
|
||||||
|
"ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)",
|
||||||
|
PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
|
||||||
OPT_END(),
|
OPT_END(),
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1089,6 +1092,7 @@ int cmd_status(int argc, const char **argv, const char *prefix)
|
|||||||
|
|
||||||
s.is_initial = get_sha1(s.reference, sha1) ? 1 : 0;
|
s.is_initial = get_sha1(s.reference, sha1) ? 1 : 0;
|
||||||
s.in_merge = in_merge;
|
s.in_merge = in_merge;
|
||||||
|
s.ignore_submodule_arg = ignore_submodule_arg;
|
||||||
wt_status_collect(&s);
|
wt_status_collect(&s);
|
||||||
|
|
||||||
if (s.relative_paths)
|
if (s.relative_paths)
|
||||||
@ -1107,6 +1111,7 @@ int cmd_status(int argc, const char **argv, const char *prefix)
|
|||||||
break;
|
break;
|
||||||
case STATUS_FORMAT_LONG:
|
case STATUS_FORMAT_LONG:
|
||||||
s.verbose = verbose;
|
s.verbose = verbose;
|
||||||
|
s.ignore_submodule_arg = ignore_submodule_arg;
|
||||||
wt_status_print(&s);
|
wt_status_print(&s);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
15
diff.c
15
diff.c
@ -3168,17 +3168,10 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac)
|
|||||||
else if (!strcmp(arg, "--no-textconv"))
|
else if (!strcmp(arg, "--no-textconv"))
|
||||||
DIFF_OPT_CLR(options, ALLOW_TEXTCONV);
|
DIFF_OPT_CLR(options, ALLOW_TEXTCONV);
|
||||||
else if (!strcmp(arg, "--ignore-submodules"))
|
else if (!strcmp(arg, "--ignore-submodules"))
|
||||||
DIFF_OPT_SET(options, IGNORE_SUBMODULES);
|
handle_ignore_submodules_arg(options, "all");
|
||||||
else if (!prefixcmp(arg, "--ignore-submodules=")) {
|
else if (!prefixcmp(arg, "--ignore-submodules="))
|
||||||
if (!strcmp(arg + 20, "all"))
|
handle_ignore_submodules_arg(options, arg + 20);
|
||||||
DIFF_OPT_SET(options, IGNORE_SUBMODULES);
|
else if (!strcmp(arg, "--submodule"))
|
||||||
else if (!strcmp(arg + 20, "untracked"))
|
|
||||||
DIFF_OPT_SET(options, IGNORE_UNTRACKED_IN_SUBMODULES);
|
|
||||||
else if (!strcmp(arg + 20, "dirty"))
|
|
||||||
DIFF_OPT_SET(options, IGNORE_DIRTY_SUBMODULES);
|
|
||||||
else
|
|
||||||
die("bad --ignore-submodules argument: %s", arg + 20);
|
|
||||||
} else if (!strcmp(arg, "--submodule"))
|
|
||||||
DIFF_OPT_SET(options, SUBMODULE_LOG);
|
DIFF_OPT_SET(options, SUBMODULE_LOG);
|
||||||
else if (!prefixcmp(arg, "--submodule=")) {
|
else if (!prefixcmp(arg, "--submodule=")) {
|
||||||
if (!strcmp(arg + 12, "log"))
|
if (!strcmp(arg + 12, "log"))
|
||||||
|
@ -580,7 +580,7 @@ cmd_summary() {
|
|||||||
|
|
||||||
cd_to_toplevel
|
cd_to_toplevel
|
||||||
# Get modified modules cared by user
|
# Get modified modules cared by user
|
||||||
modules=$(git $diff_cmd $cached --raw $head -- "$@" |
|
modules=$(git $diff_cmd $cached --ignore-submodules=dirty --raw $head -- "$@" |
|
||||||
sane_egrep '^:([0-7]* )?160000' |
|
sane_egrep '^:([0-7]* )?160000' |
|
||||||
while read mod_src mod_dst sha1_src sha1_dst status name
|
while read mod_src mod_dst sha1_src sha1_dst status name
|
||||||
do
|
do
|
||||||
@ -594,7 +594,7 @@ cmd_summary() {
|
|||||||
|
|
||||||
test -z "$modules" && return
|
test -z "$modules" && return
|
||||||
|
|
||||||
git $diff_cmd $cached --raw $head -- $modules |
|
git $diff_cmd $cached --ignore-submodules=dirty --raw $head -- $modules |
|
||||||
sane_egrep '^:([0-7]* )?160000' |
|
sane_egrep '^:([0-7]* )?160000' |
|
||||||
cut -c2- |
|
cut -c2- |
|
||||||
while read mod_src mod_dst sha1_src sha1_dst status name
|
while read mod_src mod_dst sha1_src sha1_dst status name
|
||||||
@ -760,7 +760,7 @@ cmd_status()
|
|||||||
continue;
|
continue;
|
||||||
fi
|
fi
|
||||||
set_name_rev "$path" "$sha1"
|
set_name_rev "$path" "$sha1"
|
||||||
if git diff-files --quiet -- "$path"
|
if git diff-files --ignore-submodules=dirty --quiet -- "$path"
|
||||||
then
|
then
|
||||||
say " $sha1 $displaypath$revname"
|
say " $sha1 $displaypath$revname"
|
||||||
else
|
else
|
||||||
|
13
submodule.c
13
submodule.c
@ -46,6 +46,19 @@ done:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void handle_ignore_submodules_arg(struct diff_options *diffopt,
|
||||||
|
const char *arg)
|
||||||
|
{
|
||||||
|
if (!strcmp(arg, "all"))
|
||||||
|
DIFF_OPT_SET(diffopt, IGNORE_SUBMODULES);
|
||||||
|
else if (!strcmp(arg, "untracked"))
|
||||||
|
DIFF_OPT_SET(diffopt, IGNORE_UNTRACKED_IN_SUBMODULES);
|
||||||
|
else if (!strcmp(arg, "dirty"))
|
||||||
|
DIFF_OPT_SET(diffopt, IGNORE_DIRTY_SUBMODULES);
|
||||||
|
else
|
||||||
|
die("bad --ignore-submodules argument: %s", arg);
|
||||||
|
}
|
||||||
|
|
||||||
void show_submodule_summary(FILE *f, const char *path,
|
void show_submodule_summary(FILE *f, const char *path,
|
||||||
unsigned char one[20], unsigned char two[20],
|
unsigned char one[20], unsigned char two[20],
|
||||||
unsigned dirty_submodule,
|
unsigned dirty_submodule,
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
#ifndef SUBMODULE_H
|
#ifndef SUBMODULE_H
|
||||||
#define SUBMODULE_H
|
#define SUBMODULE_H
|
||||||
|
|
||||||
|
struct diff_options;
|
||||||
|
|
||||||
|
void handle_ignore_submodules_arg(struct diff_options *diffopt, const char *);
|
||||||
void show_submodule_summary(FILE *f, const char *path,
|
void show_submodule_summary(FILE *f, const char *path,
|
||||||
unsigned char one[20], unsigned char two[20],
|
unsigned char one[20], unsigned char two[20],
|
||||||
unsigned dirty_submodule,
|
unsigned dirty_submodule,
|
||||||
|
@ -808,4 +808,131 @@ test_expect_success POSIXPERM 'status succeeds in a read-only repository' '
|
|||||||
(exit $status)
|
(exit $status)
|
||||||
'
|
'
|
||||||
|
|
||||||
|
cat > expect << EOF
|
||||||
|
# On branch master
|
||||||
|
# Changed but not updated:
|
||||||
|
# (use "git add <file>..." to update what will be committed)
|
||||||
|
# (use "git checkout -- <file>..." to discard changes in working directory)
|
||||||
|
#
|
||||||
|
# modified: dir1/modified
|
||||||
|
#
|
||||||
|
# Untracked files:
|
||||||
|
# (use "git add <file>..." to include in what will be committed)
|
||||||
|
#
|
||||||
|
# dir1/untracked
|
||||||
|
# dir2/modified
|
||||||
|
# dir2/untracked
|
||||||
|
# expect
|
||||||
|
# output
|
||||||
|
# untracked
|
||||||
|
no changes added to commit (use "git add" and/or "git commit -a")
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_expect_success '--ignore-submodules=untracked suppresses submodules with untracked content' '
|
||||||
|
echo modified > sm/untracked &&
|
||||||
|
git status --ignore-submodules=untracked > output &&
|
||||||
|
test_cmp expect output
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success '--ignore-submodules=dirty suppresses submodules with untracked content' '
|
||||||
|
git status --ignore-submodules=dirty > output &&
|
||||||
|
test_cmp expect output
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success '--ignore-submodules=dirty suppresses submodules with modified content' '
|
||||||
|
echo modified > sm/foo &&
|
||||||
|
git status --ignore-submodules=dirty > output &&
|
||||||
|
test_cmp expect output
|
||||||
|
'
|
||||||
|
|
||||||
|
cat > expect << EOF
|
||||||
|
# On branch master
|
||||||
|
# Changed but not updated:
|
||||||
|
# (use "git add <file>..." to update what will be committed)
|
||||||
|
# (use "git checkout -- <file>..." to discard changes in working directory)
|
||||||
|
# (commit or discard the untracked or modified content in submodules)
|
||||||
|
#
|
||||||
|
# modified: dir1/modified
|
||||||
|
# modified: sm (modified content)
|
||||||
|
#
|
||||||
|
# Untracked files:
|
||||||
|
# (use "git add <file>..." to include in what will be committed)
|
||||||
|
#
|
||||||
|
# dir1/untracked
|
||||||
|
# dir2/modified
|
||||||
|
# dir2/untracked
|
||||||
|
# expect
|
||||||
|
# output
|
||||||
|
# untracked
|
||||||
|
no changes added to commit (use "git add" and/or "git commit -a")
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_expect_success "--ignore-submodules=untracked doesn't suppress submodules with modified content" '
|
||||||
|
git status --ignore-submodules=untracked > output &&
|
||||||
|
test_cmp expect output
|
||||||
|
'
|
||||||
|
|
||||||
|
head2=$(cd sm && git commit -q -m "2nd commit" foo && git rev-parse --short=7 --verify HEAD)
|
||||||
|
|
||||||
|
cat > expect << EOF
|
||||||
|
# On branch master
|
||||||
|
# Changed but not updated:
|
||||||
|
# (use "git add <file>..." to update what will be committed)
|
||||||
|
# (use "git checkout -- <file>..." to discard changes in working directory)
|
||||||
|
#
|
||||||
|
# modified: dir1/modified
|
||||||
|
# modified: sm (new commits)
|
||||||
|
#
|
||||||
|
# Submodules changed but not updated:
|
||||||
|
#
|
||||||
|
# * sm $head...$head2 (1):
|
||||||
|
# > 2nd commit
|
||||||
|
#
|
||||||
|
# Untracked files:
|
||||||
|
# (use "git add <file>..." to include in what will be committed)
|
||||||
|
#
|
||||||
|
# dir1/untracked
|
||||||
|
# dir2/modified
|
||||||
|
# dir2/untracked
|
||||||
|
# expect
|
||||||
|
# output
|
||||||
|
# untracked
|
||||||
|
no changes added to commit (use "git add" and/or "git commit -a")
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_expect_success "--ignore-submodules=untracked doesn't suppress submodule summary" '
|
||||||
|
git status --ignore-submodules=untracked > output &&
|
||||||
|
test_cmp expect output
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success "--ignore-submodules=dirty doesn't suppress submodule summary" '
|
||||||
|
git status --ignore-submodules=dirty > output &&
|
||||||
|
test_cmp expect output
|
||||||
|
'
|
||||||
|
|
||||||
|
cat > expect << EOF
|
||||||
|
# On branch master
|
||||||
|
# Changed but not updated:
|
||||||
|
# (use "git add <file>..." to update what will be committed)
|
||||||
|
# (use "git checkout -- <file>..." to discard changes in working directory)
|
||||||
|
#
|
||||||
|
# modified: dir1/modified
|
||||||
|
#
|
||||||
|
# Untracked files:
|
||||||
|
# (use "git add <file>..." to include in what will be committed)
|
||||||
|
#
|
||||||
|
# dir1/untracked
|
||||||
|
# dir2/modified
|
||||||
|
# dir2/untracked
|
||||||
|
# expect
|
||||||
|
# output
|
||||||
|
# untracked
|
||||||
|
no changes added to commit (use "git add" and/or "git commit -a")
|
||||||
|
EOF
|
||||||
|
|
||||||
|
test_expect_success "--ignore-submodules=all suppresses submodule summary" '
|
||||||
|
git status --ignore-submodules=all > output &&
|
||||||
|
test_cmp expect output
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
10
wt-status.c
10
wt-status.c
@ -10,6 +10,7 @@
|
|||||||
#include "run-command.h"
|
#include "run-command.h"
|
||||||
#include "remote.h"
|
#include "remote.h"
|
||||||
#include "refs.h"
|
#include "refs.h"
|
||||||
|
#include "submodule.h"
|
||||||
|
|
||||||
static char default_wt_status_colors[][COLOR_MAXLEN] = {
|
static char default_wt_status_colors[][COLOR_MAXLEN] = {
|
||||||
GIT_COLOR_NORMAL, /* WT_STATUS_HEADER */
|
GIT_COLOR_NORMAL, /* WT_STATUS_HEADER */
|
||||||
@ -312,6 +313,8 @@ static void wt_status_collect_changes_worktree(struct wt_status *s)
|
|||||||
DIFF_OPT_SET(&rev.diffopt, DIRTY_SUBMODULES);
|
DIFF_OPT_SET(&rev.diffopt, DIRTY_SUBMODULES);
|
||||||
if (!s->show_untracked_files)
|
if (!s->show_untracked_files)
|
||||||
DIFF_OPT_SET(&rev.diffopt, IGNORE_UNTRACKED_IN_SUBMODULES);
|
DIFF_OPT_SET(&rev.diffopt, IGNORE_UNTRACKED_IN_SUBMODULES);
|
||||||
|
if (s->ignore_submodule_arg)
|
||||||
|
handle_ignore_submodules_arg(&rev.diffopt, s->ignore_submodule_arg);
|
||||||
rev.diffopt.format_callback = wt_status_collect_changed_cb;
|
rev.diffopt.format_callback = wt_status_collect_changed_cb;
|
||||||
rev.diffopt.format_callback_data = s;
|
rev.diffopt.format_callback_data = s;
|
||||||
rev.prune_data = s->pathspec;
|
rev.prune_data = s->pathspec;
|
||||||
@ -328,6 +331,9 @@ static void wt_status_collect_changes_index(struct wt_status *s)
|
|||||||
opt.def = s->is_initial ? EMPTY_TREE_SHA1_HEX : s->reference;
|
opt.def = s->is_initial ? EMPTY_TREE_SHA1_HEX : s->reference;
|
||||||
setup_revisions(0, NULL, &rev, &opt);
|
setup_revisions(0, NULL, &rev, &opt);
|
||||||
|
|
||||||
|
if (s->ignore_submodule_arg)
|
||||||
|
handle_ignore_submodules_arg(&rev.diffopt, s->ignore_submodule_arg);
|
||||||
|
|
||||||
rev.diffopt.output_format |= DIFF_FORMAT_CALLBACK;
|
rev.diffopt.output_format |= DIFF_FORMAT_CALLBACK;
|
||||||
rev.diffopt.format_callback = wt_status_collect_updated_cb;
|
rev.diffopt.format_callback = wt_status_collect_updated_cb;
|
||||||
rev.diffopt.format_callback_data = s;
|
rev.diffopt.format_callback_data = s;
|
||||||
@ -646,7 +652,9 @@ void wt_status_print(struct wt_status *s)
|
|||||||
wt_status_print_updated(s);
|
wt_status_print_updated(s);
|
||||||
wt_status_print_unmerged(s);
|
wt_status_print_unmerged(s);
|
||||||
wt_status_print_changed(s);
|
wt_status_print_changed(s);
|
||||||
if (s->submodule_summary) {
|
if (s->submodule_summary &&
|
||||||
|
(!s->ignore_submodule_arg ||
|
||||||
|
strcmp(s->ignore_submodule_arg, "all"))) {
|
||||||
wt_status_print_submodule_summary(s, 0); /* staged */
|
wt_status_print_submodule_summary(s, 0); /* staged */
|
||||||
wt_status_print_submodule_summary(s, 1); /* unstaged */
|
wt_status_print_submodule_summary(s, 1); /* unstaged */
|
||||||
}
|
}
|
||||||
|
@ -45,6 +45,7 @@ struct wt_status {
|
|||||||
int submodule_summary;
|
int submodule_summary;
|
||||||
int show_ignored_files;
|
int show_ignored_files;
|
||||||
enum untracked_status_type show_untracked_files;
|
enum untracked_status_type show_untracked_files;
|
||||||
|
const char *ignore_submodule_arg;
|
||||||
char color_palette[WT_STATUS_REMOTE_BRANCH+1][COLOR_MAXLEN];
|
char color_palette[WT_STATUS_REMOTE_BRANCH+1][COLOR_MAXLEN];
|
||||||
|
|
||||||
/* These are computed during processing of the individual sections */
|
/* These are computed during processing of the individual sections */
|
||||||
|
Loading…
Reference in New Issue
Block a user