From 9e58becab9d2512bad0fdf150fedbea84d6b9b03 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Fri, 5 May 2017 12:53:25 -0700 Subject: dir: convert dir_add* to take an index Signed-off-by: Brandon Williams Signed-off-by: Junio C Hamano --- dir.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'dir.h') diff --git a/dir.h b/dir.h index bf23a470af..a9f8099833 100644 --- a/dir.h +++ b/dir.h @@ -219,7 +219,9 @@ extern int read_directory(struct dir_struct *, const char *path, int len, const extern int is_excluded_from_list(const char *pathname, int pathlen, const char *basename, int *dtype, struct exclude_list *el); -struct dir_entry *dir_add_ignored(struct dir_struct *dir, const char *pathname, int len); +struct dir_entry *dir_add_ignored(struct dir_struct *dir, + struct index_state *istate, + const char *pathname, int len); /* * these implement the matching logic for dir.c:excluded_from_list and -- cgit v1.3 From fba92be8f73818c4e79dc0b93ba26733d0ba5efe Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Fri, 5 May 2017 12:53:27 -0700 Subject: dir: convert is_excluded_from_list to take an index Signed-off-by: Brandon Williams Signed-off-by: Junio C Hamano --- dir.c | 5 +++-- dir.h | 6 ++++-- unpack-trees.c | 4 ++-- 3 files changed, 9 insertions(+), 6 deletions(-) (limited to 'dir.h') diff --git a/dir.c b/dir.c index 077b756c20..497a2db85c 100644 --- a/dir.c +++ b/dir.c @@ -1010,10 +1010,11 @@ static struct exclude *last_exclude_matching_from_list(const char *pathname, */ int is_excluded_from_list(const char *pathname, int pathlen, const char *basename, int *dtype, - struct exclude_list *el) + struct exclude_list *el, struct index_state *istate) { struct exclude *exclude; - exclude = last_exclude_matching_from_list(pathname, pathlen, basename, dtype, el, &the_index); + exclude = last_exclude_matching_from_list(pathname, pathlen, basename, + dtype, el, istate); if (exclude) return exclude->flags & EXC_FLAG_NEGATIVE ? 0 : 1; return -1; /* undecided */ diff --git a/dir.h b/dir.h index a9f8099833..64254c7e74 100644 --- a/dir.h +++ b/dir.h @@ -217,8 +217,10 @@ extern int within_depth(const char *name, int namelen, int depth, int max_depth) extern int fill_directory(struct dir_struct *dir, const struct pathspec *pathspec); extern int read_directory(struct dir_struct *, const char *path, int len, const struct pathspec *pathspec); -extern int is_excluded_from_list(const char *pathname, int pathlen, const char *basename, - int *dtype, struct exclude_list *el); +extern int is_excluded_from_list(const char *pathname, int pathlen, + const char *basename, int *dtype, + struct exclude_list *el, + struct index_state *istate); struct dir_entry *dir_add_ignored(struct dir_struct *dir, struct index_state *istate, const char *pathname, int len); diff --git a/unpack-trees.c b/unpack-trees.c index aa15111fef..df9f975d01 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -1068,7 +1068,7 @@ static int clear_ce_flags_dir(struct cache_entry **cache, int nr, struct cache_entry **cache_end; int dtype = DT_DIR; int ret = is_excluded_from_list(prefix->buf, prefix->len, - basename, &dtype, el); + basename, &dtype, el, &the_index); int rc; strbuf_addch(prefix, '/'); @@ -1171,7 +1171,7 @@ static int clear_ce_flags_1(struct cache_entry **cache, int nr, /* Non-directory */ dtype = ce_to_dtype(ce); ret = is_excluded_from_list(ce->name, ce_namelen(ce), - name, &dtype, el); + name, &dtype, el, &the_index); if (ret < 0) ret = defval; if (ret > 0) -- cgit v1.3 From 473e39307d8c9db93bd08d82898e7fff7002c8cb Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Fri, 5 May 2017 12:53:28 -0700 Subject: dir: convert add_excludes to take an index Signed-off-by: Brandon Williams Signed-off-by: Junio C Hamano --- dir.c | 29 +++++++++++++++-------------- dir.h | 2 +- unpack-trees.c | 2 +- 3 files changed, 17 insertions(+), 16 deletions(-) (limited to 'dir.h') diff --git a/dir.c b/dir.c index 497a2db85c..b86d02ff94 100644 --- a/dir.c +++ b/dir.c @@ -730,7 +730,7 @@ static void invalidate_directory(struct untracked_cache *uc, /* * Given a file with name "fname", read it (either from disk, or from - * the index if "check_index" is non-zero), parse it and store the + * an index if 'istate' is non-null), parse it and store the * exclude rules in "el". * * If "ss" is not NULL, compute SHA-1 of the exclude file and fill @@ -738,7 +738,8 @@ static void invalidate_directory(struct untracked_cache *uc, * ss_valid is non-zero, "ss" must contain good value as input. */ static int add_excludes(const char *fname, const char *base, int baselen, - struct exclude_list *el, int check_index, + struct exclude_list *el, + struct index_state *istate, struct sha1_stat *sha1_stat) { struct stat st; @@ -752,8 +753,8 @@ static int add_excludes(const char *fname, const char *base, int baselen, warn_on_inaccessible(fname); if (0 <= fd) close(fd); - if (!check_index || - (buf = read_skip_worktree_file_from_index(&the_index, fname, &size, sha1_stat)) == NULL) + if (!istate || + (buf = read_skip_worktree_file_from_index(istate, fname, &size, sha1_stat)) == NULL) return -1; if (size == 0) { free(buf); @@ -785,15 +786,15 @@ static int add_excludes(const char *fname, const char *base, int baselen, if (sha1_stat) { int pos; if (sha1_stat->valid && - !match_stat_data_racy(&the_index, &sha1_stat->stat, &st)) + !match_stat_data_racy(istate, &sha1_stat->stat, &st)) ; /* no content change, ss->sha1 still good */ - else if (check_index && - (pos = index_name_pos(&the_index, fname, strlen(fname))) >= 0 && - !ce_stage(the_index.cache[pos]) && - ce_uptodate(the_index.cache[pos]) && + else if (istate && + (pos = index_name_pos(istate, fname, strlen(fname))) >= 0 && + !ce_stage(istate->cache[pos]) && + ce_uptodate(istate->cache[pos]) && !would_convert_to_git(fname)) hashcpy(sha1_stat->sha1, - the_index.cache[pos]->oid.hash); + istate->cache[pos]->oid.hash); else hash_sha1_file(buf, size, "blob", sha1_stat->sha1); fill_stat_data(&sha1_stat->stat, &st); @@ -824,9 +825,9 @@ static int add_excludes(const char *fname, const char *base, int baselen, int add_excludes_from_file_to_list(const char *fname, const char *base, int baselen, struct exclude_list *el, - int check_index) + struct index_state *istate) { - return add_excludes(fname, base, baselen, el, check_index, NULL); + return add_excludes(fname, base, baselen, el, istate, NULL); } struct exclude_list *add_exclude_list(struct dir_struct *dir, @@ -858,7 +859,7 @@ static void add_excludes_from_file_1(struct dir_struct *dir, const char *fname, if (!dir->untracked) dir->unmanaged_exclude_files++; el = add_exclude_list(dir, EXC_FILE, fname); - if (add_excludes(fname, "", 0, el, 0, sha1_stat) < 0) + if (add_excludes(fname, "", 0, el, NULL, sha1_stat) < 0) die("cannot use %s as an exclude file", fname); } @@ -1166,7 +1167,7 @@ static void prep_exclude(struct dir_struct *dir, const char *base, int baselen) strbuf_addbuf(&sb, &dir->basebuf); strbuf_addstr(&sb, dir->exclude_per_dir); el->src = strbuf_detach(&sb, NULL); - add_excludes(el->src, el->src, stk->baselen, el, 1, + add_excludes(el->src, el->src, stk->baselen, el, &the_index, untracked ? &sha1_stat : NULL); } /* diff --git a/dir.h b/dir.h index 64254c7e74..1bcda0d234 100644 --- a/dir.h +++ b/dir.h @@ -243,7 +243,7 @@ extern int is_excluded(struct dir_struct *dir, const char *name, int *dtype); extern struct exclude_list *add_exclude_list(struct dir_struct *dir, int group_type, const char *src); extern int add_excludes_from_file_to_list(const char *fname, const char *base, int baselen, - struct exclude_list *el, int check_index); + struct exclude_list *el, struct index_state *istate); extern void add_excludes_from_file(struct dir_struct *, const char *fname); extern void parse_exclude_pattern(const char **string, int *patternlen, unsigned *flags, int *nowildcardlen); extern void add_exclude(const char *string, const char *base, diff --git a/unpack-trees.c b/unpack-trees.c index df9f975d01..f278cd23f0 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -1251,7 +1251,7 @@ int unpack_trees(unsigned len, struct tree_desc *t, struct unpack_trees_options o->skip_sparse_checkout = 1; if (!o->skip_sparse_checkout) { char *sparse = git_pathdup("info/sparse-checkout"); - if (add_excludes_from_file_to_list(sparse, "", 0, &el, 0) < 0) + if (add_excludes_from_file_to_list(sparse, "", 0, &el, NULL) < 0) o->skip_sparse_checkout = 1; else o->el = ⪙ -- cgit v1.3 From a0bba65b107651946431bee4c71d05d812988d9d Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Fri, 5 May 2017 12:53:30 -0700 Subject: dir: convert is_excluded to take an index Signed-off-by: Brandon Williams Signed-off-by: Junio C Hamano --- builtin/add.c | 2 +- builtin/check-ignore.c | 3 ++- builtin/clean.c | 2 +- builtin/ls-files.c | 2 +- dir.c | 16 +++++++++------- dir.h | 5 ++++- unpack-trees.c | 2 +- 7 files changed, 19 insertions(+), 13 deletions(-) (limited to 'dir.h') diff --git a/builtin/add.c b/builtin/add.c index bf5e676e46..0b52aeced3 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -436,7 +436,7 @@ int cmd_add(int argc, const char **argv, const char *prefix) !file_exists(path))) { if (ignore_missing) { int dtype = DT_UNKNOWN; - if (is_excluded(&dir, path, &dtype)) + if (is_excluded(&dir, &the_index, path, &dtype)) dir_add_ignored(&dir, &the_index, path, pathspec.items[i].len); } else diff --git a/builtin/check-ignore.c b/builtin/check-ignore.c index 1d73d3ca3d..d2293b22e1 100644 --- a/builtin/check-ignore.c +++ b/builtin/check-ignore.c @@ -101,7 +101,8 @@ static int check_ignore(struct dir_struct *dir, full_path = pathspec.items[i].match; exclude = NULL; if (!seen[i]) { - exclude = last_exclude_matching(dir, full_path, &dtype); + exclude = last_exclude_matching(dir, &the_index, + full_path, &dtype); } if (!quiet && (exclude || show_non_matching)) output_exclude(pathspec.items[i].original, exclude); diff --git a/builtin/clean.c b/builtin/clean.c index d861f836a2..39866afab4 100644 --- a/builtin/clean.c +++ b/builtin/clean.c @@ -683,7 +683,7 @@ static int filter_by_patterns_cmd(void) for_each_string_list_item(item, &del_list) { int dtype = DT_UNKNOWN; - if (is_excluded(&dir, item->string, &dtype)) { + if (is_excluded(&dir, &the_index, item->string, &dtype)) { *item->string = '\0'; changed++; } diff --git a/builtin/ls-files.c b/builtin/ls-files.c index a6c70dbe9e..7a8c5681b6 100644 --- a/builtin/ls-files.c +++ b/builtin/ls-files.c @@ -322,7 +322,7 @@ static void show_ru_info(void) static int ce_excluded(struct dir_struct *dir, const struct cache_entry *ce) { int dtype = ce_to_dtype(ce); - return is_excluded(dir, ce->name, &dtype); + return is_excluded(dir, &the_index, ce->name, &dtype); } static void show_files(struct dir_struct *dir) diff --git a/dir.c b/dir.c index 50b5e720e9..a15da672c3 100644 --- a/dir.c +++ b/dir.c @@ -1204,19 +1204,20 @@ static void prep_exclude(struct dir_struct *dir, * undecided. */ struct exclude *last_exclude_matching(struct dir_struct *dir, - const char *pathname, - int *dtype_p) + struct index_state *istate, + const char *pathname, + int *dtype_p) { int pathlen = strlen(pathname); const char *basename = strrchr(pathname, '/'); basename = (basename) ? basename+1 : pathname; - prep_exclude(dir, &the_index, pathname, basename-pathname); + prep_exclude(dir, istate, pathname, basename-pathname); if (dir->exclude) return dir->exclude; - return last_exclude_matching_from_lists(dir, &the_index, pathname, pathlen, + return last_exclude_matching_from_lists(dir, istate, pathname, pathlen, basename, dtype_p); } @@ -1225,10 +1226,11 @@ struct exclude *last_exclude_matching(struct dir_struct *dir, * scans all exclude lists to determine whether pathname is excluded. * Returns 1 if true, otherwise 0. */ -int is_excluded(struct dir_struct *dir, const char *pathname, int *dtype_p) +int is_excluded(struct dir_struct *dir, struct index_state *istate, + const char *pathname, int *dtype_p) { struct exclude *exclude = - last_exclude_matching(dir, pathname, dtype_p); + last_exclude_matching(dir, istate, pathname, dtype_p); if (exclude) return exclude->flags & EXC_FLAG_NEGATIVE ? 0 : 1; return 0; @@ -1573,7 +1575,7 @@ static enum path_treatment treat_one_path(struct dir_struct *dir, (directory_exists_in_index(&the_index, path->buf, path->len) == index_nonexistent)) return path_none; - exclude = is_excluded(dir, path->buf, &dtype); + exclude = is_excluded(dir, &the_index, path->buf, &dtype); /* * Excluded? If we don't explicitly want to show diff --git a/dir.h b/dir.h index 1bcda0d234..b745f1e5d7 100644 --- a/dir.h +++ b/dir.h @@ -236,9 +236,12 @@ extern int match_pathname(const char *, int, const char *, int, int, unsigned); extern struct exclude *last_exclude_matching(struct dir_struct *dir, + struct index_state *istate, const char *name, int *dtype); -extern int is_excluded(struct dir_struct *dir, const char *name, int *dtype); +extern int is_excluded(struct dir_struct *dir, + struct index_state *istate, + const char *name, int *dtype); extern struct exclude_list *add_exclude_list(struct dir_struct *dir, int group_type, const char *src); diff --git a/unpack-trees.c b/unpack-trees.c index f278cd23f0..d5b401450f 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -1634,7 +1634,7 @@ static int check_ok_to_remove(const char *name, int len, int dtype, return 0; if (o->dir && - is_excluded(o->dir, name, &dtype)) + is_excluded(o->dir, &the_index, name, &dtype)) /* * ce->name is explicitly excluded, so it is Ok to * overwrite it. -- cgit v1.3 From 2c1eb104543265c2d26cf36303b35e426dcacf68 Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Fri, 5 May 2017 12:53:33 -0700 Subject: dir: convert read_directory to take an index Signed-off-by: Brandon Williams Signed-off-by: Junio C Hamano --- dir.c | 16 ++++++++-------- dir.h | 4 +++- unpack-trees.c | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) (limited to 'dir.h') diff --git a/dir.c b/dir.c index 3318ebbcb4..4eb8cb6a21 100644 --- a/dir.c +++ b/dir.c @@ -190,7 +190,7 @@ int fill_directory(struct dir_struct *dir, const struct pathspec *pathspec) prefix = prefix_len ? pathspec->items[0].match : ""; /* Read the directory and prune it */ - read_directory(dir, prefix, prefix_len, pathspec); + read_directory(dir, &the_index, prefix, prefix_len, pathspec); return prefix_len; } @@ -2071,8 +2071,8 @@ static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *d return root; } -int read_directory(struct dir_struct *dir, const char *path, - int len, const struct pathspec *pathspec) +int read_directory(struct dir_struct *dir, struct index_state *istate, + const char *path, int len, const struct pathspec *pathspec) { struct untracked_cache_dir *untracked; @@ -2086,8 +2086,8 @@ int read_directory(struct dir_struct *dir, const char *path, * e.g. prep_exclude() */ dir->untracked = NULL; - if (!len || treat_leading_path(dir, &the_index, path, len, pathspec)) - read_directory_recursive(dir, &the_index, path, len, untracked, 0, pathspec); + if (!len || treat_leading_path(dir, istate, path, len, pathspec)) + read_directory_recursive(dir, istate, path, len, untracked, 0, pathspec); QSORT(dir->entries, dir->nr, cmp_name); QSORT(dir->ignored, dir->ignored_nr, cmp_name); if (dir->untracked) { @@ -2101,12 +2101,12 @@ int read_directory(struct dir_struct *dir, const char *path, dir->untracked->gitignore_invalidated, dir->untracked->dir_invalidated, dir->untracked->dir_opened); - if (dir->untracked == the_index.untracked && + if (dir->untracked == istate->untracked && (dir->untracked->dir_opened || dir->untracked->gitignore_invalidated || dir->untracked->dir_invalidated)) - the_index.cache_changed |= UNTRACKED_CHANGED; - if (dir->untracked != the_index.untracked) { + istate->cache_changed |= UNTRACKED_CHANGED; + if (dir->untracked != istate->untracked) { free(dir->untracked); dir->untracked = NULL; } diff --git a/dir.h b/dir.h index b745f1e5d7..a23bcd005c 100644 --- a/dir.h +++ b/dir.h @@ -215,7 +215,9 @@ extern int report_path_error(const char *ps_matched, const struct pathspec *path extern int within_depth(const char *name, int namelen, int depth, int max_depth); extern int fill_directory(struct dir_struct *dir, const struct pathspec *pathspec); -extern int read_directory(struct dir_struct *, const char *path, int len, const struct pathspec *pathspec); +extern int read_directory(struct dir_struct *, struct index_state *istate, + const char *path, int len, + const struct pathspec *pathspec); extern int is_excluded_from_list(const char *pathname, int pathlen, const char *basename, int *dtype, diff --git a/unpack-trees.c b/unpack-trees.c index d5b401450f..cff6b3f8c4 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -1592,7 +1592,7 @@ static int verify_clean_subdirectory(const struct cache_entry *ce, memset(&d, 0, sizeof(d)); if (o->dir) d.exclude_per_dir = o->dir->exclude_per_dir; - i = read_directory(&d, pathbuf, namelen+1, NULL); + i = read_directory(&d, &the_index, pathbuf, namelen+1, NULL); if (i) return o->gently ? -1 : add_rejected_path(o, ERROR_NOT_UPTODATE_DIR, ce->name); -- cgit v1.3 From 0d32c183b636ffba6462b21ed0c844b6cb887b3f Mon Sep 17 00:00:00 2001 From: Brandon Williams Date: Fri, 5 May 2017 12:53:34 -0700 Subject: dir: convert fill_directory to take an index Signed-off-by: Brandon Williams Signed-off-by: Junio C Hamano --- builtin/add.c | 2 +- builtin/clean.c | 2 +- builtin/grep.c | 2 +- builtin/ls-files.c | 2 +- dir.c | 6 ++++-- dir.h | 4 +++- wt-status.c | 2 +- 7 files changed, 12 insertions(+), 8 deletions(-) (limited to 'dir.h') diff --git a/builtin/add.c b/builtin/add.c index 0b52aeced3..36cad00ae6 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -400,7 +400,7 @@ int cmd_add(int argc, const char **argv, const char *prefix) } /* This picks up the paths that are not tracked */ - baselen = fill_directory(&dir, &pathspec); + baselen = fill_directory(&dir, &the_index, &pathspec); if (pathspec.nr) seen = prune_directory(&dir, &pathspec, baselen); } diff --git a/builtin/clean.c b/builtin/clean.c index 39866afab4..329b68c40b 100644 --- a/builtin/clean.c +++ b/builtin/clean.c @@ -930,7 +930,7 @@ int cmd_clean(int argc, const char **argv, const char *prefix) PATHSPEC_PREFER_CWD, prefix, argv); - fill_directory(&dir, &pathspec); + fill_directory(&dir, &the_index, &pathspec); for (i = 0; i < dir.nr; i++) { struct dir_entry *ent = dir.entries[i]; diff --git a/builtin/grep.c b/builtin/grep.c index 3ffb5b4e81..f2829629b6 100644 --- a/builtin/grep.c +++ b/builtin/grep.c @@ -866,7 +866,7 @@ static int grep_directory(struct grep_opt *opt, const struct pathspec *pathspec, if (exc_std) setup_standard_excludes(&dir); - fill_directory(&dir, pathspec); + fill_directory(&dir, &the_index, pathspec); for (i = 0; i < dir.nr; i++) { if (!dir_path_match(dir.entries[i], pathspec, 0, NULL)) continue; diff --git a/builtin/ls-files.c b/builtin/ls-files.c index 7a8c5681b6..61271b52cf 100644 --- a/builtin/ls-files.c +++ b/builtin/ls-files.c @@ -333,7 +333,7 @@ static void show_files(struct dir_struct *dir) if (show_others || show_killed) { if (!show_others) dir->flags |= DIR_COLLECT_KILLED_ONLY; - fill_directory(dir, &pathspec); + fill_directory(dir, &the_index, &pathspec); if (show_others) show_other_files(dir); if (show_killed) diff --git a/dir.c b/dir.c index 4eb8cb6a21..3f3167e55a 100644 --- a/dir.c +++ b/dir.c @@ -177,7 +177,9 @@ char *common_prefix(const struct pathspec *pathspec) return len ? xmemdupz(pathspec->items[0].match, len) : NULL; } -int fill_directory(struct dir_struct *dir, const struct pathspec *pathspec) +int fill_directory(struct dir_struct *dir, + struct index_state *istate, + const struct pathspec *pathspec) { const char *prefix; size_t prefix_len; @@ -190,7 +192,7 @@ int fill_directory(struct dir_struct *dir, const struct pathspec *pathspec) prefix = prefix_len ? pathspec->items[0].match : ""; /* Read the directory and prune it */ - read_directory(dir, &the_index, prefix, prefix_len, pathspec); + read_directory(dir, istate, prefix, prefix_len, pathspec); return prefix_len; } diff --git a/dir.h b/dir.h index a23bcd005c..17d110693d 100644 --- a/dir.h +++ b/dir.h @@ -214,7 +214,9 @@ extern int match_pathspec(const struct pathspec *pathspec, extern int report_path_error(const char *ps_matched, const struct pathspec *pathspec, const char *prefix); extern int within_depth(const char *name, int namelen, int depth, int max_depth); -extern int fill_directory(struct dir_struct *dir, const struct pathspec *pathspec); +extern int fill_directory(struct dir_struct *dir, + struct index_state *istate, + const struct pathspec *pathspec); extern int read_directory(struct dir_struct *, struct index_state *istate, const char *path, int len, const struct pathspec *pathspec); diff --git a/wt-status.c b/wt-status.c index 0375484962..3b40f74055 100644 --- a/wt-status.c +++ b/wt-status.c @@ -665,7 +665,7 @@ static void wt_status_collect_untracked(struct wt_status *s) dir.untracked = the_index.untracked; setup_standard_excludes(&dir); - fill_directory(&dir, &s->pathspec); + fill_directory(&dir, &the_index, &s->pathspec); for (i = 0; i < dir.nr; i++) { struct dir_entry *ent = dir.entries[i]; -- cgit v1.3