/* * `untracked_files` will be filled with the names of untracked files. * The return value is: * * = 0 if there are not any untracked files * > 0 if there are untracked files */ static int get_untracked_files(struct pathspec ps, int include_untracked, struct strbuf *untracked_files) { int i; int max_len; int found = 0; char *seen; struct dir_struct dir; memset(&dir, 0, sizeof(dir)); if (include_untracked != INCLUDE_ALL_FILES) setup_standard_excludes(&dir); seen = xcalloc(ps.nr, 1); max_len = fill_directory(&dir, the_repository->index, &ps); for (i = 0; i < dir.nr; i++) { struct dir_entry *ent = dir.entries[i]; if (dir_path_match(&the_index, ent, &ps, max_len, seen)) { found++; strbuf_addstr(untracked_files, ent->name); /* NUL-terminate: will be fed to update-index -z */ strbuf_addch(untracked_files, 0); } free(ent); } free(seen); free(dir.entries); free(dir.ignored); clear_directory(&dir); return found; }
static void wt_status_collect_untracked(struct wt_status *s) { int i; struct dir_struct dir; uint64_t t_begin = getnanotime(); if (!s->show_untracked_files) return; memset(&dir, 0, sizeof(dir)); if (s->show_untracked_files != SHOW_ALL_UNTRACKED_FILES) dir.flags |= DIR_SHOW_OTHER_DIRECTORIES | DIR_HIDE_EMPTY_DIRECTORIES; if (s->show_ignored_files) dir.flags |= DIR_SHOW_IGNORED_TOO; else dir.untracked = the_index.untracked; setup_standard_excludes(&dir); 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) && dir_path_match(ent, &s->pathspec, 0, NULL)) string_list_insert(&s->untracked, ent->name); free(ent); } for (i = 0; i < dir.ignored_nr; i++) { struct dir_entry *ent = dir.ignored[i]; if (cache_name_is_other(ent->name, ent->len) && dir_path_match(ent, &s->pathspec, 0, NULL)) string_list_insert(&s->ignored, ent->name); free(ent); } free(dir.entries); free(dir.ignored); clear_directory(&dir); if (advice_status_u_option) s->untracked_in_ms = (getnanotime() - t_begin) / 1000000; }
static char *prune_directory(struct dir_struct *dir, struct pathspec *pathspec, int prefix) { char *seen; int i; struct dir_entry **src, **dst; seen = xcalloc(pathspec->nr, 1); src = dst = dir->entries; i = dir->nr; while (--i >= 0) { struct dir_entry *entry = *src++; if (dir_path_match(&the_index, entry, pathspec, prefix, seen)) *dst++ = entry; } dir->nr = dst - dir->entries; add_pathspec_matches_against_index(pathspec, &the_index, seen); return seen; }
static int grep_directory(struct grep_opt *opt, const struct pathspec *pathspec, int exc_std) { struct dir_struct dir; int i, hit = 0; memset(&dir, 0, sizeof(dir)); if (exc_std) setup_standard_excludes(&dir); fill_directory(&dir, pathspec); for (i = 0; i < dir.nr; i++) { if (!dir_path_match(dir.entries[i], pathspec, 0, NULL)) continue; hit |= grep_file(opt, dir.entries[i]->name); if (hit && opt->status_only) break; } return hit; }