Merge branch 'jc/status-show-ignored'
* jc/status-show-ignored: wt-status: fix 'fprintf' compilation warning status: --ignored option shows ignored files wt-status: rename and restructure status-print-untracked wt-status: collect ignored files wt-status: plug memory leak while collecting untracked files wt-status: remove unused workdir_untracked member
This commit is contained in:
@ -83,6 +83,7 @@ static enum {
|
|||||||
static char *cleanup_arg;
|
static char *cleanup_arg;
|
||||||
|
|
||||||
static int use_editor = 1, initial_commit, in_merge, include_status = 1;
|
static int use_editor = 1, initial_commit, in_merge, include_status = 1;
|
||||||
|
static int show_ignored_in_status;
|
||||||
static const char *only_include_assumed;
|
static const char *only_include_assumed;
|
||||||
static struct strbuf message;
|
static struct strbuf message;
|
||||||
|
|
||||||
@ -1038,6 +1039,8 @@ int cmd_status(int argc, const char **argv, const char *prefix)
|
|||||||
"mode",
|
"mode",
|
||||||
"show untracked files, optional modes: all, normal, no. (Default: all)",
|
"show untracked files, optional modes: all, normal, no. (Default: all)",
|
||||||
PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
|
PARSE_OPT_OPTARG, NULL, (intptr_t)"all" },
|
||||||
|
OPT_BOOLEAN(0, "ignored", &show_ignored_in_status,
|
||||||
|
"show ignored files"),
|
||||||
OPT_END(),
|
OPT_END(),
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1051,7 +1054,8 @@ int cmd_status(int argc, const char **argv, const char *prefix)
|
|||||||
builtin_status_options,
|
builtin_status_options,
|
||||||
builtin_status_usage, 0);
|
builtin_status_usage, 0);
|
||||||
handle_untracked_files_arg(&s);
|
handle_untracked_files_arg(&s);
|
||||||
|
if (show_ignored_in_status)
|
||||||
|
s.show_ignored_files = 1;
|
||||||
if (*argv)
|
if (*argv)
|
||||||
s.pathspec = get_pathspec(prefix, argv);
|
s.pathspec = get_pathspec(prefix, argv);
|
||||||
|
|
||||||
|
64
wt-status.c
64
wt-status.c
@ -42,6 +42,7 @@ void wt_status_prepare(struct wt_status *s)
|
|||||||
s->index_file = get_index_file();
|
s->index_file = get_index_file();
|
||||||
s->change.strdup_strings = 1;
|
s->change.strdup_strings = 1;
|
||||||
s->untracked.strdup_strings = 1;
|
s->untracked.strdup_strings = 1;
|
||||||
|
s->ignored.strdup_strings = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wt_status_print_unmerged_header(struct wt_status *s)
|
static void wt_status_print_unmerged_header(struct wt_status *s)
|
||||||
@ -96,13 +97,15 @@ static void wt_status_print_dirty_header(struct wt_status *s,
|
|||||||
color_fprintf_ln(s->fp, c, "#");
|
color_fprintf_ln(s->fp, c, "#");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wt_status_print_untracked_header(struct wt_status *s)
|
static void wt_status_print_other_header(struct wt_status *s,
|
||||||
|
const char *what,
|
||||||
|
const char *how)
|
||||||
{
|
{
|
||||||
const char *c = color(WT_STATUS_HEADER, s);
|
const char *c = color(WT_STATUS_HEADER, s);
|
||||||
color_fprintf_ln(s->fp, c, "# Untracked files:");
|
color_fprintf_ln(s->fp, c, "# %s files:", what);
|
||||||
if (!advice_status_hints)
|
if (!advice_status_hints)
|
||||||
return;
|
return;
|
||||||
color_fprintf_ln(s->fp, c, "# (use \"git add <file>...\" to include in what will be committed)");
|
color_fprintf_ln(s->fp, c, "# (use \"git %s <file>...\" to include in what will be committed)", how);
|
||||||
color_fprintf_ln(s->fp, c, "#");
|
color_fprintf_ln(s->fp, c, "#");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -378,9 +381,26 @@ static void wt_status_collect_untracked(struct wt_status *s)
|
|||||||
continue;
|
continue;
|
||||||
if (!match_pathspec(s->pathspec, ent->name, ent->len, 0, NULL))
|
if (!match_pathspec(s->pathspec, ent->name, ent->len, 0, NULL))
|
||||||
continue;
|
continue;
|
||||||
s->workdir_untracked = 1;
|
|
||||||
string_list_insert(ent->name, &s->untracked);
|
string_list_insert(ent->name, &s->untracked);
|
||||||
|
free(ent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (s->show_ignored_files) {
|
||||||
|
dir.nr = 0;
|
||||||
|
dir.flags = DIR_SHOW_IGNORED | DIR_SHOW_OTHER_DIRECTORIES;
|
||||||
|
fill_directory(&dir, s->pathspec);
|
||||||
|
for (i = 0; i < dir.nr; i++) {
|
||||||
|
struct dir_entry *ent = dir.entries[i];
|
||||||
|
if (!cache_name_is_other(ent->name, ent->len))
|
||||||
|
continue;
|
||||||
|
if (!match_pathspec(s->pathspec, ent->name, ent->len, 0, NULL))
|
||||||
|
continue;
|
||||||
|
string_list_insert(ent->name, &s->ignored);
|
||||||
|
free(ent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(dir.entries);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wt_status_collect(struct wt_status *s)
|
void wt_status_collect(struct wt_status *s)
|
||||||
@ -523,7 +543,10 @@ static void wt_status_print_submodule_summary(struct wt_status *s, int uncommitt
|
|||||||
run_command(&sm_summary);
|
run_command(&sm_summary);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wt_status_print_untracked(struct wt_status *s)
|
static void wt_status_print_other(struct wt_status *s,
|
||||||
|
struct string_list *l,
|
||||||
|
const char *what,
|
||||||
|
const char *how)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
struct strbuf buf = STRBUF_INIT;
|
struct strbuf buf = STRBUF_INIT;
|
||||||
@ -531,10 +554,11 @@ static void wt_status_print_untracked(struct wt_status *s)
|
|||||||
if (!s->untracked.nr)
|
if (!s->untracked.nr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
wt_status_print_untracked_header(s);
|
wt_status_print_other_header(s, what, how);
|
||||||
for (i = 0; i < s->untracked.nr; i++) {
|
|
||||||
|
for (i = 0; i < l->nr; i++) {
|
||||||
struct string_list_item *it;
|
struct string_list_item *it;
|
||||||
it = &(s->untracked.items[i]);
|
it = &(l->items[i]);
|
||||||
color_fprintf(s->fp, color(WT_STATUS_HEADER, s), "#\t");
|
color_fprintf(s->fp, color(WT_STATUS_HEADER, s), "#\t");
|
||||||
color_fprintf_ln(s->fp, color(WT_STATUS_UNTRACKED, s), "%s",
|
color_fprintf_ln(s->fp, color(WT_STATUS_UNTRACKED, s), "%s",
|
||||||
quote_path(it->string, strlen(it->string),
|
quote_path(it->string, strlen(it->string),
|
||||||
@ -622,9 +646,11 @@ void wt_status_print(struct wt_status *s)
|
|||||||
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 */
|
||||||
}
|
}
|
||||||
if (s->show_untracked_files)
|
if (s->show_untracked_files) {
|
||||||
wt_status_print_untracked(s);
|
wt_status_print_other(s, &s->untracked, "Untracked", "add");
|
||||||
else if (s->commitable)
|
if (s->show_ignored_files)
|
||||||
|
wt_status_print_other(s, &s->ignored, "Ignored", "add -f");
|
||||||
|
} else if (s->commitable)
|
||||||
fprintf(s->fp, "# Untracked files not listed (use -u option to show untracked files)\n");
|
fprintf(s->fp, "# Untracked files not listed (use -u option to show untracked files)\n");
|
||||||
|
|
||||||
if (s->verbose)
|
if (s->verbose)
|
||||||
@ -706,16 +732,16 @@ static void wt_shortstatus_status(int null_termination, struct string_list_item
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wt_shortstatus_untracked(int null_termination, struct string_list_item *it,
|
static void wt_shortstatus_other(int null_termination, struct string_list_item *it,
|
||||||
struct wt_status *s)
|
struct wt_status *s, const char *sign)
|
||||||
{
|
{
|
||||||
if (null_termination) {
|
if (null_termination) {
|
||||||
fprintf(stdout, "?? %s%c", it->string, 0);
|
fprintf(stdout, "%s %s%c", sign, it->string, 0);
|
||||||
} else {
|
} else {
|
||||||
struct strbuf onebuf = STRBUF_INIT;
|
struct strbuf onebuf = STRBUF_INIT;
|
||||||
const char *one;
|
const char *one;
|
||||||
one = quote_path(it->string, -1, &onebuf, s->prefix);
|
one = quote_path(it->string, -1, &onebuf, s->prefix);
|
||||||
color_fprintf(s->fp, color(WT_STATUS_UNTRACKED, s), "??");
|
color_fprintf(s->fp, color(WT_STATUS_UNTRACKED, s), "%s", sign);
|
||||||
printf(" %s\n", one);
|
printf(" %s\n", one);
|
||||||
strbuf_release(&onebuf);
|
strbuf_release(&onebuf);
|
||||||
}
|
}
|
||||||
@ -739,7 +765,13 @@ void wt_shortstatus_print(struct wt_status *s, int null_termination)
|
|||||||
struct string_list_item *it;
|
struct string_list_item *it;
|
||||||
|
|
||||||
it = &(s->untracked.items[i]);
|
it = &(s->untracked.items[i]);
|
||||||
wt_shortstatus_untracked(null_termination, it, s);
|
wt_shortstatus_other(null_termination, it, s, "??");
|
||||||
|
}
|
||||||
|
for (i = 0; i < s->ignored.nr; i++) {
|
||||||
|
struct string_list_item *it;
|
||||||
|
|
||||||
|
it = &(s->ignored.items[i]);
|
||||||
|
wt_shortstatus_other(null_termination, it, s, "!!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,18 +41,19 @@ struct wt_status {
|
|||||||
int use_color;
|
int use_color;
|
||||||
int relative_paths;
|
int relative_paths;
|
||||||
int submodule_summary;
|
int submodule_summary;
|
||||||
|
int show_ignored_files;
|
||||||
enum untracked_status_type show_untracked_files;
|
enum untracked_status_type show_untracked_files;
|
||||||
char color_palette[WT_STATUS_UNMERGED+1][COLOR_MAXLEN];
|
char color_palette[WT_STATUS_UNMERGED+1][COLOR_MAXLEN];
|
||||||
|
|
||||||
/* These are computed during processing of the individual sections */
|
/* These are computed during processing of the individual sections */
|
||||||
int commitable;
|
int commitable;
|
||||||
int workdir_dirty;
|
int workdir_dirty;
|
||||||
int workdir_untracked;
|
|
||||||
const char *index_file;
|
const char *index_file;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
const char *prefix;
|
const char *prefix;
|
||||||
struct string_list change;
|
struct string_list change;
|
||||||
struct string_list untracked;
|
struct string_list untracked;
|
||||||
|
struct string_list ignored;
|
||||||
};
|
};
|
||||||
|
|
||||||
void wt_status_prepare(struct wt_status *s);
|
void wt_status_prepare(struct wt_status *s);
|
||||||
|
Reference in New Issue
Block a user