]> git.ipfire.org Git - thirdparty/git.git/blame - dir.c
dir: remove struct path_simplify
[thirdparty/git.git] / dir.c
CommitLineData
453ec4bd
LT
1/*
2 * This handles recursive filename detection with exclude
3 * files, index knowledge etc..
4 *
95a68344
AS
5 * See Documentation/technical/api-directory-listing.txt
6 *
453ec4bd
LT
7 * Copyright (C) Linus Torvalds, 2005-2006
8 * Junio Hamano, 2005-2006
9 */
453ec4bd
LT
10#include "cache.h"
11#include "dir.h"
09595258 12#include "refs.h"
237ec6e4 13#include "wildmatch.h"
64acde94 14#include "pathspec.h"
dde843e7 15#include "utf8.h"
83c094ad
NTND
16#include "varint.h"
17#include "ewah/ewok.h"
453ec4bd 18
defd7c7b
KB
19/*
20 * Tells read_directory_recursive how a file or directory should be treated.
21 * Values are ordered by significance, e.g. if a directory contains both
22 * excluded and untracked files, it is listed as untracked because
23 * path_untracked > path_excluded.
24 */
25enum path_treatment {
26 path_none = 0,
27 path_recurse,
28 path_excluded,
29 path_untracked
30};
31
cf7c6148
NTND
32/*
33 * Support data structure for our opendir/readdir/closedir wrappers
34 */
35struct cached_dir {
36 DIR *fdir;
37 struct untracked_cache_dir *untracked;
91a2288b
NTND
38 int nr_files;
39 int nr_dirs;
40
cf7c6148 41 struct dirent *de;
91a2288b
NTND
42 const char *file;
43 struct untracked_cache_dir *ucd;
cf7c6148
NTND
44};
45
defd7c7b 46static enum path_treatment read_directory_recursive(struct dir_struct *dir,
0dcb8d7f 47 const char *path, int len, struct untracked_cache_dir *untracked,
e1b8c7bd 48 int check_only, const struct pathspec *pathspec);
caa6b782 49static int get_dtype(struct dirent *de, const char *path, int len);
09595258 50
ba0897e6 51int fspathcmp(const char *a, const char *b)
8cf2a84e
JJ
52{
53 return ignore_case ? strcasecmp(a, b) : strcmp(a, b);
54}
55
ba0897e6 56int fspathncmp(const char *a, const char *b, size_t count)
8cf2a84e
JJ
57{
58 return ignore_case ? strncasecmp(a, b, count) : strncmp(a, b, count);
59}
60
1f26ce61
CB
61int git_fnmatch(const struct pathspec_item *item,
62 const char *pattern, const char *string,
63 int prefix)
5d74762d 64{
5d74762d 65 if (prefix > 0) {
93d93537 66 if (ps_strncmp(item, pattern, string, prefix))
eb07894f 67 return WM_NOMATCH;
5d74762d
NTND
68 pattern += prefix;
69 string += prefix;
70 }
bd30c2e4 71 if (item->flags & PATHSPEC_ONESTAR) {
8c6abbcd
NTND
72 int pattern_len = strlen(++pattern);
73 int string_len = strlen(string);
74 return string_len < pattern_len ||
93d93537
NTND
75 ps_strcmp(item, pattern,
76 string + string_len - pattern_len);
8c6abbcd 77 }
bd30c2e4 78 if (item->magic & PATHSPEC_GLOB)
93d93537
NTND
79 return wildmatch(pattern, string,
80 WM_PATHNAME |
81 (item->magic & PATHSPEC_ICASE ? WM_CASEFOLD : 0),
82 NULL);
bd30c2e4
NTND
83 else
84 /* wildmatch has not learned no FNM_PATHNAME mode yet */
eb07894f
NTND
85 return wildmatch(pattern, string,
86 item->magic & PATHSPEC_ICASE ? WM_CASEFOLD : 0,
87 NULL);
5d74762d
NTND
88}
89
0b6e56df
JH
90static int fnmatch_icase_mem(const char *pattern, int patternlen,
91 const char *string, int stringlen,
92 int flags)
93{
94 int match_status;
95 struct strbuf pat_buf = STRBUF_INIT;
96 struct strbuf str_buf = STRBUF_INIT;
97 const char *use_pat = pattern;
98 const char *use_str = string;
99
100 if (pattern[patternlen]) {
101 strbuf_add(&pat_buf, pattern, patternlen);
102 use_pat = pat_buf.buf;
103 }
104 if (string[stringlen]) {
105 strbuf_add(&str_buf, string, stringlen);
106 use_str = str_buf.buf;
107 }
108
f30366b2
JH
109 if (ignore_case)
110 flags |= WM_CASEFOLD;
111 match_status = wildmatch(use_pat, use_str, flags, NULL);
0b6e56df
JH
112
113 strbuf_release(&pat_buf);
114 strbuf_release(&str_buf);
115
116 return match_status;
117}
118
827f4d6c 119static size_t common_prefix_len(const struct pathspec *pathspec)
3c6a370b 120{
827f4d6c 121 int n;
4a085b16 122 size_t max = 0;
3c6a370b 123
93d93537
NTND
124 /*
125 * ":(icase)path" is treated as a pathspec full of
126 * wildcard. In other words, only prefix is considered common
127 * prefix. If the pathspec is abc/foo abc/bar, running in
128 * subdir xyz, the common prefix is still xyz, not xuz/abc as
129 * in non-:(icase).
130 */
5c6933d2
NTND
131 GUARD_PATHSPEC(pathspec,
132 PATHSPEC_FROMTOP |
133 PATHSPEC_MAXDEPTH |
bd30c2e4 134 PATHSPEC_LITERAL |
93d93537 135 PATHSPEC_GLOB |
ef79b1f8
NTND
136 PATHSPEC_ICASE |
137 PATHSPEC_EXCLUDE);
4a085b16 138
827f4d6c 139 for (n = 0; n < pathspec->nr; n++) {
93d93537 140 size_t i = 0, len = 0, item_len;
ef79b1f8
NTND
141 if (pathspec->items[n].magic & PATHSPEC_EXCLUDE)
142 continue;
93d93537
NTND
143 if (pathspec->items[n].magic & PATHSPEC_ICASE)
144 item_len = pathspec->items[n].prefix;
145 else
146 item_len = pathspec->items[n].nowildcard_len;
147 while (i < item_len && (n == 0 || i < max)) {
827f4d6c
NTND
148 char c = pathspec->items[n].match[i];
149 if (c != pathspec->items[0].match[i])
4a085b16
JH
150 break;
151 if (c == '/')
152 len = i + 1;
827f4d6c 153 i++;
4a085b16 154 }
827f4d6c 155 if (n == 0 || len < max) {
4a085b16
JH
156 max = len;
157 if (!max)
158 break;
159 }
3c6a370b 160 }
4a085b16 161 return max;
3c6a370b
LT
162}
163
f950eb95
CB
164/*
165 * Returns a copy of the longest leading path common among all
166 * pathspecs.
167 */
827f4d6c 168char *common_prefix(const struct pathspec *pathspec)
f950eb95
CB
169{
170 unsigned long len = common_prefix_len(pathspec);
171
827f4d6c 172 return len ? xmemdupz(pathspec->items[0].match, len) : NULL;
f950eb95
CB
173}
174
7327d3d1 175int fill_directory(struct dir_struct *dir, const struct pathspec *pathspec)
1d8842d9 176{
4a085b16 177 size_t len;
1d8842d9
LT
178
179 /*
180 * Calculate common prefix for the pathspec, and
181 * use that to optimize the directory walk
182 */
4a085b16 183 len = common_prefix_len(pathspec);
1d8842d9
LT
184
185 /* Read the directory and prune it */
b3920bbd 186 read_directory(dir, pathspec->nr ? pathspec->_raw[0] : "", len, pathspec);
dba2e203 187 return len;
1d8842d9
LT
188}
189
bc96cc87
NTND
190int within_depth(const char *name, int namelen,
191 int depth, int max_depth)
192{
193 const char *cp = name, *cpe = name + namelen;
194
195 while (cp < cpe) {
196 if (*cp++ != '/')
197 continue;
198 depth++;
199 if (depth > max_depth)
200 return 0;
201 }
202 return 1;
203}
204
75a6315f
BW
205#define DO_MATCH_EXCLUDE (1<<0)
206#define DO_MATCH_DIRECTORY (1<<1)
207#define DO_MATCH_SUBMODULE (1<<2)
42b0874a 208
61cf2820
NTND
209/*
210 * Does 'match' match the given name?
211 * A match is found if
212 *
213 * (1) the 'match' string is leading directory of 'name', or
214 * (2) the 'match' string is a wildcard and matches 'name', or
215 * (3) the 'match' string is exactly the same as 'name'.
216 *
217 * and the return value tells which case it was.
218 *
219 * It returns 0 when there is no match.
220 */
221static int match_pathspec_item(const struct pathspec_item *item, int prefix,
42b0874a 222 const char *name, int namelen, unsigned flags)
61cf2820
NTND
223{
224 /* name/namelen has prefix cut off by caller */
225 const char *match = item->match + prefix;
226 int matchlen = item->len - prefix;
227
93d93537
NTND
228 /*
229 * The normal call pattern is:
230 * 1. prefix = common_prefix_len(ps);
231 * 2. prune something, or fill_directory
854b0959 232 * 3. match_pathspec()
93d93537
NTND
233 *
234 * 'prefix' at #1 may be shorter than the command's prefix and
235 * it's ok for #2 to match extra files. Those extras will be
236 * trimmed at #3.
237 *
238 * Suppose the pathspec is 'foo' and '../bar' running from
239 * subdir 'xyz'. The common prefix at #1 will be empty, thanks
240 * to "../". We may have xyz/foo _and_ XYZ/foo after #2. The
241 * user does not want XYZ/foo, only the "foo" part should be
242 * case-insensitive. We need to filter out XYZ/foo here. In
243 * other words, we do not trust the caller on comparing the
244 * prefix part when :(icase) is involved. We do exact
245 * comparison ourselves.
246 *
247 * Normally the caller (common_prefix_len() in fact) does
248 * _exact_ matching on name[-prefix+1..-1] and we do not need
249 * to check that part. Be defensive and check it anyway, in
250 * case common_prefix_len is changed, or a new caller is
251 * introduced that does not use common_prefix_len.
252 *
253 * If the penalty turns out too high when prefix is really
254 * long, maybe change it to
255 * strncmp(match, name, item->prefix - prefix)
256 */
257 if (item->prefix && (item->magic & PATHSPEC_ICASE) &&
258 strncmp(item->match, name - prefix, item->prefix))
259 return 0;
260
61cf2820
NTND
261 /* If the match was just the prefix, we matched */
262 if (!*match)
263 return MATCHED_RECURSIVELY;
264
93d93537 265 if (matchlen <= namelen && !ps_strncmp(item, match, name, matchlen)) {
61cf2820
NTND
266 if (matchlen == namelen)
267 return MATCHED_EXACTLY;
268
269 if (match[matchlen-1] == '/' || name[matchlen] == '/')
270 return MATCHED_RECURSIVELY;
68690fdd
NTND
271 } else if ((flags & DO_MATCH_DIRECTORY) &&
272 match[matchlen - 1] == '/' &&
273 namelen == matchlen - 1 &&
274 !ps_strncmp(item, match, name, namelen))
275 return MATCHED_EXACTLY;
61cf2820 276
5d74762d 277 if (item->nowildcard_len < item->len &&
bd30c2e4 278 !git_fnmatch(item, match, name,
8c6abbcd 279 item->nowildcard_len - prefix))
61cf2820
NTND
280 return MATCHED_FNMATCH;
281
75a6315f
BW
282 /* Perform checks to see if "name" is a super set of the pathspec */
283 if (flags & DO_MATCH_SUBMODULE) {
284 /* name is a literal prefix of the pathspec */
285 if ((namelen < matchlen) &&
286 (match[namelen] == '/') &&
287 !ps_strncmp(item, match, name, namelen))
288 return MATCHED_RECURSIVELY;
289
290 /* name" doesn't match up to the first wild character */
291 if (item->nowildcard_len < item->len &&
292 ps_strncmp(item, match, name,
293 item->nowildcard_len - prefix))
294 return 0;
295
296 /*
297 * Here is where we would perform a wildmatch to check if
298 * "name" can be matched as a directory (or a prefix) against
299 * the pathspec. Since wildmatch doesn't have this capability
300 * at the present we have to punt and say that it is a match,
301 * potentially returning a false positive
302 * The submodules themselves will be able to perform more
303 * accurate matching to determine if the pathspec matches.
304 */
305 return MATCHED_RECURSIVELY;
306 }
307
61cf2820
NTND
308 return 0;
309}
310
311/*
52ed1894
AS
312 * Given a name and a list of pathspecs, returns the nature of the
313 * closest (i.e. most specific) match of the name to any of the
314 * pathspecs.
315 *
316 * The caller typically calls this multiple times with the same
317 * pathspec and seen[] array but with different name/namelen
318 * (e.g. entries from the index) and is interested in seeing if and
319 * how each pathspec matches all the names it calls this function
320 * with. A mark is left in the seen[] array for each pathspec element
321 * indicating the closest type of match that element achieved, so if
322 * seen[n] remains zero after multiple invocations, that means the nth
323 * pathspec did not match any names, which could indicate that the
324 * user mistyped the nth pathspec.
61cf2820 325 */
854b0959
NTND
326static int do_match_pathspec(const struct pathspec *ps,
327 const char *name, int namelen,
328 int prefix, char *seen,
42b0874a 329 unsigned flags)
61cf2820 330{
42b0874a 331 int i, retval = 0, exclude = flags & DO_MATCH_EXCLUDE;
61cf2820 332
5c6933d2
NTND
333 GUARD_PATHSPEC(ps,
334 PATHSPEC_FROMTOP |
335 PATHSPEC_MAXDEPTH |
bd30c2e4 336 PATHSPEC_LITERAL |
93d93537 337 PATHSPEC_GLOB |
ef79b1f8
NTND
338 PATHSPEC_ICASE |
339 PATHSPEC_EXCLUDE);
8f4f8f45 340
61cf2820 341 if (!ps->nr) {
6330a171
NTND
342 if (!ps->recursive ||
343 !(ps->magic & PATHSPEC_MAXDEPTH) ||
344 ps->max_depth == -1)
61cf2820
NTND
345 return MATCHED_RECURSIVELY;
346
347 if (within_depth(name, namelen, 0, ps->max_depth))
348 return MATCHED_EXACTLY;
349 else
350 return 0;
351 }
352
353 name += prefix;
354 namelen -= prefix;
355
356 for (i = ps->nr - 1; i >= 0; i--) {
357 int how;
ef79b1f8
NTND
358
359 if ((!exclude && ps->items[i].magic & PATHSPEC_EXCLUDE) ||
360 ( exclude && !(ps->items[i].magic & PATHSPEC_EXCLUDE)))
361 continue;
362
61cf2820
NTND
363 if (seen && seen[i] == MATCHED_EXACTLY)
364 continue;
ef79b1f8
NTND
365 /*
366 * Make exclude patterns optional and never report
367 * "pathspec ':(exclude)foo' matches no files"
368 */
369 if (seen && ps->items[i].magic & PATHSPEC_EXCLUDE)
370 seen[i] = MATCHED_FNMATCH;
42b0874a
NTND
371 how = match_pathspec_item(ps->items+i, prefix, name,
372 namelen, flags);
6330a171
NTND
373 if (ps->recursive &&
374 (ps->magic & PATHSPEC_MAXDEPTH) &&
375 ps->max_depth != -1 &&
61cf2820
NTND
376 how && how != MATCHED_FNMATCH) {
377 int len = ps->items[i].len;
378 if (name[len] == '/')
379 len++;
380 if (within_depth(name+len, namelen-len, 0, ps->max_depth))
381 how = MATCHED_EXACTLY;
382 else
383 how = 0;
384 }
385 if (how) {
386 if (retval < how)
387 retval = how;
388 if (seen && seen[i] < how)
389 seen[i] = how;
390 }
391 }
392 return retval;
393}
394
854b0959
NTND
395int match_pathspec(const struct pathspec *ps,
396 const char *name, int namelen,
ae8d0824 397 int prefix, char *seen, int is_dir)
ef79b1f8
NTND
398{
399 int positive, negative;
ae8d0824 400 unsigned flags = is_dir ? DO_MATCH_DIRECTORY : 0;
42b0874a
NTND
401 positive = do_match_pathspec(ps, name, namelen,
402 prefix, seen, flags);
ef79b1f8
NTND
403 if (!(ps->magic & PATHSPEC_EXCLUDE) || !positive)
404 return positive;
42b0874a
NTND
405 negative = do_match_pathspec(ps, name, namelen,
406 prefix, seen,
407 flags | DO_MATCH_EXCLUDE);
ef79b1f8
NTND
408 return negative ? 0 : positive;
409}
410
75a6315f
BW
411/**
412 * Check if a submodule is a superset of the pathspec
413 */
414int submodule_path_match(const struct pathspec *ps,
415 const char *submodule_name,
416 char *seen)
417{
418 int matched = do_match_pathspec(ps, submodule_name,
419 strlen(submodule_name),
420 0, seen,
421 DO_MATCH_DIRECTORY |
422 DO_MATCH_SUBMODULE);
423 return matched;
424}
425
777c55a6
JH
426int report_path_error(const char *ps_matched,
427 const struct pathspec *pathspec,
428 const char *prefix)
429{
430 /*
431 * Make sure all pathspec matched; otherwise it is an error.
432 */
777c55a6
JH
433 int num, errors = 0;
434 for (num = 0; num < pathspec->nr; num++) {
435 int other, found_dup;
436
437 if (ps_matched[num])
438 continue;
439 /*
440 * The caller might have fed identical pathspec
441 * twice. Do not barf on such a mistake.
442 * FIXME: parse_pathspec should have eliminated
443 * duplicate pathspec.
444 */
445 for (found_dup = other = 0;
446 !found_dup && other < pathspec->nr;
447 other++) {
448 if (other == num || !ps_matched[other])
449 continue;
450 if (!strcmp(pathspec->items[other].original,
451 pathspec->items[num].original))
452 /*
453 * Ok, we have a match already.
454 */
455 found_dup = 1;
456 }
457 if (found_dup)
458 continue;
459
460 error("pathspec '%s' did not match any file(s) known to git.",
461 pathspec->items[num].original);
462 errors++;
463 }
777c55a6
JH
464 return errors;
465}
466
fcd631ed
NTND
467/*
468 * Return the length of the "simple" part of a path match limiter.
469 */
87323bda 470int simple_length(const char *match)
fcd631ed
NTND
471{
472 int len = -1;
473
474 for (;;) {
475 unsigned char c = *match++;
476 len++;
477 if (c == '\0' || is_glob_special(c))
478 return len;
479 }
480}
481
87323bda 482int no_wildcard(const char *string)
68492fc7 483{
fcd631ed 484 return string[simple_length(string)] == '\0';
68492fc7
LK
485}
486
82dce998
NTND
487void parse_exclude_pattern(const char **pattern,
488 int *patternlen,
f8708998 489 unsigned *flags,
82dce998 490 int *nowildcardlen)
84460eec
NTND
491{
492 const char *p = *pattern;
493 size_t i, len;
494
495 *flags = 0;
496 if (*p == '!') {
497 *flags |= EXC_FLAG_NEGATIVE;
498 p++;
499 }
500 len = strlen(p);
501 if (len && p[len - 1] == '/') {
502 len--;
503 *flags |= EXC_FLAG_MUSTBEDIR;
504 }
505 for (i = 0; i < len; i++) {
506 if (p[i] == '/')
507 break;
508 }
509 if (i == len)
510 *flags |= EXC_FLAG_NODIR;
511 *nowildcardlen = simple_length(p);
512 /*
513 * we should have excluded the trailing slash from 'p' too,
514 * but that's one more allocation. Instead just make sure
515 * nowildcardlen does not exceed real patternlen
516 */
517 if (*nowildcardlen > len)
518 *nowildcardlen = len;
519 if (*p == '*' && no_wildcard(p + 1))
520 *flags |= EXC_FLAG_ENDSWITH;
521 *pattern = p;
522 *patternlen = len;
523}
524
453ec4bd 525void add_exclude(const char *string, const char *base,
c04318e4 526 int baselen, struct exclude_list *el, int srcpos)
453ec4bd 527{
d6b8fc30 528 struct exclude *x;
84460eec 529 int patternlen;
f8708998 530 unsigned flags;
84460eec 531 int nowildcardlen;
453ec4bd 532
84460eec
NTND
533 parse_exclude_pattern(&string, &patternlen, &flags, &nowildcardlen);
534 if (flags & EXC_FLAG_MUSTBEDIR) {
96ffc06f 535 FLEXPTR_ALLOC_MEM(x, pattern, string, patternlen);
d6b8fc30
JH
536 } else {
537 x = xmalloc(sizeof(*x));
538 x->pattern = string;
539 }
84460eec
NTND
540 x->patternlen = patternlen;
541 x->nowildcardlen = nowildcardlen;
453ec4bd
LT
542 x->base = base;
543 x->baselen = baselen;
d6b8fc30 544 x->flags = flags;
c04318e4 545 x->srcpos = srcpos;
840fc334
AS
546 ALLOC_GROW(el->excludes, el->nr + 1, el->alloc);
547 el->excludes[el->nr++] = x;
c04318e4 548 x->el = el;
453ec4bd
LT
549}
550
55fe6f51
NTND
551static void *read_skip_worktree_file_from_index(const char *path, size_t *size,
552 struct sha1_stat *sha1_stat)
c28b3d6e
NTND
553{
554 int pos, len;
555 unsigned long sz;
556 enum object_type type;
557 void *data;
c28b3d6e
NTND
558
559 len = strlen(path);
71261027 560 pos = cache_name_pos(path, len);
c28b3d6e
NTND
561 if (pos < 0)
562 return NULL;
71261027 563 if (!ce_skip_worktree(active_cache[pos]))
c28b3d6e 564 return NULL;
99d1a986 565 data = read_sha1_file(active_cache[pos]->oid.hash, &type, &sz);
c28b3d6e
NTND
566 if (!data || type != OBJ_BLOB) {
567 free(data);
568 return NULL;
569 }
570 *size = xsize_t(sz);
55fe6f51
NTND
571 if (sha1_stat) {
572 memset(&sha1_stat->stat, 0, sizeof(sha1_stat->stat));
99d1a986 573 hashcpy(sha1_stat->sha1, active_cache[pos]->oid.hash);
55fe6f51 574 }
c28b3d6e
NTND
575 return data;
576}
577
f6198812
AS
578/*
579 * Frees memory within el which was allocated for exclude patterns and
580 * the file buffer. Does not free el itself.
581 */
582void clear_exclude_list(struct exclude_list *el)
0fd0e241
NTND
583{
584 int i;
585
5cee3493 586 for (i = 0; i < el->nr; i++)
0fd0e241
NTND
587 free(el->excludes[i]);
588 free(el->excludes);
c082df24 589 free(el->filebuf);
0fd0e241 590
2653a8c6 591 memset(el, 0, sizeof(*el));
0fd0e241
NTND
592}
593
7e2e4b37 594static void trim_trailing_spaces(char *buf)
16402b99 595{
e61a6c1d
PB
596 char *p, *last_space = NULL;
597
598 for (p = buf; *p; p++)
599 switch (*p) {
600 case ' ':
601 if (!last_space)
602 last_space = p;
603 break;
604 case '\\':
605 p++;
606 if (!*p)
607 return;
608 /* fallthrough */
609 default:
610 last_space = NULL;
611 }
612
613 if (last_space)
614 *last_space = '\0';
16402b99
NTND
615}
616
0dcb8d7f
NTND
617/*
618 * Given a subdirectory name and "dir" of the current directory,
619 * search the subdir in "dir" and return it, or create a new one if it
620 * does not exist in "dir".
621 *
622 * If "name" has the trailing slash, it'll be excluded in the search.
623 */
624static struct untracked_cache_dir *lookup_untracked(struct untracked_cache *uc,
625 struct untracked_cache_dir *dir,
626 const char *name, int len)
627{
628 int first, last;
629 struct untracked_cache_dir *d;
630 if (!dir)
631 return NULL;
632 if (len && name[len - 1] == '/')
633 len--;
634 first = 0;
635 last = dir->dirs_nr;
636 while (last > first) {
637 int cmp, next = (last + first) >> 1;
638 d = dir->dirs[next];
639 cmp = strncmp(name, d->name, len);
640 if (!cmp && strlen(d->name) > len)
641 cmp = -1;
642 if (!cmp)
643 return d;
644 if (cmp < 0) {
645 last = next;
646 continue;
647 }
648 first = next+1;
649 }
650
651 uc->dir_created++;
96ffc06f 652 FLEX_ALLOC_MEM(d, name, name, len);
0dcb8d7f
NTND
653
654 ALLOC_GROW(dir->dirs, dir->dirs_nr + 1, dir->dirs_alloc);
655 memmove(dir->dirs + first + 1, dir->dirs + first,
656 (dir->dirs_nr - first) * sizeof(*dir->dirs));
657 dir->dirs_nr++;
658 dir->dirs[first] = d;
659 return d;
660}
661
ccad261f
NTND
662static void do_invalidate_gitignore(struct untracked_cache_dir *dir)
663{
664 int i;
665 dir->valid = 0;
666 dir->untracked_nr = 0;
667 for (i = 0; i < dir->dirs_nr; i++)
668 do_invalidate_gitignore(dir->dirs[i]);
669}
670
671static void invalidate_gitignore(struct untracked_cache *uc,
672 struct untracked_cache_dir *dir)
673{
674 uc->gitignore_invalidated++;
675 do_invalidate_gitignore(dir);
676}
677
91a2288b
NTND
678static void invalidate_directory(struct untracked_cache *uc,
679 struct untracked_cache_dir *dir)
680{
26cb0182 681 int i;
91a2288b
NTND
682 uc->dir_invalidated++;
683 dir->valid = 0;
684 dir->untracked_nr = 0;
26cb0182
NTND
685 for (i = 0; i < dir->dirs_nr; i++)
686 dir->dirs[i]->recurse = 0;
91a2288b
NTND
687}
688
55fe6f51
NTND
689/*
690 * Given a file with name "fname", read it (either from disk, or from
691 * the index if "check_index" is non-zero), parse it and store the
692 * exclude rules in "el".
693 *
694 * If "ss" is not NULL, compute SHA-1 of the exclude file and fill
695 * stat data from disk (only valid if add_excludes returns zero). If
696 * ss_valid is non-zero, "ss" must contain good value as input.
697 */
698static int add_excludes(const char *fname, const char *base, int baselen,
699 struct exclude_list *el, int check_index,
700 struct sha1_stat *sha1_stat)
453ec4bd 701{
c470701a 702 struct stat st;
c04318e4 703 int fd, i, lineno = 1;
9d14017a 704 size_t size = 0;
453ec4bd
LT
705 char *buf, *entry;
706
707 fd = open(fname, O_RDONLY);
c28b3d6e 708 if (fd < 0 || fstat(fd, &st) < 0) {
69660731 709 if (errno != ENOENT)
55b38a48 710 warn_on_inaccessible(fname);
c28b3d6e
NTND
711 if (0 <= fd)
712 close(fd);
713 if (!check_index ||
55fe6f51 714 (buf = read_skip_worktree_file_from_index(fname, &size, sha1_stat)) == NULL)
c28b3d6e 715 return -1;
45d76f17
NTND
716 if (size == 0) {
717 free(buf);
718 return 0;
719 }
720 if (buf[size-1] != '\n') {
50a6c8ef 721 buf = xrealloc(buf, st_add(size, 1));
45d76f17
NTND
722 buf[size++] = '\n';
723 }
d961baa8 724 } else {
c28b3d6e
NTND
725 size = xsize_t(st.st_size);
726 if (size == 0) {
55fe6f51
NTND
727 if (sha1_stat) {
728 fill_stat_data(&sha1_stat->stat, &st);
729 hashcpy(sha1_stat->sha1, EMPTY_BLOB_SHA1_BIN);
730 sha1_stat->valid = 1;
731 }
c28b3d6e
NTND
732 close(fd);
733 return 0;
734 }
3733e694 735 buf = xmallocz(size);
c28b3d6e 736 if (read_in_full(fd, buf, size) != size) {
45d76f17 737 free(buf);
c28b3d6e
NTND
738 close(fd);
739 return -1;
740 }
45d76f17 741 buf[size++] = '\n';
c28b3d6e 742 close(fd);
55fe6f51
NTND
743 if (sha1_stat) {
744 int pos;
745 if (sha1_stat->valid &&
ed4efab1 746 !match_stat_data_racy(&the_index, &sha1_stat->stat, &st))
55fe6f51
NTND
747 ; /* no content change, ss->sha1 still good */
748 else if (check_index &&
749 (pos = cache_name_pos(fname, strlen(fname))) >= 0 &&
750 !ce_stage(active_cache[pos]) &&
751 ce_uptodate(active_cache[pos]) &&
752 !would_convert_to_git(fname))
99d1a986 753 hashcpy(sha1_stat->sha1,
754 active_cache[pos]->oid.hash);
55fe6f51
NTND
755 else
756 hash_sha1_file(buf, size, "blob", sha1_stat->sha1);
757 fill_stat_data(&sha1_stat->stat, &st);
758 sha1_stat->valid = 1;
759 }
6ba78238 760 }
453ec4bd 761
c082df24 762 el->filebuf = buf;
245e1c19 763
dde843e7
JH
764 if (skip_utf8_bom(&buf, size))
765 size -= buf - el->filebuf;
766
453ec4bd 767 entry = buf;
245e1c19 768
45d76f17
NTND
769 for (i = 0; i < size; i++) {
770 if (buf[i] == '\n') {
453ec4bd
LT
771 if (entry != buf + i && entry[0] != '#') {
772 buf[i - (i && buf[i-1] == '\r')] = 0;
7e2e4b37 773 trim_trailing_spaces(entry);
c04318e4 774 add_exclude(entry, base, baselen, el, lineno);
453ec4bd 775 }
c04318e4 776 lineno++;
453ec4bd
LT
777 entry = buf + i + 1;
778 }
779 }
780 return 0;
453ec4bd
LT
781}
782
55fe6f51
NTND
783int add_excludes_from_file_to_list(const char *fname, const char *base,
784 int baselen, struct exclude_list *el,
785 int check_index)
786{
787 return add_excludes(fname, base, baselen, el, check_index, NULL);
788}
789
c04318e4
AS
790struct exclude_list *add_exclude_list(struct dir_struct *dir,
791 int group_type, const char *src)
c082df24
AS
792{
793 struct exclude_list *el;
794 struct exclude_list_group *group;
795
796 group = &dir->exclude_list_group[group_type];
797 ALLOC_GROW(group->el, group->nr + 1, group->alloc);
798 el = &group->el[group->nr++];
799 memset(el, 0, sizeof(*el));
c04318e4 800 el->src = src;
c082df24
AS
801 return el;
802}
803
804/*
805 * Used to set up core.excludesfile and .git/info/exclude lists.
806 */
0dcb8d7f
NTND
807static void add_excludes_from_file_1(struct dir_struct *dir, const char *fname,
808 struct sha1_stat *sha1_stat)
453ec4bd 809{
c082df24 810 struct exclude_list *el;
ccad261f
NTND
811 /*
812 * catch setup_standard_excludes() that's called before
813 * dir->untracked is assigned. That function behaves
814 * differently when dir->untracked is non-NULL.
815 */
816 if (!dir->untracked)
817 dir->unmanaged_exclude_files++;
c04318e4 818 el = add_exclude_list(dir, EXC_FILE, fname);
0dcb8d7f 819 if (add_excludes(fname, "", 0, el, 0, sha1_stat) < 0)
453ec4bd
LT
820 die("cannot use %s as an exclude file", fname);
821}
822
0dcb8d7f
NTND
823void add_excludes_from_file(struct dir_struct *dir, const char *fname)
824{
ccad261f 825 dir->unmanaged_exclude_files++; /* see validate_untracked_cache() */
0dcb8d7f
NTND
826 add_excludes_from_file_1(dir, fname, NULL);
827}
828
82dce998
NTND
829int match_basename(const char *basename, int basenamelen,
830 const char *pattern, int prefix, int patternlen,
f8708998 831 unsigned flags)
593cb880
NTND
832{
833 if (prefix == patternlen) {
0b6e56df 834 if (patternlen == basenamelen &&
ba0897e6 835 !fspathncmp(pattern, basename, basenamelen))
593cb880
NTND
836 return 1;
837 } else if (flags & EXC_FLAG_ENDSWITH) {
0b6e56df 838 /* "*literal" matching against "fooliteral" */
593cb880 839 if (patternlen - 1 <= basenamelen &&
ba0897e6 840 !fspathncmp(pattern + 1,
0b6e56df
JH
841 basename + basenamelen - (patternlen - 1),
842 patternlen - 1))
593cb880
NTND
843 return 1;
844 } else {
0b6e56df
JH
845 if (fnmatch_icase_mem(pattern, patternlen,
846 basename, basenamelen,
847 0) == 0)
593cb880
NTND
848 return 1;
849 }
850 return 0;
851}
852
82dce998
NTND
853int match_pathname(const char *pathname, int pathlen,
854 const char *base, int baselen,
855 const char *pattern, int prefix, int patternlen,
f8708998 856 unsigned flags)
b5592632
NTND
857{
858 const char *name;
859 int namelen;
860
861 /*
862 * match with FNM_PATHNAME; the pattern has base implicitly
863 * in front of it.
864 */
865 if (*pattern == '/') {
866 pattern++;
982ac873 867 patternlen--;
b5592632
NTND
868 prefix--;
869 }
870
871 /*
872 * baselen does not count the trailing slash. base[] may or
873 * may not end with a trailing slash though.
874 */
875 if (pathlen < baselen + 1 ||
876 (baselen && pathname[baselen] != '/') ||
ba0897e6 877 fspathncmp(pathname, base, baselen))
b5592632
NTND
878 return 0;
879
880 namelen = baselen ? pathlen - baselen - 1 : pathlen;
881 name = pathname + pathlen - namelen;
882
883 if (prefix) {
884 /*
885 * if the non-wildcard part is longer than the
886 * remaining pathname, surely it cannot match.
887 */
888 if (prefix > namelen)
889 return 0;
890
ba0897e6 891 if (fspathncmp(pattern, name, prefix))
b5592632
NTND
892 return 0;
893 pattern += prefix;
ab3aebc1 894 patternlen -= prefix;
b5592632
NTND
895 name += prefix;
896 namelen -= prefix;
ab3aebc1
JK
897
898 /*
899 * If the whole pattern did not have a wildcard,
900 * then our prefix match is all we need; we
901 * do not need to call fnmatch at all.
902 */
5cee3493 903 if (!patternlen && !namelen)
ab3aebc1 904 return 1;
b5592632
NTND
905 }
906
ab3aebc1
JK
907 return fnmatch_icase_mem(pattern, patternlen,
908 name, namelen,
f30366b2 909 WM_PATHNAME) == 0;
b5592632
NTND
910}
911
578cd7c3
AS
912/*
913 * Scan the given exclude list in reverse to see whether pathname
914 * should be ignored. The first match (i.e. the last on the list), if
915 * any, determines the fate. Returns the exclude_list element which
916 * matched, or NULL for undecided.
453ec4bd 917 */
578cd7c3
AS
918static struct exclude *last_exclude_matching_from_list(const char *pathname,
919 int pathlen,
920 const char *basename,
921 int *dtype,
922 struct exclude_list *el)
453ec4bd 923{
e6efecc4 924 struct exclude *exc = NULL; /* undecided */
5cee3493 925 int i;
453ec4bd 926
35a94d44 927 if (!el->nr)
578cd7c3 928 return NULL; /* undefined */
d6b8fc30 929
35a94d44
NTND
930 for (i = el->nr - 1; 0 <= i; i--) {
931 struct exclude *x = el->excludes[i];
b5592632 932 const char *exclude = x->pattern;
b5592632 933 int prefix = x->nowildcardlen;
35a94d44
NTND
934
935 if (x->flags & EXC_FLAG_MUSTBEDIR) {
936 if (*dtype == DT_UNKNOWN)
937 *dtype = get_dtype(NULL, pathname, pathlen);
938 if (*dtype != DT_DIR)
939 continue;
940 }
d6b8fc30 941
35a94d44 942 if (x->flags & EXC_FLAG_NODIR) {
593cb880
NTND
943 if (match_basename(basename,
944 pathlen - (basename - pathname),
945 exclude, prefix, x->patternlen,
e6efecc4
NTND
946 x->flags)) {
947 exc = x;
948 break;
949 }
35a94d44
NTND
950 continue;
951 }
952
b5592632
NTND
953 assert(x->baselen == 0 || x->base[x->baselen - 1] == '/');
954 if (match_pathname(pathname, pathlen,
955 x->base, x->baselen ? x->baselen - 1 : 0,
e6efecc4
NTND
956 exclude, prefix, x->patternlen, x->flags)) {
957 exc = x;
958 break;
959 }
453ec4bd 960 }
e6efecc4 961 return exc;
578cd7c3
AS
962}
963
964/*
965 * Scan the list and let the last match determine the fate.
966 * Return 1 for exclude, 0 for include and -1 for undecided.
967 */
968int is_excluded_from_list(const char *pathname,
969 int pathlen, const char *basename, int *dtype,
970 struct exclude_list *el)
971{
972 struct exclude *exclude;
973 exclude = last_exclude_matching_from_list(pathname, pathlen, basename, dtype, el);
974 if (exclude)
975 return exclude->flags & EXC_FLAG_NEGATIVE ? 0 : 1;
453ec4bd
LT
976 return -1; /* undecided */
977}
978
46aa2f95
KB
979static struct exclude *last_exclude_matching_from_lists(struct dir_struct *dir,
980 const char *pathname, int pathlen, const char *basename,
981 int *dtype_p)
982{
983 int i, j;
984 struct exclude_list_group *group;
985 struct exclude *exclude;
986 for (i = EXC_CMDL; i <= EXC_FILE; i++) {
987 group = &dir->exclude_list_group[i];
988 for (j = group->nr - 1; j >= 0; j--) {
989 exclude = last_exclude_matching_from_list(
990 pathname, pathlen, basename, dtype_p,
991 &group->el[j]);
992 if (exclude)
993 return exclude;
994 }
995 }
996 return NULL;
997}
998
6cd5c582
KB
999/*
1000 * Loads the per-directory exclude list for the substring of base
1001 * which has a char length of baselen.
1002 */
1003static void prep_exclude(struct dir_struct *dir, const char *base, int baselen)
1004{
1005 struct exclude_list_group *group;
1006 struct exclude_list *el;
1007 struct exclude_stack *stk = NULL;
0dcb8d7f 1008 struct untracked_cache_dir *untracked;
6cd5c582
KB
1009 int current;
1010
6cd5c582
KB
1011 group = &dir->exclude_list_group[EXC_DIRS];
1012
d961baa8
NTND
1013 /*
1014 * Pop the exclude lists from the EXCL_DIRS exclude_list_group
6cd5c582 1015 * which originate from directories not in the prefix of the
d961baa8
NTND
1016 * path being checked.
1017 */
6cd5c582
KB
1018 while ((stk = dir->exclude_stack) != NULL) {
1019 if (stk->baselen <= baselen &&
aceb9429 1020 !strncmp(dir->basebuf.buf, base, stk->baselen))
6cd5c582
KB
1021 break;
1022 el = &group->el[dir->exclude_stack->exclude_ix];
1023 dir->exclude_stack = stk->prev;
95c6f271 1024 dir->exclude = NULL;
aceb9429 1025 free((char *)el->src); /* see strbuf_detach() below */
6cd5c582
KB
1026 clear_exclude_list(el);
1027 free(stk);
1028 group->nr--;
1029 }
1030
95c6f271
KB
1031 /* Skip traversing into sub directories if the parent is excluded */
1032 if (dir->exclude)
1033 return;
1034
aceb9429
NTND
1035 /*
1036 * Lazy initialization. All call sites currently just
1037 * memset(dir, 0, sizeof(*dir)) before use. Changing all of
1038 * them seems lots of work for little benefit.
1039 */
1040 if (!dir->basebuf.buf)
1041 strbuf_init(&dir->basebuf, PATH_MAX);
1042
6cd5c582
KB
1043 /* Read from the parent directories and push them down. */
1044 current = stk ? stk->baselen : -1;
aceb9429 1045 strbuf_setlen(&dir->basebuf, current < 0 ? 0 : current);
0dcb8d7f
NTND
1046 if (dir->untracked)
1047 untracked = stk ? stk->ucd : dir->untracked->root;
1048 else
1049 untracked = NULL;
1050
6cd5c582 1051 while (current < baselen) {
6cd5c582 1052 const char *cp;
0dcb8d7f 1053 struct sha1_stat sha1_stat;
6cd5c582 1054
03e11a71 1055 stk = xcalloc(1, sizeof(*stk));
6cd5c582
KB
1056 if (current < 0) {
1057 cp = base;
1058 current = 0;
d961baa8 1059 } else {
6cd5c582
KB
1060 cp = strchr(base + current + 1, '/');
1061 if (!cp)
1062 die("oops in prep_exclude");
1063 cp++;
0dcb8d7f
NTND
1064 untracked =
1065 lookup_untracked(dir->untracked, untracked,
1066 base + current,
1067 cp - base - current);
6cd5c582
KB
1068 }
1069 stk->prev = dir->exclude_stack;
1070 stk->baselen = cp - base;
95c6f271 1071 stk->exclude_ix = group->nr;
0dcb8d7f 1072 stk->ucd = untracked;
95c6f271 1073 el = add_exclude_list(dir, EXC_DIRS, NULL);
aceb9429
NTND
1074 strbuf_add(&dir->basebuf, base + current, stk->baselen - current);
1075 assert(stk->baselen == dir->basebuf.len);
95c6f271
KB
1076
1077 /* Abort if the directory is excluded */
1078 if (stk->baselen) {
1079 int dt = DT_DIR;
aceb9429 1080 dir->basebuf.buf[stk->baselen - 1] = 0;
95c6f271 1081 dir->exclude = last_exclude_matching_from_lists(dir,
aceb9429
NTND
1082 dir->basebuf.buf, stk->baselen - 1,
1083 dir->basebuf.buf + current, &dt);
1084 dir->basebuf.buf[stk->baselen - 1] = '/';
c3c327de
KB
1085 if (dir->exclude &&
1086 dir->exclude->flags & EXC_FLAG_NEGATIVE)
1087 dir->exclude = NULL;
95c6f271 1088 if (dir->exclude) {
95c6f271
KB
1089 dir->exclude_stack = stk;
1090 return;
1091 }
1092 }
1093
aceb9429 1094 /* Try to read per-directory file */
0dcb8d7f
NTND
1095 hashclr(sha1_stat.sha1);
1096 sha1_stat.valid = 0;
27b099ae
NTND
1097 if (dir->exclude_per_dir &&
1098 /*
1099 * If we know that no files have been added in
1100 * this directory (i.e. valid_cached_dir() has
1101 * been executed and set untracked->valid) ..
1102 */
1103 (!untracked || !untracked->valid ||
1104 /*
1105 * .. and .gitignore does not exist before
7687252f
DT
1106 * (i.e. null exclude_sha1). Then we can skip
1107 * loading .gitignore, which would result in
1108 * ENOENT anyway.
27b099ae
NTND
1109 */
1110 !is_null_sha1(untracked->exclude_sha1))) {
95c6f271
KB
1111 /*
1112 * dir->basebuf gets reused by the traversal, but we
1113 * need fname to remain unchanged to ensure the src
1114 * member of each struct exclude correctly
1115 * back-references its source file. Other invocations
1116 * of add_exclude_list provide stable strings, so we
aceb9429 1117 * strbuf_detach() and free() here in the caller.
95c6f271 1118 */
aceb9429
NTND
1119 struct strbuf sb = STRBUF_INIT;
1120 strbuf_addbuf(&sb, &dir->basebuf);
1121 strbuf_addstr(&sb, dir->exclude_per_dir);
1122 el->src = strbuf_detach(&sb, NULL);
0dcb8d7f
NTND
1123 add_excludes(el->src, el->src, stk->baselen, el, 1,
1124 untracked ? &sha1_stat : NULL);
1125 }
5ebf79ad
NTND
1126 /*
1127 * NEEDSWORK: when untracked cache is enabled, prep_exclude()
1128 * will first be called in valid_cached_dir() then maybe many
1129 * times more in last_exclude_matching(). When the cache is
1130 * used, last_exclude_matching() will not be called and
1131 * reading .gitignore content will be a waste.
1132 *
1133 * So when it's called by valid_cached_dir() and we can get
1134 * .gitignore SHA-1 from the index (i.e. .gitignore is not
1135 * modified on work tree), we could delay reading the
1136 * .gitignore content until we absolutely need it in
1137 * last_exclude_matching(). Be careful about ignore rule
1138 * order, though, if you do that.
1139 */
1140 if (untracked &&
1141 hashcmp(sha1_stat.sha1, untracked->exclude_sha1)) {
1142 invalidate_gitignore(dir->untracked, untracked);
0dcb8d7f 1143 hashcpy(untracked->exclude_sha1, sha1_stat.sha1);
95c6f271 1144 }
6cd5c582
KB
1145 dir->exclude_stack = stk;
1146 current = stk->baselen;
1147 }
aceb9429 1148 strbuf_setlen(&dir->basebuf, baselen);
6cd5c582
KB
1149}
1150
f4cd69a6
AS
1151/*
1152 * Loads the exclude lists for the directory containing pathname, then
1153 * scans all exclude lists to determine whether pathname is excluded.
1154 * Returns the exclude_list element which matched, or NULL for
1155 * undecided.
1156 */
b07bc8c8 1157struct exclude *last_exclude_matching(struct dir_struct *dir,
f4cd69a6
AS
1158 const char *pathname,
1159 int *dtype_p)
453ec4bd
LT
1160{
1161 int pathlen = strlen(pathname);
68492fc7
LK
1162 const char *basename = strrchr(pathname, '/');
1163 basename = (basename) ? basename+1 : pathname;
453ec4bd 1164
63d285c8 1165 prep_exclude(dir, pathname, basename-pathname);
c082df24 1166
95c6f271
KB
1167 if (dir->exclude)
1168 return dir->exclude;
1169
46aa2f95
KB
1170 return last_exclude_matching_from_lists(dir, pathname, pathlen,
1171 basename, dtype_p);
f4cd69a6
AS
1172}
1173
1174/*
1175 * Loads the exclude lists for the directory containing pathname, then
1176 * scans all exclude lists to determine whether pathname is excluded.
1177 * Returns 1 if true, otherwise 0.
1178 */
b07bc8c8 1179int is_excluded(struct dir_struct *dir, const char *pathname, int *dtype_p)
f4cd69a6
AS
1180{
1181 struct exclude *exclude =
1182 last_exclude_matching(dir, pathname, dtype_p);
1183 if (exclude)
1184 return exclude->flags & EXC_FLAG_NEGATIVE ? 0 : 1;
453ec4bd
LT
1185 return 0;
1186}
1187
f3fa1838
JH
1188static struct dir_entry *dir_entry_new(const char *pathname, int len)
1189{
453ec4bd
LT
1190 struct dir_entry *ent;
1191
96ffc06f 1192 FLEX_ALLOC_MEM(ent, name, pathname, len);
453ec4bd 1193 ent->len = len;
4d06f8ac 1194 return ent;
453ec4bd
LT
1195}
1196
159b3212 1197static struct dir_entry *dir_add_name(struct dir_struct *dir, const char *pathname, int len)
6815e569 1198{
ebbd7439 1199 if (cache_file_exists(pathname, len, ignore_case))
6815e569
JK
1200 return NULL;
1201
25fd2f7a 1202 ALLOC_GROW(dir->entries, dir->nr+1, dir->alloc);
6815e569
JK
1203 return dir->entries[dir->nr++] = dir_entry_new(pathname, len);
1204}
1205
108da0db 1206struct dir_entry *dir_add_ignored(struct dir_struct *dir, const char *pathname, int len)
2abd31b0 1207{
6e4f981f 1208 if (!cache_name_is_other(pathname, len))
2abd31b0
JK
1209 return NULL;
1210
25fd2f7a 1211 ALLOC_GROW(dir->ignored, dir->ignored_nr+1, dir->ignored_alloc);
2abd31b0
JK
1212 return dir->ignored[dir->ignored_nr++] = dir_entry_new(pathname, len);
1213}
1214
09595258
LT
1215enum exist_status {
1216 index_nonexistent = 0,
1217 index_directory,
4b05548f 1218 index_gitdir
09595258
LT
1219};
1220
5102c617 1221/*
71261027 1222 * Do not use the alphabetically sorted index to look up
5102c617 1223 * the directory name; instead, use the case insensitive
ebbd7439 1224 * directory hash.
5102c617
JJ
1225 */
1226static enum exist_status directory_exists_in_index_icase(const char *dirname, int len)
1227{
41284eb0 1228 struct cache_entry *ce;
5102c617 1229
41284eb0 1230 if (cache_dir_exists(dirname, len))
5102c617
JJ
1231 return index_directory;
1232
41284eb0
DT
1233 ce = cache_file_exists(dirname, len, ignore_case);
1234 if (ce && S_ISGITLINK(ce->ce_mode))
5102c617
JJ
1235 return index_gitdir;
1236
5102c617
JJ
1237 return index_nonexistent;
1238}
1239
09595258
LT
1240/*
1241 * The index sorts alphabetically by entry name, which
1242 * means that a gitlink sorts as '\0' at the end, while
1243 * a directory (which is defined not as an entry, but as
1244 * the files it contains) will sort with the '/' at the
1245 * end.
1246 */
1247static enum exist_status directory_exists_in_index(const char *dirname, int len)
453ec4bd 1248{
5102c617
JJ
1249 int pos;
1250
1251 if (ignore_case)
1252 return directory_exists_in_index_icase(dirname, len);
1253
1254 pos = cache_name_pos(dirname, len);
09595258
LT
1255 if (pos < 0)
1256 pos = -pos-1;
1257 while (pos < active_nr) {
9c5e6c80 1258 const struct cache_entry *ce = active_cache[pos++];
09595258
LT
1259 unsigned char endchar;
1260
1261 if (strncmp(ce->name, dirname, len))
1262 break;
1263 endchar = ce->name[len];
1264 if (endchar > '/')
1265 break;
1266 if (endchar == '/')
1267 return index_directory;
7a51ed66 1268 if (!endchar && S_ISGITLINK(ce->ce_mode))
09595258
LT
1269 return index_gitdir;
1270 }
1271 return index_nonexistent;
1272}
1273
1274/*
1275 * When we find a directory when traversing the filesystem, we
1276 * have three distinct cases:
1277 *
1278 * - ignore it
1279 * - see it as a directory
1280 * - recurse into it
1281 *
1282 * and which one we choose depends on a combination of existing
1283 * git index contents and the flags passed into the directory
1284 * traversal routine.
1285 *
1286 * Case 1: If we *already* have entries in the index under that
5bd8e2d8
KB
1287 * directory name, we always recurse into the directory to see
1288 * all the files.
09595258
LT
1289 *
1290 * Case 2: If we *already* have that directory name as a gitlink,
1291 * we always continue to see it as a gitlink, regardless of whether
1292 * there is an actual git directory there or not (it might not
1293 * be checked out as a subproject!)
1294 *
1295 * Case 3: if we didn't have it in the index previously, we
1296 * have a few sub-cases:
1297 *
1298 * (a) if "show_other_directories" is true, we show it as
1299 * just a directory, unless "hide_empty_directories" is
defd7c7b
KB
1300 * also true, in which case we need to check if it contains any
1301 * untracked and / or ignored files.
09595258 1302 * (b) if it looks like a git directory, and we don't have
302b9282 1303 * 'no_gitlinks' set we treat it as a gitlink, and show it
09595258
LT
1304 * as a directory.
1305 * (c) otherwise, we recurse into it.
1306 */
defd7c7b 1307static enum path_treatment treat_directory(struct dir_struct *dir,
0dcb8d7f 1308 struct untracked_cache_dir *untracked,
2e5910f2 1309 const char *dirname, int len, int baselen, int exclude,
e1b8c7bd 1310 const struct pathspec *pathspec)
09595258
LT
1311{
1312 /* The "len-1" is to strip the final '/' */
1313 switch (directory_exists_in_index(dirname, len-1)) {
1314 case index_directory:
defd7c7b 1315 return path_recurse;
09595258
LT
1316
1317 case index_gitdir:
26c986e1 1318 return path_none;
09595258
LT
1319
1320 case index_nonexistent:
7c4c97c0 1321 if (dir->flags & DIR_SHOW_OTHER_DIRECTORIES)
09595258 1322 break;
7c4c97c0 1323 if (!(dir->flags & DIR_NO_GITLINKS)) {
09595258
LT
1324 unsigned char sha1[20];
1325 if (resolve_gitlink_ref(dirname, "HEAD", sha1) == 0)
defd7c7b 1326 return path_untracked;
09595258 1327 }
defd7c7b 1328 return path_recurse;
09595258
LT
1329 }
1330
1331 /* This is the "show_other_directories" case */
721ac4ed 1332
184d2a8e 1333 if (!(dir->flags & DIR_HIDE_EMPTY_DIRECTORIES))
defd7c7b
KB
1334 return exclude ? path_excluded : path_untracked;
1335
2e5910f2
DT
1336 untracked = lookup_untracked(dir->untracked, untracked,
1337 dirname + baselen, len - baselen);
0dcb8d7f 1338 return read_directory_recursive(dir, dirname, len,
e1b8c7bd 1339 untracked, 1, pathspec);
453ec4bd
LT
1340}
1341
9fc42d60
LT
1342/*
1343 * This is an inexact early pruning of any recursive directory
1344 * reading - if the path cannot possibly be in the pathspec,
1345 * return true, and we'll skip it early.
1346 */
e1b8c7bd
BW
1347static int simplify_away(const char *path, int pathlen,
1348 const struct pathspec *pathspec)
9fc42d60 1349{
e1b8c7bd 1350 int i;
9fc42d60 1351
e1b8c7bd
BW
1352 if (!pathspec || !pathspec->nr)
1353 return 0;
1354
1355 GUARD_PATHSPEC(pathspec,
1356 PATHSPEC_FROMTOP |
1357 PATHSPEC_MAXDEPTH |
1358 PATHSPEC_LITERAL |
1359 PATHSPEC_GLOB |
1360 PATHSPEC_ICASE |
1361 PATHSPEC_EXCLUDE);
1362
1363 for (i = 0; i < pathspec->nr; i++) {
1364 const struct pathspec_item *item = &pathspec->items[i];
1365 int len = item->nowildcard_len;
1366
1367 if (len > pathlen)
1368 len = pathlen;
1369 if (!ps_strncmp(item, item->match, path, len))
1370 return 0;
9fc42d60 1371 }
e1b8c7bd
BW
1372
1373 return 1;
9fc42d60
LT
1374}
1375
29209cbe
JK
1376/*
1377 * This function tells us whether an excluded path matches a
1378 * list of "interesting" pathspecs. That is, whether a path matched
1379 * by any of the pathspecs could possibly be ignored by excluding
1380 * the specified path. This can happen if:
1381 *
1382 * 1. the path is mentioned explicitly in the pathspec
1383 *
1384 * 2. the path is a directory prefix of some element in the
1385 * pathspec
1386 */
e1b8c7bd
BW
1387static int exclude_matches_pathspec(const char *path, int pathlen,
1388 const struct pathspec *pathspec)
1389{
1390 int i;
1391
1392 if (!pathspec || !pathspec->nr)
1393 return 0;
1394
1395 GUARD_PATHSPEC(pathspec,
1396 PATHSPEC_FROMTOP |
1397 PATHSPEC_MAXDEPTH |
1398 PATHSPEC_LITERAL |
1399 PATHSPEC_GLOB |
1400 PATHSPEC_ICASE |
1401 PATHSPEC_EXCLUDE);
1402
1403 for (i = 0; i < pathspec->nr; i++) {
1404 const struct pathspec_item *item = &pathspec->items[i];
1405 int len = item->nowildcard_len;
1406
1407 if (len == pathlen &&
1408 !ps_strncmp(item, item->match, path, pathlen))
1409 return 1;
1410 if (len > pathlen &&
1411 item->match[pathlen] == '/' &&
1412 !ps_strncmp(item, item->match, path, pathlen))
1413 return 1;
e96980ef
JK
1414 }
1415 return 0;
1416}
1417
443e061a
LT
1418static int get_index_dtype(const char *path, int len)
1419{
1420 int pos;
9c5e6c80 1421 const struct cache_entry *ce;
443e061a 1422
ebbd7439 1423 ce = cache_file_exists(path, len, 0);
443e061a
LT
1424 if (ce) {
1425 if (!ce_uptodate(ce))
1426 return DT_UNKNOWN;
1427 if (S_ISGITLINK(ce->ce_mode))
1428 return DT_DIR;
1429 /*
1430 * Nobody actually cares about the
1431 * difference between DT_LNK and DT_REG
1432 */
1433 return DT_REG;
1434 }
1435
1436 /* Try to look it up as a directory */
1437 pos = cache_name_pos(path, len);
1438 if (pos >= 0)
1439 return DT_UNKNOWN;
1440 pos = -pos-1;
1441 while (pos < active_nr) {
1442 ce = active_cache[pos++];
1443 if (strncmp(ce->name, path, len))
1444 break;
1445 if (ce->name[len] > '/')
1446 break;
1447 if (ce->name[len] < '/')
1448 continue;
1449 if (!ce_uptodate(ce))
1450 break; /* continue? */
1451 return DT_DIR;
1452 }
1453 return DT_UNKNOWN;
1454}
1455
caa6b782 1456static int get_dtype(struct dirent *de, const char *path, int len)
07134421 1457{
6831a88a 1458 int dtype = de ? DTYPE(de) : DT_UNKNOWN;
07134421
LT
1459 struct stat st;
1460
1461 if (dtype != DT_UNKNOWN)
1462 return dtype;
443e061a
LT
1463 dtype = get_index_dtype(path, len);
1464 if (dtype != DT_UNKNOWN)
1465 return dtype;
1466 if (lstat(path, &st))
07134421
LT
1467 return dtype;
1468 if (S_ISREG(st.st_mode))
1469 return DT_REG;
1470 if (S_ISDIR(st.st_mode))
1471 return DT_DIR;
1472 if (S_ISLNK(st.st_mode))
1473 return DT_LNK;
1474 return dtype;
1475}
1476
16e2cfa9 1477static enum path_treatment treat_one_path(struct dir_struct *dir,
0dcb8d7f 1478 struct untracked_cache_dir *untracked,
49dc2cc2 1479 struct strbuf *path,
2e5910f2 1480 int baselen,
e1b8c7bd 1481 const struct pathspec *pathspec,
16e2cfa9 1482 int dtype, struct dirent *de)
53cc5356 1483{
8aaf8d77 1484 int exclude;
ebbd7439 1485 int has_path_in_index = !!cache_file_exists(path->buf, path->len, ignore_case);
2eac2a4c 1486
8aaf8d77
KB
1487 if (dtype == DT_UNKNOWN)
1488 dtype = get_dtype(de, path->buf, path->len);
1489
1490 /* Always exclude indexed files */
2eac2a4c 1491 if (dtype != DT_DIR && has_path_in_index)
defd7c7b 1492 return path_none;
8aaf8d77 1493
2eac2a4c
JH
1494 /*
1495 * When we are looking at a directory P in the working tree,
1496 * there are three cases:
1497 *
1498 * (1) P exists in the index. Everything inside the directory P in
1499 * the working tree needs to go when P is checked out from the
1500 * index.
1501 *
1502 * (2) P does not exist in the index, but there is P/Q in the index.
1503 * We know P will stay a directory when we check out the contents
1504 * of the index, but we do not know yet if there is a directory
1505 * P/Q in the working tree to be killed, so we need to recurse.
1506 *
1507 * (3) P does not exist in the index, and there is no P/Q in the index
1508 * to require P to be a directory, either. Only in this case, we
1509 * know that everything inside P will not be killed without
1510 * recursing.
1511 */
1512 if ((dir->flags & DIR_COLLECT_KILLED_ONLY) &&
1513 (dtype == DT_DIR) &&
de372b1b
ES
1514 !has_path_in_index &&
1515 (directory_exists_in_index(path->buf, path->len) == index_nonexistent))
1516 return path_none;
8aaf8d77
KB
1517
1518 exclude = is_excluded(dir, path->buf, &dtype);
53cc5356
JH
1519
1520 /*
1521 * Excluded? If we don't explicitly want to show
1522 * ignored files, ignore it
1523 */
0aaf62b6 1524 if (exclude && !(dir->flags & (DIR_SHOW_IGNORED|DIR_SHOW_IGNORED_TOO)))
defd7c7b 1525 return path_excluded;
53cc5356 1526
53cc5356
JH
1527 switch (dtype) {
1528 default:
defd7c7b 1529 return path_none;
53cc5356 1530 case DT_DIR:
49dc2cc2 1531 strbuf_addch(path, '/');
2e5910f2 1532 return treat_directory(dir, untracked, path->buf, path->len,
e1b8c7bd 1533 baselen, exclude, pathspec);
53cc5356
JH
1534 case DT_REG:
1535 case DT_LNK:
defd7c7b 1536 return exclude ? path_excluded : path_untracked;
53cc5356 1537 }
53cc5356
JH
1538}
1539
91a2288b
NTND
1540static enum path_treatment treat_path_fast(struct dir_struct *dir,
1541 struct untracked_cache_dir *untracked,
1542 struct cached_dir *cdir,
1543 struct strbuf *path,
1544 int baselen,
e1b8c7bd 1545 const struct pathspec *pathspec)
91a2288b
NTND
1546{
1547 strbuf_setlen(path, baselen);
1548 if (!cdir->ucd) {
1549 strbuf_addstr(path, cdir->file);
1550 return path_untracked;
1551 }
1552 strbuf_addstr(path, cdir->ucd->name);
1553 /* treat_one_path() does this before it calls treat_directory() */
00b6c178 1554 strbuf_complete(path, '/');
91a2288b
NTND
1555 if (cdir->ucd->check_only)
1556 /*
1557 * check_only is set as a result of treat_directory() getting
1558 * to its bottom. Verify again the same set of directories
1559 * with check_only set.
1560 */
1561 return read_directory_recursive(dir, path->buf, path->len,
e1b8c7bd 1562 cdir->ucd, 1, pathspec);
91a2288b
NTND
1563 /*
1564 * We get path_recurse in the first run when
1565 * directory_exists_in_index() returns index_nonexistent. We
1566 * are sure that new changes in the index does not impact the
1567 * outcome. Return now.
1568 */
1569 return path_recurse;
1570}
1571
16e2cfa9 1572static enum path_treatment treat_path(struct dir_struct *dir,
0dcb8d7f 1573 struct untracked_cache_dir *untracked,
cf7c6148 1574 struct cached_dir *cdir,
49dc2cc2 1575 struct strbuf *path,
16e2cfa9 1576 int baselen,
e1b8c7bd 1577 const struct pathspec *pathspec)
16e2cfa9
JH
1578{
1579 int dtype;
cf7c6148 1580 struct dirent *de = cdir->de;
16e2cfa9 1581
91a2288b
NTND
1582 if (!de)
1583 return treat_path_fast(dir, untracked, cdir, path,
e1b8c7bd 1584 baselen, pathspec);
16e2cfa9 1585 if (is_dot_or_dotdot(de->d_name) || !strcmp(de->d_name, ".git"))
defd7c7b 1586 return path_none;
49dc2cc2
RS
1587 strbuf_setlen(path, baselen);
1588 strbuf_addstr(path, de->d_name);
e1b8c7bd 1589 if (simplify_away(path->buf, path->len, pathspec))
defd7c7b 1590 return path_none;
16e2cfa9
JH
1591
1592 dtype = DTYPE(de);
e1b8c7bd 1593 return treat_one_path(dir, untracked, path, baselen, pathspec, dtype, de);
0dcb8d7f
NTND
1594}
1595
1596static void add_untracked(struct untracked_cache_dir *dir, const char *name)
1597{
1598 if (!dir)
1599 return;
1600 ALLOC_GROW(dir->untracked, dir->untracked_nr + 1,
1601 dir->untracked_alloc);
1602 dir->untracked[dir->untracked_nr++] = xstrdup(name);
16e2cfa9
JH
1603}
1604
91a2288b
NTND
1605static int valid_cached_dir(struct dir_struct *dir,
1606 struct untracked_cache_dir *untracked,
1607 struct strbuf *path,
1608 int check_only)
1609{
1610 struct stat st;
1611
1612 if (!untracked)
1613 return 0;
1614
1615 if (stat(path->len ? path->buf : ".", &st)) {
1616 invalidate_directory(dir->untracked, untracked);
1617 memset(&untracked->stat_data, 0, sizeof(untracked->stat_data));
1618 return 0;
1619 }
1620 if (!untracked->valid ||
ed4efab1 1621 match_stat_data_racy(&the_index, &untracked->stat_data, &st)) {
91a2288b
NTND
1622 if (untracked->valid)
1623 invalidate_directory(dir->untracked, untracked);
1624 fill_stat_data(&untracked->stat_data, &st);
1625 return 0;
1626 }
1627
1628 if (untracked->check_only != !!check_only) {
1629 invalidate_directory(dir->untracked, untracked);
1630 return 0;
1631 }
1632
1633 /*
1634 * prep_exclude will be called eventually on this directory,
1635 * but it's called much later in last_exclude_matching(). We
1636 * need it now to determine the validity of the cache for this
1637 * path. The next calls will be nearly no-op, the way
1638 * prep_exclude() is designed.
1639 */
1640 if (path->len && path->buf[path->len - 1] != '/') {
1641 strbuf_addch(path, '/');
1642 prep_exclude(dir, path->buf, path->len);
1643 strbuf_setlen(path, path->len - 1);
1644 } else
1645 prep_exclude(dir, path->buf, path->len);
1646
1647 /* hopefully prep_exclude() haven't invalidated this entry... */
1648 return untracked->valid;
1649}
1650
cf7c6148
NTND
1651static int open_cached_dir(struct cached_dir *cdir,
1652 struct dir_struct *dir,
1653 struct untracked_cache_dir *untracked,
1654 struct strbuf *path,
1655 int check_only)
1656{
1657 memset(cdir, 0, sizeof(*cdir));
1658 cdir->untracked = untracked;
91a2288b
NTND
1659 if (valid_cached_dir(dir, untracked, path, check_only))
1660 return 0;
cf7c6148 1661 cdir->fdir = opendir(path->len ? path->buf : ".");
91a2288b
NTND
1662 if (dir->untracked)
1663 dir->untracked->dir_opened++;
cf7c6148
NTND
1664 if (!cdir->fdir)
1665 return -1;
1666 return 0;
1667}
1668
1669static int read_cached_dir(struct cached_dir *cdir)
1670{
1671 if (cdir->fdir) {
1672 cdir->de = readdir(cdir->fdir);
1673 if (!cdir->de)
1674 return -1;
1675 return 0;
1676 }
91a2288b
NTND
1677 while (cdir->nr_dirs < cdir->untracked->dirs_nr) {
1678 struct untracked_cache_dir *d = cdir->untracked->dirs[cdir->nr_dirs];
26cb0182
NTND
1679 if (!d->recurse) {
1680 cdir->nr_dirs++;
1681 continue;
1682 }
91a2288b
NTND
1683 cdir->ucd = d;
1684 cdir->nr_dirs++;
1685 return 0;
1686 }
1687 cdir->ucd = NULL;
1688 if (cdir->nr_files < cdir->untracked->untracked_nr) {
1689 struct untracked_cache_dir *d = cdir->untracked;
1690 cdir->file = d->untracked[cdir->nr_files++];
1691 return 0;
1692 }
cf7c6148
NTND
1693 return -1;
1694}
1695
1696static void close_cached_dir(struct cached_dir *cdir)
1697{
1698 if (cdir->fdir)
1699 closedir(cdir->fdir);
91a2288b
NTND
1700 /*
1701 * We have gone through this directory and found no untracked
1702 * entries. Mark it valid.
1703 */
26cb0182 1704 if (cdir->untracked) {
91a2288b 1705 cdir->untracked->valid = 1;
26cb0182
NTND
1706 cdir->untracked->recurse = 1;
1707 }
16e2cfa9
JH
1708}
1709
453ec4bd
LT
1710/*
1711 * Read a directory tree. We currently ignore anything but
1712 * directories, regular files and symlinks. That's because git
1713 * doesn't handle them at all yet. Maybe that will change some
1714 * day.
1715 *
1716 * Also, we ignore the name ".git" (even if it is not a directory).
1717 * That likely will not change.
defd7c7b
KB
1718 *
1719 * Returns the most significant path_treatment value encountered in the scan.
453ec4bd 1720 */
defd7c7b 1721static enum path_treatment read_directory_recursive(struct dir_struct *dir,
53cc5356 1722 const char *base, int baselen,
0dcb8d7f 1723 struct untracked_cache_dir *untracked, int check_only,
e1b8c7bd 1724 const struct pathspec *pathspec)
453ec4bd 1725{
cf7c6148 1726 struct cached_dir cdir;
defd7c7b 1727 enum path_treatment state, subdir_state, dir_state = path_none;
bef36921 1728 struct strbuf path = STRBUF_INIT;
453ec4bd 1729
bef36921 1730 strbuf_add(&path, base, baselen);
02cb6753 1731
cf7c6148 1732 if (open_cached_dir(&cdir, dir, untracked, &path, check_only))
1528d247
RS
1733 goto out;
1734
0dcb8d7f
NTND
1735 if (untracked)
1736 untracked->check_only = !!check_only;
1737
cf7c6148 1738 while (!read_cached_dir(&cdir)) {
defd7c7b 1739 /* check how the file or directory should be treated */
e1b8c7bd
BW
1740 state = treat_path(dir, untracked, &cdir, &path,
1741 baselen, pathspec);
0dcb8d7f 1742
defd7c7b
KB
1743 if (state > dir_state)
1744 dir_state = state;
1745
1746 /* recurse into subdir if instructed by treat_path */
1747 if (state == path_recurse) {
0dcb8d7f
NTND
1748 struct untracked_cache_dir *ud;
1749 ud = lookup_untracked(dir->untracked, untracked,
1750 path.buf + baselen,
1751 path.len - baselen);
1752 subdir_state =
e1b8c7bd
BW
1753 read_directory_recursive(dir, path.buf,
1754 path.len, ud,
1755 check_only, pathspec);
defd7c7b
KB
1756 if (subdir_state > dir_state)
1757 dir_state = subdir_state;
1758 }
1759
1760 if (check_only) {
1761 /* abort early if maximum state has been reached */
0dcb8d7f 1762 if (dir_state == path_untracked) {
91a2288b 1763 if (cdir.fdir)
0dcb8d7f 1764 add_untracked(untracked, path.buf + baselen);
defd7c7b 1765 break;
0dcb8d7f 1766 }
defd7c7b 1767 /* skip the dir_add_* part */
02cb6753 1768 continue;
453ec4bd 1769 }
defd7c7b
KB
1770
1771 /* add the path to the appropriate result list */
1772 switch (state) {
1773 case path_excluded:
1774 if (dir->flags & DIR_SHOW_IGNORED)
1775 dir_add_name(dir, path.buf, path.len);
0aaf62b6
KB
1776 else if ((dir->flags & DIR_SHOW_IGNORED_TOO) ||
1777 ((dir->flags & DIR_COLLECT_IGNORED) &&
1778 exclude_matches_pathspec(path.buf, path.len,
e1b8c7bd 1779 pathspec)))
0aaf62b6 1780 dir_add_ignored(dir, path.buf, path.len);
defd7c7b
KB
1781 break;
1782
1783 case path_untracked:
0dcb8d7f
NTND
1784 if (dir->flags & DIR_SHOW_IGNORED)
1785 break;
1786 dir_add_name(dir, path.buf, path.len);
91a2288b 1787 if (cdir.fdir)
0dcb8d7f 1788 add_untracked(untracked, path.buf + baselen);
1528d247 1789 break;
defd7c7b
KB
1790
1791 default:
1792 break;
1793 }
453ec4bd 1794 }
cf7c6148 1795 close_cached_dir(&cdir);
1528d247 1796 out:
bef36921 1797 strbuf_release(&path);
453ec4bd 1798
defd7c7b 1799 return dir_state;
453ec4bd
LT
1800}
1801
1802static int cmp_name(const void *p1, const void *p2)
1803{
1804 const struct dir_entry *e1 = *(const struct dir_entry **)p1;
1805 const struct dir_entry *e2 = *(const struct dir_entry **)p2;
1806
ccdd4a0f 1807 return name_compare(e1->name, e1->len, e2->name, e2->len);
453ec4bd
LT
1808}
1809
48ffef96
JH
1810static int treat_leading_path(struct dir_struct *dir,
1811 const char *path, int len,
e1b8c7bd 1812 const struct pathspec *pathspec)
48ffef96 1813{
49dc2cc2
RS
1814 struct strbuf sb = STRBUF_INIT;
1815 int baselen, rc = 0;
48ffef96 1816 const char *cp;
be8a84c5 1817 int old_flags = dir->flags;
48ffef96
JH
1818
1819 while (len && path[len - 1] == '/')
1820 len--;
1821 if (!len)
1822 return 1;
1823 baselen = 0;
be8a84c5 1824 dir->flags &= ~DIR_SHOW_OTHER_DIRECTORIES;
48ffef96
JH
1825 while (1) {
1826 cp = path + baselen + !!baselen;
1827 cp = memchr(cp, '/', path + len - cp);
1828 if (!cp)
1829 baselen = len;
1830 else
1831 baselen = cp - path;
49dc2cc2
RS
1832 strbuf_setlen(&sb, 0);
1833 strbuf_add(&sb, path, baselen);
1834 if (!is_directory(sb.buf))
1835 break;
e1b8c7bd 1836 if (simplify_away(sb.buf, sb.len, pathspec))
49dc2cc2 1837 break;
e1b8c7bd 1838 if (treat_one_path(dir, NULL, &sb, baselen, pathspec,
defd7c7b 1839 DT_DIR, NULL) == path_none)
49dc2cc2
RS
1840 break; /* do not recurse into it */
1841 if (len <= baselen) {
1842 rc = 1;
1843 break; /* finished checking */
1844 }
48ffef96 1845 }
49dc2cc2 1846 strbuf_release(&sb);
be8a84c5 1847 dir->flags = old_flags;
49dc2cc2 1848 return rc;
48ffef96
JH
1849}
1850
1e8fef60
NTND
1851static const char *get_ident_string(void)
1852{
1853 static struct strbuf sb = STRBUF_INIT;
1854 struct utsname uts;
1855
1856 if (sb.len)
1857 return sb.buf;
100e4337 1858 if (uname(&uts) < 0)
1e8fef60 1859 die_errno(_("failed to get kernel name and information"));
0e0f7618
CC
1860 strbuf_addf(&sb, "Location %s, system %s", get_git_work_tree(),
1861 uts.sysname);
1e8fef60
NTND
1862 return sb.buf;
1863}
1864
1865static int ident_in_untracked(const struct untracked_cache *uc)
1866{
0e0f7618
CC
1867 /*
1868 * Previous git versions may have saved many NUL separated
1869 * strings in the "ident" field, but it is insane to manage
1870 * many locations, so just take care of the first one.
1871 */
1e8fef60 1872
0e0f7618 1873 return !strcmp(uc->ident.buf, get_ident_string());
1e8fef60
NTND
1874}
1875
0e0f7618 1876static void set_untracked_ident(struct untracked_cache *uc)
1e8fef60 1877{
0e0f7618 1878 strbuf_reset(&uc->ident);
1e8fef60 1879 strbuf_addstr(&uc->ident, get_ident_string());
0e0f7618
CC
1880
1881 /*
1882 * This strbuf used to contain a list of NUL separated
1883 * strings, so save NUL too for backward compatibility.
1884 */
1e8fef60
NTND
1885 strbuf_addch(&uc->ident, 0);
1886}
1887
4a4ca479
CC
1888static void new_untracked_cache(struct index_state *istate)
1889{
1890 struct untracked_cache *uc = xcalloc(1, sizeof(*uc));
1891 strbuf_init(&uc->ident, 100);
1892 uc->exclude_per_dir = ".gitignore";
1893 /* should be the same flags used by git-status */
1894 uc->dir_flags = DIR_SHOW_OTHER_DIRECTORIES | DIR_HIDE_EMPTY_DIRECTORIES;
0e0f7618 1895 set_untracked_ident(uc);
4a4ca479 1896 istate->untracked = uc;
0e0f7618 1897 istate->cache_changed |= UNTRACKED_CHANGED;
4a4ca479
CC
1898}
1899
1900void add_untracked_cache(struct index_state *istate)
1901{
1902 if (!istate->untracked) {
1903 new_untracked_cache(istate);
0e0f7618
CC
1904 } else {
1905 if (!ident_in_untracked(istate->untracked)) {
1906 free_untracked_cache(istate->untracked);
1907 new_untracked_cache(istate);
1908 }
1909 }
4a4ca479
CC
1910}
1911
07b29bfd
CC
1912void remove_untracked_cache(struct index_state *istate)
1913{
1914 if (istate->untracked) {
1915 free_untracked_cache(istate->untracked);
1916 istate->untracked = NULL;
1917 istate->cache_changed |= UNTRACKED_CHANGED;
1918 }
1919}
1920
ccad261f
NTND
1921static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *dir,
1922 int base_len,
1923 const struct pathspec *pathspec)
1924{
1925 struct untracked_cache_dir *root;
1926
76e6b090 1927 if (!dir->untracked || getenv("GIT_DISABLE_UNTRACKED_CACHE"))
ccad261f
NTND
1928 return NULL;
1929
1930 /*
1931 * We only support $GIT_DIR/info/exclude and core.excludesfile
1932 * as the global ignore rule files. Any other additions
1933 * (e.g. from command line) invalidate the cache. This
1934 * condition also catches running setup_standard_excludes()
1935 * before setting dir->untracked!
1936 */
1937 if (dir->unmanaged_exclude_files)
1938 return NULL;
1939
1940 /*
1941 * Optimize for the main use case only: whole-tree git
1942 * status. More work involved in treat_leading_path() if we
1943 * use cache on just a subset of the worktree. pathspec
1944 * support could make the matter even worse.
1945 */
1946 if (base_len || (pathspec && pathspec->nr))
1947 return NULL;
1948
1949 /* Different set of flags may produce different results */
1950 if (dir->flags != dir->untracked->dir_flags ||
1951 /*
1952 * See treat_directory(), case index_nonexistent. Without
1953 * this flag, we may need to also cache .git file content
1954 * for the resolve_gitlink_ref() call, which we don't.
1955 */
1956 !(dir->flags & DIR_SHOW_OTHER_DIRECTORIES) ||
1957 /* We don't support collecting ignore files */
1958 (dir->flags & (DIR_SHOW_IGNORED | DIR_SHOW_IGNORED_TOO |
1959 DIR_COLLECT_IGNORED)))
1960 return NULL;
1961
1962 /*
1963 * If we use .gitignore in the cache and now you change it to
1964 * .gitexclude, everything will go wrong.
1965 */
1966 if (dir->exclude_per_dir != dir->untracked->exclude_per_dir &&
1967 strcmp(dir->exclude_per_dir, dir->untracked->exclude_per_dir))
1968 return NULL;
1969
1970 /*
1971 * EXC_CMDL is not considered in the cache. If people set it,
1972 * skip the cache.
1973 */
1974 if (dir->exclude_list_group[EXC_CMDL].nr)
1975 return NULL;
1976
1e8fef60 1977 if (!ident_in_untracked(dir->untracked)) {
0e0f7618 1978 warning(_("Untracked cache is disabled on this system or location."));
1e8fef60
NTND
1979 return NULL;
1980 }
1981
ccad261f
NTND
1982 if (!dir->untracked->root) {
1983 const int len = sizeof(*dir->untracked->root);
1984 dir->untracked->root = xmalloc(len);
1985 memset(dir->untracked->root, 0, len);
1986 }
1987
1988 /* Validate $GIT_DIR/info/exclude and core.excludesfile */
1989 root = dir->untracked->root;
1990 if (hashcmp(dir->ss_info_exclude.sha1,
1991 dir->untracked->ss_info_exclude.sha1)) {
1992 invalidate_gitignore(dir->untracked, root);
1993 dir->untracked->ss_info_exclude = dir->ss_info_exclude;
1994 }
1995 if (hashcmp(dir->ss_excludes_file.sha1,
1996 dir->untracked->ss_excludes_file.sha1)) {
1997 invalidate_gitignore(dir->untracked, root);
1998 dir->untracked->ss_excludes_file = dir->ss_excludes_file;
1999 }
26cb0182
NTND
2000
2001 /* Make sure this directory is not dropped out at saving phase */
2002 root->recurse = 1;
ccad261f
NTND
2003 return root;
2004}
2005
e1b8c7bd
BW
2006int read_directory(struct dir_struct *dir, const char *path,
2007 int len, const struct pathspec *pathspec)
9fc42d60 2008{
ccad261f 2009 struct untracked_cache_dir *untracked;
b4189aa8 2010
dba2e203 2011 if (has_symlink_leading_path(path, len))
725b0605
JH
2012 return dir->nr;
2013
ccad261f
NTND
2014 untracked = validate_untracked_cache(dir, len, pathspec);
2015 if (!untracked)
2016 /*
2017 * make sure untracked cache code path is disabled,
2018 * e.g. prep_exclude()
2019 */
2020 dir->untracked = NULL;
e1b8c7bd
BW
2021 if (!len || treat_leading_path(dir, path, len, pathspec))
2022 read_directory_recursive(dir, path, len, untracked, 0, pathspec);
9ed0d8d6
RS
2023 QSORT(dir->entries, dir->nr, cmp_name);
2024 QSORT(dir->ignored, dir->ignored_nr, cmp_name);
c9ccb5d3
NTND
2025 if (dir->untracked) {
2026 static struct trace_key trace_untracked_stats = TRACE_KEY_INIT(UNTRACKED_STATS);
2027 trace_printf_key(&trace_untracked_stats,
2028 "node creation: %u\n"
2029 "gitignore invalidation: %u\n"
2030 "directory invalidation: %u\n"
2031 "opendir: %u\n",
2032 dir->untracked->dir_created,
2033 dir->untracked->gitignore_invalidated,
2034 dir->untracked->dir_invalidated,
2035 dir->untracked->dir_opened);
1bbb3dba
NTND
2036 if (dir->untracked == the_index.untracked &&
2037 (dir->untracked->dir_opened ||
2038 dir->untracked->gitignore_invalidated ||
2039 dir->untracked->dir_invalidated))
2040 the_index.cache_changed |= UNTRACKED_CHANGED;
2041 if (dir->untracked != the_index.untracked) {
2042 free(dir->untracked);
2043 dir->untracked = NULL;
2044 }
c9ccb5d3 2045 }
453ec4bd
LT
2046 return dir->nr;
2047}
c91f0d92 2048
686a4a06 2049int file_exists(const char *f)
c91f0d92 2050{
686a4a06 2051 struct stat sb;
a50f9fc5 2052 return lstat(f, &sb) == 0;
c91f0d92 2053}
e6636747 2054
63ec5e1f
JS
2055static int cmp_icase(char a, char b)
2056{
2057 if (a == b)
2058 return 0;
2059 if (ignore_case)
2060 return toupper(a) - toupper(b);
2061 return a - b;
2062}
2063
e6636747 2064/*
9b125da4
NTND
2065 * Given two normalized paths (a trailing slash is ok), if subdir is
2066 * outside dir, return -1. Otherwise return the offset in subdir that
2067 * can be used as relative path to dir.
e6636747 2068 */
9b125da4 2069int dir_inside_of(const char *subdir, const char *dir)
e6636747 2070{
9b125da4 2071 int offset = 0;
e6636747 2072
9b125da4 2073 assert(dir && subdir && *dir && *subdir);
e6636747 2074
63ec5e1f 2075 while (*dir && *subdir && !cmp_icase(*dir, *subdir)) {
e6636747 2076 dir++;
9b125da4
NTND
2077 subdir++;
2078 offset++;
490544b1 2079 }
9b125da4
NTND
2080
2081 /* hel[p]/me vs hel[l]/yeah */
2082 if (*dir && *subdir)
2083 return -1;
2084
2085 if (!*subdir)
2086 return !*dir ? offset : -1; /* same dir */
2087
2088 /* foo/[b]ar vs foo/[] */
2089 if (is_dir_sep(dir[-1]))
2090 return is_dir_sep(subdir[-1]) ? offset : -1;
2091
2092 /* foo[/]bar vs foo[] */
2093 return is_dir_sep(*subdir) ? offset + 1 : -1;
e6636747
JS
2094}
2095
2096int is_inside_dir(const char *dir)
2097{
56b9f6e7
RS
2098 char *cwd;
2099 int rc;
2100
b892913d
NTND
2101 if (!dir)
2102 return 0;
56b9f6e7
RS
2103
2104 cwd = xgetcwd();
2105 rc = (dir_inside_of(cwd, dir) >= 0);
2106 free(cwd);
2107 return rc;
e6636747 2108}
7155b727 2109
55892d23
AP
2110int is_empty_dir(const char *path)
2111{
2112 DIR *dir = opendir(path);
2113 struct dirent *e;
2114 int ret = 1;
2115
2116 if (!dir)
2117 return 0;
2118
2119 while ((e = readdir(dir)) != NULL)
2120 if (!is_dot_or_dotdot(e->d_name)) {
2121 ret = 0;
2122 break;
2123 }
2124
2125 closedir(dir);
2126 return ret;
2127}
2128
ae2f203e 2129static int remove_dir_recurse(struct strbuf *path, int flag, int *kept_up)
7155b727 2130{
a0f4afbe 2131 DIR *dir;
7155b727 2132 struct dirent *e;
ae2f203e 2133 int ret = 0, original_len = path->len, len, kept_down = 0;
a0f4afbe 2134 int only_empty = (flag & REMOVE_DIR_EMPTY_ONLY);
c844a803 2135 int keep_toplevel = (flag & REMOVE_DIR_KEEP_TOPLEVEL);
a0f4afbe 2136 unsigned char submodule_head[20];
7155b727 2137
a0f4afbe 2138 if ((flag & REMOVE_DIR_KEEP_NESTED_GIT) &&
ae2f203e 2139 !resolve_gitlink_ref(path->buf, "HEAD", submodule_head)) {
a0f4afbe 2140 /* Do not descend and nuke a nested git work tree. */
ae2f203e
JH
2141 if (kept_up)
2142 *kept_up = 1;
a0f4afbe 2143 return 0;
ae2f203e 2144 }
a0f4afbe 2145
ae2f203e 2146 flag &= ~REMOVE_DIR_KEEP_TOPLEVEL;
a0f4afbe 2147 dir = opendir(path->buf);
c844a803 2148 if (!dir) {
863808cd
MH
2149 if (errno == ENOENT)
2150 return keep_toplevel ? -1 : 0;
2151 else if (errno == EACCES && !keep_toplevel)
ecb2c282
MH
2152 /*
2153 * An empty dir could be removable even if it
2154 * is unreadable:
2155 */
c844a803
JH
2156 return rmdir(path->buf);
2157 else
2158 return -1;
2159 }
00b6c178 2160 strbuf_complete(path, '/');
7155b727
JS
2161
2162 len = path->len;
2163 while ((e = readdir(dir)) != NULL) {
2164 struct stat st;
8ca12c0d
AP
2165 if (is_dot_or_dotdot(e->d_name))
2166 continue;
7155b727
JS
2167
2168 strbuf_setlen(path, len);
2169 strbuf_addstr(path, e->d_name);
863808cd
MH
2170 if (lstat(path->buf, &st)) {
2171 if (errno == ENOENT)
2172 /*
2173 * file disappeared, which is what we
2174 * wanted anyway
2175 */
2176 continue;
2177 /* fall thru */
2178 } else if (S_ISDIR(st.st_mode)) {
ae2f203e 2179 if (!remove_dir_recurse(path, flag, &kept_down))
7155b727 2180 continue; /* happy */
863808cd
MH
2181 } else if (!only_empty &&
2182 (!unlink(path->buf) || errno == ENOENT)) {
7155b727 2183 continue; /* happy, too */
863808cd 2184 }
7155b727
JS
2185
2186 /* path too long, stat fails, or non-directory still exists */
2187 ret = -1;
2188 break;
2189 }
2190 closedir(dir);
2191
2192 strbuf_setlen(path, original_len);
ae2f203e 2193 if (!ret && !keep_toplevel && !kept_down)
863808cd 2194 ret = (!rmdir(path->buf) || errno == ENOENT) ? 0 : -1;
ae2f203e
JH
2195 else if (kept_up)
2196 /*
2197 * report the uplevel that it is not an error that we
2198 * did not rmdir() our directory.
2199 */
2200 *kept_up = !ret;
7155b727
JS
2201 return ret;
2202}
039bc64e 2203
ae2f203e
JH
2204int remove_dir_recursively(struct strbuf *path, int flag)
2205{
2206 return remove_dir_recurse(path, flag, NULL);
2207}
2208
f932729c
JK
2209static GIT_PATH_FUNC(git_path_info_exclude, "info/exclude")
2210
039bc64e
JH
2211void setup_standard_excludes(struct dir_struct *dir)
2212{
039bc64e 2213 dir->exclude_per_dir = ".gitignore";
099d2d86
JH
2214
2215 /* core.excludefile defaulting to $XDG_HOME/git/ignore */
2845ce7f
PT
2216 if (!excludes_file)
2217 excludes_file = xdg_config_home("ignore");
4698c8fe 2218 if (excludes_file && !access_or_warn(excludes_file, R_OK, 0))
38ccaf93
JH
2219 add_excludes_from_file_1(dir, excludes_file,
2220 dir->untracked ? &dir->ss_excludes_file : NULL);
099d2d86
JH
2221
2222 /* per repository user preference */
f0056f64
JK
2223 if (startup_info->have_repository) {
2224 const char *path = git_path_info_exclude();
2225 if (!access_or_warn(path, R_OK, 0))
2226 add_excludes_from_file_1(dir, path,
2227 dir->untracked ? &dir->ss_info_exclude : NULL);
2228 }
039bc64e 2229}
4a92d1bf
AR
2230
2231int remove_path(const char *name)
2232{
2233 char *slash;
2234
9a6728d4 2235 if (unlink(name) && errno != ENOENT && errno != ENOTDIR)
4a92d1bf
AR
2236 return -1;
2237
2238 slash = strrchr(name, '/');
2239 if (slash) {
2240 char *dirs = xstrdup(name);
2241 slash = dirs + (slash - name);
2242 do {
2243 *slash = '\0';
3fc0d131 2244 } while (rmdir(dirs) == 0 && (slash = strrchr(dirs, '/')));
4a92d1bf
AR
2245 free(dirs);
2246 }
2247 return 0;
2248}
2249
270be816
AS
2250/*
2251 * Frees memory within dir which was allocated for exclude lists and
2252 * the exclude_stack. Does not free dir itself.
2253 */
2254void clear_directory(struct dir_struct *dir)
2255{
2256 int i, j;
2257 struct exclude_list_group *group;
2258 struct exclude_list *el;
2259 struct exclude_stack *stk;
2260
2261 for (i = EXC_CMDL; i <= EXC_FILE; i++) {
2262 group = &dir->exclude_list_group[i];
2263 for (j = 0; j < group->nr; j++) {
2264 el = &group->el[j];
2265 if (i == EXC_DIRS)
2266 free((char *)el->src);
2267 clear_exclude_list(el);
2268 }
2269 free(group->el);
2270 }
2271
2272 stk = dir->exclude_stack;
2273 while (stk) {
2274 struct exclude_stack *prev = stk->prev;
2275 free(stk);
2276 stk = prev;
2277 }
aceb9429 2278 strbuf_release(&dir->basebuf);
270be816 2279}
83c094ad
NTND
2280
2281struct ondisk_untracked_cache {
2282 struct stat_data info_exclude_stat;
2283 struct stat_data excludes_file_stat;
2284 uint32_t dir_flags;
2285 unsigned char info_exclude_sha1[20];
2286 unsigned char excludes_file_sha1[20];
2287 char exclude_per_dir[FLEX_ARRAY];
2288};
2289
2290#define ouc_size(len) (offsetof(struct ondisk_untracked_cache, exclude_per_dir) + len + 1)
2291
2292struct write_data {
2293 int index; /* number of written untracked_cache_dir */
2294 struct ewah_bitmap *check_only; /* from untracked_cache_dir */
2295 struct ewah_bitmap *valid; /* from untracked_cache_dir */
2296 struct ewah_bitmap *sha1_valid; /* set if exclude_sha1 is not null */
2297 struct strbuf out;
2298 struct strbuf sb_stat;
2299 struct strbuf sb_sha1;
2300};
2301
2302static void stat_data_to_disk(struct stat_data *to, const struct stat_data *from)
2303{
2304 to->sd_ctime.sec = htonl(from->sd_ctime.sec);
2305 to->sd_ctime.nsec = htonl(from->sd_ctime.nsec);
2306 to->sd_mtime.sec = htonl(from->sd_mtime.sec);
2307 to->sd_mtime.nsec = htonl(from->sd_mtime.nsec);
2308 to->sd_dev = htonl(from->sd_dev);
2309 to->sd_ino = htonl(from->sd_ino);
2310 to->sd_uid = htonl(from->sd_uid);
2311 to->sd_gid = htonl(from->sd_gid);
2312 to->sd_size = htonl(from->sd_size);
2313}
2314
2315static void write_one_dir(struct untracked_cache_dir *untracked,
2316 struct write_data *wd)
2317{
2318 struct stat_data stat_data;
2319 struct strbuf *out = &wd->out;
2320 unsigned char intbuf[16];
2321 unsigned int intlen, value;
2322 int i = wd->index++;
2323
2324 /*
2325 * untracked_nr should be reset whenever valid is clear, but
2326 * for safety..
2327 */
2328 if (!untracked->valid) {
2329 untracked->untracked_nr = 0;
2330 untracked->check_only = 0;
2331 }
2332
2333 if (untracked->check_only)
2334 ewah_set(wd->check_only, i);
2335 if (untracked->valid) {
2336 ewah_set(wd->valid, i);
2337 stat_data_to_disk(&stat_data, &untracked->stat_data);
2338 strbuf_add(&wd->sb_stat, &stat_data, sizeof(stat_data));
2339 }
2340 if (!is_null_sha1(untracked->exclude_sha1)) {
2341 ewah_set(wd->sha1_valid, i);
2342 strbuf_add(&wd->sb_sha1, untracked->exclude_sha1, 20);
2343 }
2344
2345 intlen = encode_varint(untracked->untracked_nr, intbuf);
2346 strbuf_add(out, intbuf, intlen);
2347
2348 /* skip non-recurse directories */
2349 for (i = 0, value = 0; i < untracked->dirs_nr; i++)
2350 if (untracked->dirs[i]->recurse)
2351 value++;
2352 intlen = encode_varint(value, intbuf);
2353 strbuf_add(out, intbuf, intlen);
2354
2355 strbuf_add(out, untracked->name, strlen(untracked->name) + 1);
2356
2357 for (i = 0; i < untracked->untracked_nr; i++)
2358 strbuf_add(out, untracked->untracked[i],
2359 strlen(untracked->untracked[i]) + 1);
2360
2361 for (i = 0; i < untracked->dirs_nr; i++)
2362 if (untracked->dirs[i]->recurse)
2363 write_one_dir(untracked->dirs[i], wd);
2364}
2365
2366void write_untracked_extension(struct strbuf *out, struct untracked_cache *untracked)
2367{
2368 struct ondisk_untracked_cache *ouc;
2369 struct write_data wd;
2370 unsigned char varbuf[16];
e0b83735
JK
2371 int varint_len;
2372 size_t len = strlen(untracked->exclude_per_dir);
2373
2374 FLEX_ALLOC_MEM(ouc, exclude_per_dir, untracked->exclude_per_dir, len);
83c094ad
NTND
2375 stat_data_to_disk(&ouc->info_exclude_stat, &untracked->ss_info_exclude.stat);
2376 stat_data_to_disk(&ouc->excludes_file_stat, &untracked->ss_excludes_file.stat);
2377 hashcpy(ouc->info_exclude_sha1, untracked->ss_info_exclude.sha1);
2378 hashcpy(ouc->excludes_file_sha1, untracked->ss_excludes_file.sha1);
2379 ouc->dir_flags = htonl(untracked->dir_flags);
1e8fef60
NTND
2380
2381 varint_len = encode_varint(untracked->ident.len, varbuf);
2382 strbuf_add(out, varbuf, varint_len);
8109984d 2383 strbuf_addbuf(out, &untracked->ident);
1e8fef60 2384
83c094ad
NTND
2385 strbuf_add(out, ouc, ouc_size(len));
2386 free(ouc);
2387 ouc = NULL;
2388
2389 if (!untracked->root) {
2390 varint_len = encode_varint(0, varbuf);
2391 strbuf_add(out, varbuf, varint_len);
2392 return;
2393 }
2394
2395 wd.index = 0;
2396 wd.check_only = ewah_new();
2397 wd.valid = ewah_new();
2398 wd.sha1_valid = ewah_new();
2399 strbuf_init(&wd.out, 1024);
2400 strbuf_init(&wd.sb_stat, 1024);
2401 strbuf_init(&wd.sb_sha1, 1024);
2402 write_one_dir(untracked->root, &wd);
2403
2404 varint_len = encode_varint(wd.index, varbuf);
2405 strbuf_add(out, varbuf, varint_len);
2406 strbuf_addbuf(out, &wd.out);
2407 ewah_serialize_strbuf(wd.valid, out);
2408 ewah_serialize_strbuf(wd.check_only, out);
2409 ewah_serialize_strbuf(wd.sha1_valid, out);
2410 strbuf_addbuf(out, &wd.sb_stat);
2411 strbuf_addbuf(out, &wd.sb_sha1);
2412 strbuf_addch(out, '\0'); /* safe guard for string lists */
2413
2414 ewah_free(wd.valid);
2415 ewah_free(wd.check_only);
2416 ewah_free(wd.sha1_valid);
2417 strbuf_release(&wd.out);
2418 strbuf_release(&wd.sb_stat);
2419 strbuf_release(&wd.sb_sha1);
2420}
f9e6c649
NTND
2421
2422static void free_untracked(struct untracked_cache_dir *ucd)
2423{
2424 int i;
2425 if (!ucd)
2426 return;
2427 for (i = 0; i < ucd->dirs_nr; i++)
2428 free_untracked(ucd->dirs[i]);
2429 for (i = 0; i < ucd->untracked_nr; i++)
2430 free(ucd->untracked[i]);
2431 free(ucd->untracked);
2432 free(ucd->dirs);
2433 free(ucd);
2434}
2435
2436void free_untracked_cache(struct untracked_cache *uc)
2437{
2438 if (uc)
2439 free_untracked(uc->root);
2440 free(uc);
2441}
2442
2443struct read_data {
2444 int index;
2445 struct untracked_cache_dir **ucd;
2446 struct ewah_bitmap *check_only;
2447 struct ewah_bitmap *valid;
2448 struct ewah_bitmap *sha1_valid;
2449 const unsigned char *data;
2450 const unsigned char *end;
2451};
2452
2453static void stat_data_from_disk(struct stat_data *to, const struct stat_data *from)
2454{
2455 to->sd_ctime.sec = get_be32(&from->sd_ctime.sec);
2456 to->sd_ctime.nsec = get_be32(&from->sd_ctime.nsec);
2457 to->sd_mtime.sec = get_be32(&from->sd_mtime.sec);
2458 to->sd_mtime.nsec = get_be32(&from->sd_mtime.nsec);
2459 to->sd_dev = get_be32(&from->sd_dev);
2460 to->sd_ino = get_be32(&from->sd_ino);
2461 to->sd_uid = get_be32(&from->sd_uid);
2462 to->sd_gid = get_be32(&from->sd_gid);
2463 to->sd_size = get_be32(&from->sd_size);
2464}
2465
2466static int read_one_dir(struct untracked_cache_dir **untracked_,
2467 struct read_data *rd)
2468{
2469 struct untracked_cache_dir ud, *untracked;
2470 const unsigned char *next, *data = rd->data, *end = rd->end;
2471 unsigned int value;
2472 int i, len;
2473
2474 memset(&ud, 0, sizeof(ud));
2475
2476 next = data;
2477 value = decode_varint(&next);
2478 if (next > end)
2479 return -1;
2480 ud.recurse = 1;
2481 ud.untracked_alloc = value;
2482 ud.untracked_nr = value;
2483 if (ud.untracked_nr)
b32fa95f 2484 ALLOC_ARRAY(ud.untracked, ud.untracked_nr);
f9e6c649
NTND
2485 data = next;
2486
2487 next = data;
2488 ud.dirs_alloc = ud.dirs_nr = decode_varint(&next);
2489 if (next > end)
2490 return -1;
b32fa95f 2491 ALLOC_ARRAY(ud.dirs, ud.dirs_nr);
f9e6c649
NTND
2492 data = next;
2493
2494 len = strlen((const char *)data);
2495 next = data + len + 1;
2496 if (next > rd->end)
2497 return -1;
50a6c8ef 2498 *untracked_ = untracked = xmalloc(st_add(sizeof(*untracked), len));
f9e6c649
NTND
2499 memcpy(untracked, &ud, sizeof(ud));
2500 memcpy(untracked->name, data, len + 1);
2501 data = next;
2502
2503 for (i = 0; i < untracked->untracked_nr; i++) {
2504 len = strlen((const char *)data);
2505 next = data + len + 1;
2506 if (next > rd->end)
2507 return -1;
2508 untracked->untracked[i] = xstrdup((const char*)data);
2509 data = next;
2510 }
2511
2512 rd->ucd[rd->index++] = untracked;
2513 rd->data = data;
2514
2515 for (i = 0; i < untracked->dirs_nr; i++) {
2516 len = read_one_dir(untracked->dirs + i, rd);
2517 if (len < 0)
2518 return -1;
2519 }
2520 return 0;
2521}
2522
2523static void set_check_only(size_t pos, void *cb)
2524{
2525 struct read_data *rd = cb;
2526 struct untracked_cache_dir *ud = rd->ucd[pos];
2527 ud->check_only = 1;
2528}
2529
2530static void read_stat(size_t pos, void *cb)
2531{
2532 struct read_data *rd = cb;
2533 struct untracked_cache_dir *ud = rd->ucd[pos];
2534 if (rd->data + sizeof(struct stat_data) > rd->end) {
2535 rd->data = rd->end + 1;
2536 return;
2537 }
2538 stat_data_from_disk(&ud->stat_data, (struct stat_data *)rd->data);
2539 rd->data += sizeof(struct stat_data);
2540 ud->valid = 1;
2541}
2542
2543static void read_sha1(size_t pos, void *cb)
2544{
2545 struct read_data *rd = cb;
2546 struct untracked_cache_dir *ud = rd->ucd[pos];
2547 if (rd->data + 20 > rd->end) {
2548 rd->data = rd->end + 1;
2549 return;
2550 }
2551 hashcpy(ud->exclude_sha1, rd->data);
2552 rd->data += 20;
2553}
2554
2555static void load_sha1_stat(struct sha1_stat *sha1_stat,
2556 const struct stat_data *stat,
2557 const unsigned char *sha1)
2558{
2559 stat_data_from_disk(&sha1_stat->stat, stat);
2560 hashcpy(sha1_stat->sha1, sha1);
2561 sha1_stat->valid = 1;
2562}
2563
2564struct untracked_cache *read_untracked_extension(const void *data, unsigned long sz)
2565{
2566 const struct ondisk_untracked_cache *ouc;
2567 struct untracked_cache *uc;
2568 struct read_data rd;
2569 const unsigned char *next = data, *end = (const unsigned char *)data + sz;
1e8fef60
NTND
2570 const char *ident;
2571 int ident_len, len;
f9e6c649
NTND
2572
2573 if (sz <= 1 || end[-1] != '\0')
2574 return NULL;
2575 end--;
2576
1e8fef60
NTND
2577 ident_len = decode_varint(&next);
2578 if (next + ident_len > end)
2579 return NULL;
2580 ident = (const char *)next;
2581 next += ident_len;
2582
f9e6c649
NTND
2583 ouc = (const struct ondisk_untracked_cache *)next;
2584 if (next + ouc_size(0) > end)
2585 return NULL;
2586
2587 uc = xcalloc(1, sizeof(*uc));
1e8fef60
NTND
2588 strbuf_init(&uc->ident, ident_len);
2589 strbuf_add(&uc->ident, ident, ident_len);
f9e6c649
NTND
2590 load_sha1_stat(&uc->ss_info_exclude, &ouc->info_exclude_stat,
2591 ouc->info_exclude_sha1);
2592 load_sha1_stat(&uc->ss_excludes_file, &ouc->excludes_file_stat,
2593 ouc->excludes_file_sha1);
2594 uc->dir_flags = get_be32(&ouc->dir_flags);
2595 uc->exclude_per_dir = xstrdup(ouc->exclude_per_dir);
2596 /* NUL after exclude_per_dir is covered by sizeof(*ouc) */
2597 next += ouc_size(strlen(ouc->exclude_per_dir));
2598 if (next >= end)
2599 goto done2;
2600
2601 len = decode_varint(&next);
2602 if (next > end || len == 0)
2603 goto done2;
2604
2605 rd.valid = ewah_new();
2606 rd.check_only = ewah_new();
2607 rd.sha1_valid = ewah_new();
2608 rd.data = next;
2609 rd.end = end;
2610 rd.index = 0;
b32fa95f 2611 ALLOC_ARRAY(rd.ucd, len);
f9e6c649
NTND
2612
2613 if (read_one_dir(&uc->root, &rd) || rd.index != len)
2614 goto done;
2615
2616 next = rd.data;
2617 len = ewah_read_mmap(rd.valid, next, end - next);
2618 if (len < 0)
2619 goto done;
2620
2621 next += len;
2622 len = ewah_read_mmap(rd.check_only, next, end - next);
2623 if (len < 0)
2624 goto done;
2625
2626 next += len;
2627 len = ewah_read_mmap(rd.sha1_valid, next, end - next);
2628 if (len < 0)
2629 goto done;
2630
2631 ewah_each_bit(rd.check_only, set_check_only, &rd);
2632 rd.data = next + len;
2633 ewah_each_bit(rd.valid, read_stat, &rd);
2634 ewah_each_bit(rd.sha1_valid, read_sha1, &rd);
2635 next = rd.data;
2636
2637done:
2638 free(rd.ucd);
2639 ewah_free(rd.valid);
2640 ewah_free(rd.check_only);
2641 ewah_free(rd.sha1_valid);
2642done2:
2643 if (next != end) {
2644 free_untracked_cache(uc);
2645 uc = NULL;
2646 }
2647 return uc;
2648}
e931371a 2649
73f9145f
NTND
2650static void invalidate_one_directory(struct untracked_cache *uc,
2651 struct untracked_cache_dir *ucd)
2652{
2653 uc->dir_invalidated++;
2654 ucd->valid = 0;
2655 ucd->untracked_nr = 0;
2656}
2657
2658/*
2659 * Normally when an entry is added or removed from a directory,
2660 * invalidating that directory is enough. No need to touch its
2661 * ancestors. When a directory is shown as "foo/bar/" in git-status
2662 * however, deleting or adding an entry may have cascading effect.
2663 *
2664 * Say the "foo/bar/file" has become untracked, we need to tell the
2665 * untracked_cache_dir of "foo" that "bar/" is not an untracked
2666 * directory any more (because "bar" is managed by foo as an untracked
2667 * "file").
2668 *
2669 * Similarly, if "foo/bar/file" moves from untracked to tracked and it
2670 * was the last untracked entry in the entire "foo", we should show
2671 * "foo/" instead. Which means we have to invalidate past "bar" up to
2672 * "foo".
2673 *
2674 * This function traverses all directories from root to leaf. If there
2675 * is a chance of one of the above cases happening, we invalidate back
2676 * to root. Otherwise we just invalidate the leaf. There may be a more
2677 * sophisticated way than checking for SHOW_OTHER_DIRECTORIES to
2678 * detect these cases and avoid unnecessary invalidation, for example,
2679 * checking for the untracked entry named "bar/" in "foo", but for now
2680 * stick to something safe and simple.
2681 */
2682static int invalidate_one_component(struct untracked_cache *uc,
2683 struct untracked_cache_dir *dir,
2684 const char *path, int len)
2685{
2686 const char *rest = strchr(path, '/');
2687
2688 if (rest) {
2689 int component_len = rest - path;
2690 struct untracked_cache_dir *d =
2691 lookup_untracked(uc, dir, path, component_len);
2692 int ret =
2693 invalidate_one_component(uc, d, rest + 1,
2694 len - (component_len + 1));
2695 if (ret)
2696 invalidate_one_directory(uc, dir);
2697 return ret;
2698 }
2699
2700 invalidate_one_directory(uc, dir);
2701 return uc->dir_flags & DIR_SHOW_OTHER_DIRECTORIES;
2702}
2703
e931371a
NTND
2704void untracked_cache_invalidate_path(struct index_state *istate,
2705 const char *path)
2706{
e931371a
NTND
2707 if (!istate->untracked || !istate->untracked->root)
2708 return;
73f9145f
NTND
2709 invalidate_one_component(istate->untracked, istate->untracked->root,
2710 path, strlen(path));
e931371a
NTND
2711}
2712
2713void untracked_cache_remove_from_index(struct index_state *istate,
2714 const char *path)
2715{
2716 untracked_cache_invalidate_path(istate, path);
2717}
2718
2719void untracked_cache_add_to_index(struct index_state *istate,
2720 const char *path)
2721{
2722 untracked_cache_invalidate_path(istate, path);
2723}