Re: [PATCH 0/5] "status --ignored"
On Sat, Apr 10, 2010 at 12:40:51AM -0700, Junio C Hamano wrote:
> > It wouldn't be too hard to add them in, and would look something like
> > the patch below.
>
> As I didn't see a patch, I did a rough outline just for fun.
Gah. Yours is undoubtedly less ugly, but here was mine for reference.
diff --git a/dir.c b/dir.c
index cb83332..deee7c8 100644
--- a/dir.c
+++ b/dir.c
@@ -619,7 +619,9 @@ static int exclude_matches_pathspec(const char *path, int len,
return 1;
}
}
- return 0;
+ /* ugh, I think this may be a long-standing bug, but
+ * this code was never reachable before. */
+ return 1;
}
static int get_index_dtype(const char *path, int len)
diff --git a/wt-status.c b/wt-status.c
index 8ca59a2..53a7a5a 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -366,6 +366,8 @@ static void wt_status_collect_untracked(struct wt_status *s)
if (!s->show_untracked_files)
return;
memset(&dir, 0, sizeof(dir));
+ /* should be conditional on s->show_ignored_files */
+ dir.flags |= DIR_COLLECT_IGNORED;
if (s->show_untracked_files != SHOW_ALL_UNTRACKED_FILES)
dir.flags |=
DIR_SHOW_OTHER_DIRECTORIES | DIR_HIDE_EMPTY_DIRECTORIES;
@@ -381,6 +383,14 @@ static void wt_status_collect_untracked(struct wt_status *s)
s->workdir_untracked = 1;
string_list_insert(ent->name, &s->untracked);
}
+ for (i = 0; i < dir.ignored_nr; i++) {
+ struct dir_entry *ent = dir.ignored[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);
+ }
}
void wt_status_collect(struct wt_status *s)
@@ -707,15 +717,15 @@ 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,
- struct wt_status *s)
+ struct wt_status *s, const char *marker)
{
if (null_termination) {
- fprintf(stdout, "?? %s%c", it->string, 0);
+ fprintf(stdout, "%s %s%c", marker, it->string, 0);
} else {
struct strbuf onebuf = STRBUF_INIT;
const char *one;
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), marker);
printf(" %s\n", one);
strbuf_release(&onebuf);
}
@@ -739,7 +749,11 @@ void wt_shortstatus_print(struct wt_status *s, int null_termination)
struct string_list_item *it;
it = &(s->untracked.items[i]);
- wt_shortstatus_untracked(null_termination, it, s);
+ wt_shortstatus_untracked(null_termination, it, s, "??");
+ }
+ for (i = 0; i < s->ignored.nr; i++) {
+ struct string_list_item *it = &(s->ignored.items[i]);
+ wt_shortstatus_untracked(null_termination, it, s, "II");
}
}
diff --git a/wt-status.h b/wt-status.h
index 9120673..0f5cf38 100644
--- a/wt-status.h
+++ b/wt-status.h
@@ -53,6 +53,7 @@ struct wt_status {
const char *prefix;
struct string_list change;
struct string_list untracked;
+ struct string_list ignored;
};
void wt_status_prepare(struct wt_status *s);