Merge branch 'em/freebsd-cirrus-ci'
[alt-git.git] / dir.c
blob7d255227b130d7729747fe1a86c8efc04eee9f7e
1 /*
2 * This handles recursive filename detection with exclude
3 * files, index knowledge etc..
5 * Copyright (C) Linus Torvalds, 2005-2006
6 * Junio Hamano, 2005-2006
7 */
8 #include "cache.h"
9 #include "config.h"
10 #include "dir.h"
11 #include "object-store.h"
12 #include "attr.h"
13 #include "refs.h"
14 #include "wildmatch.h"
15 #include "pathspec.h"
16 #include "utf8.h"
17 #include "varint.h"
18 #include "ewah/ewok.h"
19 #include "fsmonitor.h"
20 #include "submodule-config.h"
23 * Tells read_directory_recursive how a file or directory should be treated.
24 * Values are ordered by significance, e.g. if a directory contains both
25 * excluded and untracked files, it is listed as untracked because
26 * path_untracked > path_excluded.
28 enum path_treatment {
29 path_none = 0,
30 path_recurse,
31 path_excluded,
32 path_untracked
36 * Support data structure for our opendir/readdir/closedir wrappers
38 struct cached_dir {
39 DIR *fdir;
40 struct untracked_cache_dir *untracked;
41 int nr_files;
42 int nr_dirs;
44 struct dirent *de;
45 const char *file;
46 struct untracked_cache_dir *ucd;
49 static enum path_treatment read_directory_recursive(struct dir_struct *dir,
50 struct index_state *istate, const char *path, int len,
51 struct untracked_cache_dir *untracked,
52 int check_only, int stop_at_first_file, const struct pathspec *pathspec);
53 static int get_dtype(struct dirent *de, struct index_state *istate,
54 const char *path, int len);
56 int count_slashes(const char *s)
58 int cnt = 0;
59 while (*s)
60 if (*s++ == '/')
61 cnt++;
62 return cnt;
65 int fspathcmp(const char *a, const char *b)
67 return ignore_case ? strcasecmp(a, b) : strcmp(a, b);
70 int fspathncmp(const char *a, const char *b, size_t count)
72 return ignore_case ? strncasecmp(a, b, count) : strncmp(a, b, count);
75 int git_fnmatch(const struct pathspec_item *item,
76 const char *pattern, const char *string,
77 int prefix)
79 if (prefix > 0) {
80 if (ps_strncmp(item, pattern, string, prefix))
81 return WM_NOMATCH;
82 pattern += prefix;
83 string += prefix;
85 if (item->flags & PATHSPEC_ONESTAR) {
86 int pattern_len = strlen(++pattern);
87 int string_len = strlen(string);
88 return string_len < pattern_len ||
89 ps_strcmp(item, pattern,
90 string + string_len - pattern_len);
92 if (item->magic & PATHSPEC_GLOB)
93 return wildmatch(pattern, string,
94 WM_PATHNAME |
95 (item->magic & PATHSPEC_ICASE ? WM_CASEFOLD : 0));
96 else
97 /* wildmatch has not learned no FNM_PATHNAME mode yet */
98 return wildmatch(pattern, string,
99 item->magic & PATHSPEC_ICASE ? WM_CASEFOLD : 0);
102 static int fnmatch_icase_mem(const char *pattern, int patternlen,
103 const char *string, int stringlen,
104 int flags)
106 int match_status;
107 struct strbuf pat_buf = STRBUF_INIT;
108 struct strbuf str_buf = STRBUF_INIT;
109 const char *use_pat = pattern;
110 const char *use_str = string;
112 if (pattern[patternlen]) {
113 strbuf_add(&pat_buf, pattern, patternlen);
114 use_pat = pat_buf.buf;
116 if (string[stringlen]) {
117 strbuf_add(&str_buf, string, stringlen);
118 use_str = str_buf.buf;
121 if (ignore_case)
122 flags |= WM_CASEFOLD;
123 match_status = wildmatch(use_pat, use_str, flags);
125 strbuf_release(&pat_buf);
126 strbuf_release(&str_buf);
128 return match_status;
131 static size_t common_prefix_len(const struct pathspec *pathspec)
133 int n;
134 size_t max = 0;
137 * ":(icase)path" is treated as a pathspec full of
138 * wildcard. In other words, only prefix is considered common
139 * prefix. If the pathspec is abc/foo abc/bar, running in
140 * subdir xyz, the common prefix is still xyz, not xyz/abc as
141 * in non-:(icase).
143 GUARD_PATHSPEC(pathspec,
144 PATHSPEC_FROMTOP |
145 PATHSPEC_MAXDEPTH |
146 PATHSPEC_LITERAL |
147 PATHSPEC_GLOB |
148 PATHSPEC_ICASE |
149 PATHSPEC_EXCLUDE |
150 PATHSPEC_ATTR);
152 for (n = 0; n < pathspec->nr; n++) {
153 size_t i = 0, len = 0, item_len;
154 if (pathspec->items[n].magic & PATHSPEC_EXCLUDE)
155 continue;
156 if (pathspec->items[n].magic & PATHSPEC_ICASE)
157 item_len = pathspec->items[n].prefix;
158 else
159 item_len = pathspec->items[n].nowildcard_len;
160 while (i < item_len && (n == 0 || i < max)) {
161 char c = pathspec->items[n].match[i];
162 if (c != pathspec->items[0].match[i])
163 break;
164 if (c == '/')
165 len = i + 1;
166 i++;
168 if (n == 0 || len < max) {
169 max = len;
170 if (!max)
171 break;
174 return max;
178 * Returns a copy of the longest leading path common among all
179 * pathspecs.
181 char *common_prefix(const struct pathspec *pathspec)
183 unsigned long len = common_prefix_len(pathspec);
185 return len ? xmemdupz(pathspec->items[0].match, len) : NULL;
188 int fill_directory(struct dir_struct *dir,
189 struct index_state *istate,
190 const struct pathspec *pathspec)
192 const char *prefix;
193 size_t prefix_len;
196 * Calculate common prefix for the pathspec, and
197 * use that to optimize the directory walk
199 prefix_len = common_prefix_len(pathspec);
200 prefix = prefix_len ? pathspec->items[0].match : "";
202 /* Read the directory and prune it */
203 read_directory(dir, istate, prefix, prefix_len, pathspec);
205 return prefix_len;
208 int within_depth(const char *name, int namelen,
209 int depth, int max_depth)
211 const char *cp = name, *cpe = name + namelen;
213 while (cp < cpe) {
214 if (*cp++ != '/')
215 continue;
216 depth++;
217 if (depth > max_depth)
218 return 0;
220 return 1;
224 * Read the contents of the blob with the given OID into a buffer.
225 * Append a trailing LF to the end if the last line doesn't have one.
227 * Returns:
228 * -1 when the OID is invalid or unknown or does not refer to a blob.
229 * 0 when the blob is empty.
230 * 1 along with { data, size } of the (possibly augmented) buffer
231 * when successful.
233 * Optionally updates the given oid_stat with the given OID (when valid).
235 static int do_read_blob(const struct object_id *oid, struct oid_stat *oid_stat,
236 size_t *size_out, char **data_out)
238 enum object_type type;
239 unsigned long sz;
240 char *data;
242 *size_out = 0;
243 *data_out = NULL;
245 data = read_object_file(oid, &type, &sz);
246 if (!data || type != OBJ_BLOB) {
247 free(data);
248 return -1;
251 if (oid_stat) {
252 memset(&oid_stat->stat, 0, sizeof(oid_stat->stat));
253 oidcpy(&oid_stat->oid, oid);
256 if (sz == 0) {
257 free(data);
258 return 0;
261 if (data[sz - 1] != '\n') {
262 data = xrealloc(data, st_add(sz, 1));
263 data[sz++] = '\n';
266 *size_out = xsize_t(sz);
267 *data_out = data;
269 return 1;
272 #define DO_MATCH_EXCLUDE (1<<0)
273 #define DO_MATCH_DIRECTORY (1<<1)
274 #define DO_MATCH_LEADING_PATHSPEC (1<<2)
277 * Does the given pathspec match the given name? A match is found if
279 * (1) the pathspec string is leading directory of 'name' ("RECURSIVELY"), or
280 * (2) the pathspec string has a leading part matching 'name' ("LEADING"), or
281 * (3) the pathspec string is a wildcard and matches 'name' ("WILDCARD"), or
282 * (4) the pathspec string is exactly the same as 'name' ("EXACT").
284 * Return value tells which case it was (1-4), or 0 when there is no match.
286 * It may be instructive to look at a small table of concrete examples
287 * to understand the differences between 1, 2, and 4:
289 * Pathspecs
290 * | a/b | a/b/ | a/b/c
291 * ------+-----------+-----------+------------
292 * a/b | EXACT | EXACT[1] | LEADING[2]
293 * Names a/b/ | RECURSIVE | EXACT | LEADING[2]
294 * a/b/c | RECURSIVE | RECURSIVE | EXACT
296 * [1] Only if DO_MATCH_DIRECTORY is passed; otherwise, this is NOT a match.
297 * [2] Only if DO_MATCH_LEADING_PATHSPEC is passed; otherwise, not a match.
299 static int match_pathspec_item(const struct index_state *istate,
300 const struct pathspec_item *item, int prefix,
301 const char *name, int namelen, unsigned flags)
303 /* name/namelen has prefix cut off by caller */
304 const char *match = item->match + prefix;
305 int matchlen = item->len - prefix;
308 * The normal call pattern is:
309 * 1. prefix = common_prefix_len(ps);
310 * 2. prune something, or fill_directory
311 * 3. match_pathspec()
313 * 'prefix' at #1 may be shorter than the command's prefix and
314 * it's ok for #2 to match extra files. Those extras will be
315 * trimmed at #3.
317 * Suppose the pathspec is 'foo' and '../bar' running from
318 * subdir 'xyz'. The common prefix at #1 will be empty, thanks
319 * to "../". We may have xyz/foo _and_ XYZ/foo after #2. The
320 * user does not want XYZ/foo, only the "foo" part should be
321 * case-insensitive. We need to filter out XYZ/foo here. In
322 * other words, we do not trust the caller on comparing the
323 * prefix part when :(icase) is involved. We do exact
324 * comparison ourselves.
326 * Normally the caller (common_prefix_len() in fact) does
327 * _exact_ matching on name[-prefix+1..-1] and we do not need
328 * to check that part. Be defensive and check it anyway, in
329 * case common_prefix_len is changed, or a new caller is
330 * introduced that does not use common_prefix_len.
332 * If the penalty turns out too high when prefix is really
333 * long, maybe change it to
334 * strncmp(match, name, item->prefix - prefix)
336 if (item->prefix && (item->magic & PATHSPEC_ICASE) &&
337 strncmp(item->match, name - prefix, item->prefix))
338 return 0;
340 if (item->attr_match_nr &&
341 !match_pathspec_attrs(istate, name, namelen, item))
342 return 0;
344 /* If the match was just the prefix, we matched */
345 if (!*match)
346 return MATCHED_RECURSIVELY;
348 if (matchlen <= namelen && !ps_strncmp(item, match, name, matchlen)) {
349 if (matchlen == namelen)
350 return MATCHED_EXACTLY;
352 if (match[matchlen-1] == '/' || name[matchlen] == '/')
353 return MATCHED_RECURSIVELY;
354 } else if ((flags & DO_MATCH_DIRECTORY) &&
355 match[matchlen - 1] == '/' &&
356 namelen == matchlen - 1 &&
357 !ps_strncmp(item, match, name, namelen))
358 return MATCHED_EXACTLY;
360 if (item->nowildcard_len < item->len &&
361 !git_fnmatch(item, match, name,
362 item->nowildcard_len - prefix))
363 return MATCHED_FNMATCH;
365 /* Perform checks to see if "name" is a leading string of the pathspec */
366 if (flags & DO_MATCH_LEADING_PATHSPEC) {
367 /* name is a literal prefix of the pathspec */
368 int offset = name[namelen-1] == '/' ? 1 : 0;
369 if ((namelen < matchlen) &&
370 (match[namelen-offset] == '/') &&
371 !ps_strncmp(item, match, name, namelen))
372 return MATCHED_RECURSIVELY_LEADING_PATHSPEC;
374 /* name doesn't match up to the first wild character */
375 if (item->nowildcard_len < item->len &&
376 ps_strncmp(item, match, name,
377 item->nowildcard_len - prefix))
378 return 0;
381 * name has no wildcard, and it didn't match as a leading
382 * pathspec so return.
384 if (item->nowildcard_len == item->len)
385 return 0;
388 * Here is where we would perform a wildmatch to check if
389 * "name" can be matched as a directory (or a prefix) against
390 * the pathspec. Since wildmatch doesn't have this capability
391 * at the present we have to punt and say that it is a match,
392 * potentially returning a false positive
393 * The submodules themselves will be able to perform more
394 * accurate matching to determine if the pathspec matches.
396 return MATCHED_RECURSIVELY_LEADING_PATHSPEC;
399 return 0;
403 * Given a name and a list of pathspecs, returns the nature of the
404 * closest (i.e. most specific) match of the name to any of the
405 * pathspecs.
407 * The caller typically calls this multiple times with the same
408 * pathspec and seen[] array but with different name/namelen
409 * (e.g. entries from the index) and is interested in seeing if and
410 * how each pathspec matches all the names it calls this function
411 * with. A mark is left in the seen[] array for each pathspec element
412 * indicating the closest type of match that element achieved, so if
413 * seen[n] remains zero after multiple invocations, that means the nth
414 * pathspec did not match any names, which could indicate that the
415 * user mistyped the nth pathspec.
417 static int do_match_pathspec(const struct index_state *istate,
418 const struct pathspec *ps,
419 const char *name, int namelen,
420 int prefix, char *seen,
421 unsigned flags)
423 int i, retval = 0, exclude = flags & DO_MATCH_EXCLUDE;
425 GUARD_PATHSPEC(ps,
426 PATHSPEC_FROMTOP |
427 PATHSPEC_MAXDEPTH |
428 PATHSPEC_LITERAL |
429 PATHSPEC_GLOB |
430 PATHSPEC_ICASE |
431 PATHSPEC_EXCLUDE |
432 PATHSPEC_ATTR);
434 if (!ps->nr) {
435 if (!ps->recursive ||
436 !(ps->magic & PATHSPEC_MAXDEPTH) ||
437 ps->max_depth == -1)
438 return MATCHED_RECURSIVELY;
440 if (within_depth(name, namelen, 0, ps->max_depth))
441 return MATCHED_EXACTLY;
442 else
443 return 0;
446 name += prefix;
447 namelen -= prefix;
449 for (i = ps->nr - 1; i >= 0; i--) {
450 int how;
452 if ((!exclude && ps->items[i].magic & PATHSPEC_EXCLUDE) ||
453 ( exclude && !(ps->items[i].magic & PATHSPEC_EXCLUDE)))
454 continue;
456 if (seen && seen[i] == MATCHED_EXACTLY)
457 continue;
459 * Make exclude patterns optional and never report
460 * "pathspec ':(exclude)foo' matches no files"
462 if (seen && ps->items[i].magic & PATHSPEC_EXCLUDE)
463 seen[i] = MATCHED_FNMATCH;
464 how = match_pathspec_item(istate, ps->items+i, prefix, name,
465 namelen, flags);
466 if (ps->recursive &&
467 (ps->magic & PATHSPEC_MAXDEPTH) &&
468 ps->max_depth != -1 &&
469 how && how != MATCHED_FNMATCH) {
470 int len = ps->items[i].len;
471 if (name[len] == '/')
472 len++;
473 if (within_depth(name+len, namelen-len, 0, ps->max_depth))
474 how = MATCHED_EXACTLY;
475 else
476 how = 0;
478 if (how) {
479 if (retval < how)
480 retval = how;
481 if (seen && seen[i] < how)
482 seen[i] = how;
485 return retval;
488 int match_pathspec(const struct index_state *istate,
489 const struct pathspec *ps,
490 const char *name, int namelen,
491 int prefix, char *seen, int is_dir)
493 int positive, negative;
494 unsigned flags = is_dir ? DO_MATCH_DIRECTORY : 0;
495 positive = do_match_pathspec(istate, ps, name, namelen,
496 prefix, seen, flags);
497 if (!(ps->magic & PATHSPEC_EXCLUDE) || !positive)
498 return positive;
499 negative = do_match_pathspec(istate, ps, name, namelen,
500 prefix, seen,
501 flags | DO_MATCH_EXCLUDE);
502 return negative ? 0 : positive;
506 * Check if a submodule is a superset of the pathspec
508 int submodule_path_match(const struct index_state *istate,
509 const struct pathspec *ps,
510 const char *submodule_name,
511 char *seen)
513 int matched = do_match_pathspec(istate, ps, submodule_name,
514 strlen(submodule_name),
515 0, seen,
516 DO_MATCH_DIRECTORY |
517 DO_MATCH_LEADING_PATHSPEC);
518 return matched;
521 int report_path_error(const char *ps_matched,
522 const struct pathspec *pathspec)
525 * Make sure all pathspec matched; otherwise it is an error.
527 int num, errors = 0;
528 for (num = 0; num < pathspec->nr; num++) {
529 int other, found_dup;
531 if (ps_matched[num])
532 continue;
534 * The caller might have fed identical pathspec
535 * twice. Do not barf on such a mistake.
536 * FIXME: parse_pathspec should have eliminated
537 * duplicate pathspec.
539 for (found_dup = other = 0;
540 !found_dup && other < pathspec->nr;
541 other++) {
542 if (other == num || !ps_matched[other])
543 continue;
544 if (!strcmp(pathspec->items[other].original,
545 pathspec->items[num].original))
547 * Ok, we have a match already.
549 found_dup = 1;
551 if (found_dup)
552 continue;
554 error(_("pathspec '%s' did not match any file(s) known to git"),
555 pathspec->items[num].original);
556 errors++;
558 return errors;
562 * Return the length of the "simple" part of a path match limiter.
564 int simple_length(const char *match)
566 int len = -1;
568 for (;;) {
569 unsigned char c = *match++;
570 len++;
571 if (c == '\0' || is_glob_special(c))
572 return len;
576 int no_wildcard(const char *string)
578 return string[simple_length(string)] == '\0';
581 void parse_path_pattern(const char **pattern,
582 int *patternlen,
583 unsigned *flags,
584 int *nowildcardlen)
586 const char *p = *pattern;
587 size_t i, len;
589 *flags = 0;
590 if (*p == '!') {
591 *flags |= PATTERN_FLAG_NEGATIVE;
592 p++;
594 len = strlen(p);
595 if (len && p[len - 1] == '/') {
596 len--;
597 *flags |= PATTERN_FLAG_MUSTBEDIR;
599 for (i = 0; i < len; i++) {
600 if (p[i] == '/')
601 break;
603 if (i == len)
604 *flags |= PATTERN_FLAG_NODIR;
605 *nowildcardlen = simple_length(p);
607 * we should have excluded the trailing slash from 'p' too,
608 * but that's one more allocation. Instead just make sure
609 * nowildcardlen does not exceed real patternlen
611 if (*nowildcardlen > len)
612 *nowildcardlen = len;
613 if (*p == '*' && no_wildcard(p + 1))
614 *flags |= PATTERN_FLAG_ENDSWITH;
615 *pattern = p;
616 *patternlen = len;
619 int pl_hashmap_cmp(const void *unused_cmp_data,
620 const struct hashmap_entry *a,
621 const struct hashmap_entry *b,
622 const void *key)
624 const struct pattern_entry *ee1 =
625 container_of(a, struct pattern_entry, ent);
626 const struct pattern_entry *ee2 =
627 container_of(b, struct pattern_entry, ent);
629 size_t min_len = ee1->patternlen <= ee2->patternlen
630 ? ee1->patternlen
631 : ee2->patternlen;
633 if (ignore_case)
634 return strncasecmp(ee1->pattern, ee2->pattern, min_len);
635 return strncmp(ee1->pattern, ee2->pattern, min_len);
638 static void add_pattern_to_hashsets(struct pattern_list *pl, struct path_pattern *given)
640 struct pattern_entry *translated;
641 char *truncated;
642 char *data = NULL;
644 if (!pl->use_cone_patterns)
645 return;
647 if (given->flags & PATTERN_FLAG_NEGATIVE &&
648 given->flags & PATTERN_FLAG_MUSTBEDIR &&
649 !strcmp(given->pattern, "/*")) {
650 pl->full_cone = 0;
651 return;
654 if (!given->flags && !strcmp(given->pattern, "/*")) {
655 pl->full_cone = 1;
656 return;
659 if (given->patternlen > 2 &&
660 !strcmp(given->pattern + given->patternlen - 2, "/*")) {
661 if (!(given->flags & PATTERN_FLAG_NEGATIVE)) {
662 /* Not a cone pattern. */
663 pl->use_cone_patterns = 0;
664 warning(_("unrecognized pattern: '%s'"), given->pattern);
665 goto clear_hashmaps;
668 truncated = xstrdup(given->pattern);
669 truncated[given->patternlen - 2] = 0;
671 translated = xmalloc(sizeof(struct pattern_entry));
672 translated->pattern = truncated;
673 translated->patternlen = given->patternlen - 2;
674 hashmap_entry_init(&translated->ent,
675 ignore_case ?
676 strihash(translated->pattern) :
677 strhash(translated->pattern));
679 if (!hashmap_get_entry(&pl->recursive_hashmap,
680 translated, ent, NULL)) {
681 /* We did not see the "parent" included */
682 warning(_("unrecognized negative pattern: '%s'"),
683 given->pattern);
684 free(truncated);
685 free(translated);
686 goto clear_hashmaps;
689 hashmap_add(&pl->parent_hashmap, &translated->ent);
690 hashmap_remove(&pl->recursive_hashmap, &translated->ent, &data);
691 free(data);
692 return;
695 if (given->flags & PATTERN_FLAG_NEGATIVE) {
696 warning(_("unrecognized negative pattern: '%s'"),
697 given->pattern);
698 goto clear_hashmaps;
701 translated = xmalloc(sizeof(struct pattern_entry));
703 translated->pattern = xstrdup(given->pattern);
704 translated->patternlen = given->patternlen;
705 hashmap_entry_init(&translated->ent,
706 ignore_case ?
707 strihash(translated->pattern) :
708 strhash(translated->pattern));
710 hashmap_add(&pl->recursive_hashmap, &translated->ent);
712 if (hashmap_get_entry(&pl->parent_hashmap, translated, ent, NULL)) {
713 /* we already included this at the parent level */
714 warning(_("your sparse-checkout file may have issues: pattern '%s' is repeated"),
715 given->pattern);
716 hashmap_remove(&pl->parent_hashmap, &translated->ent, &data);
717 free(data);
718 free(translated);
721 return;
723 clear_hashmaps:
724 warning(_("disabling cone pattern matching"));
725 hashmap_free_entries(&pl->parent_hashmap, struct pattern_entry, ent);
726 hashmap_free_entries(&pl->recursive_hashmap, struct pattern_entry, ent);
727 pl->use_cone_patterns = 0;
730 static int hashmap_contains_path(struct hashmap *map,
731 struct strbuf *pattern)
733 struct pattern_entry p;
735 /* Check straight mapping */
736 p.pattern = pattern->buf;
737 p.patternlen = pattern->len;
738 hashmap_entry_init(&p.ent,
739 ignore_case ?
740 strihash(p.pattern) :
741 strhash(p.pattern));
742 return !!hashmap_get_entry(map, &p, ent, NULL);
745 int hashmap_contains_parent(struct hashmap *map,
746 const char *path,
747 struct strbuf *buffer)
749 char *slash_pos;
751 strbuf_setlen(buffer, 0);
753 if (path[0] != '/')
754 strbuf_addch(buffer, '/');
756 strbuf_addstr(buffer, path);
758 slash_pos = strrchr(buffer->buf, '/');
760 while (slash_pos > buffer->buf) {
761 strbuf_setlen(buffer, slash_pos - buffer->buf);
763 if (hashmap_contains_path(map, buffer))
764 return 1;
766 slash_pos = strrchr(buffer->buf, '/');
769 return 0;
772 void add_pattern(const char *string, const char *base,
773 int baselen, struct pattern_list *pl, int srcpos)
775 struct path_pattern *pattern;
776 int patternlen;
777 unsigned flags;
778 int nowildcardlen;
780 parse_path_pattern(&string, &patternlen, &flags, &nowildcardlen);
781 if (flags & PATTERN_FLAG_MUSTBEDIR) {
782 FLEXPTR_ALLOC_MEM(pattern, pattern, string, patternlen);
783 } else {
784 pattern = xmalloc(sizeof(*pattern));
785 pattern->pattern = string;
787 pattern->patternlen = patternlen;
788 pattern->nowildcardlen = nowildcardlen;
789 pattern->base = base;
790 pattern->baselen = baselen;
791 pattern->flags = flags;
792 pattern->srcpos = srcpos;
793 ALLOC_GROW(pl->patterns, pl->nr + 1, pl->alloc);
794 pl->patterns[pl->nr++] = pattern;
795 pattern->pl = pl;
797 add_pattern_to_hashsets(pl, pattern);
800 static int read_skip_worktree_file_from_index(const struct index_state *istate,
801 const char *path,
802 size_t *size_out, char **data_out,
803 struct oid_stat *oid_stat)
805 int pos, len;
807 len = strlen(path);
808 pos = index_name_pos(istate, path, len);
809 if (pos < 0)
810 return -1;
811 if (!ce_skip_worktree(istate->cache[pos]))
812 return -1;
814 return do_read_blob(&istate->cache[pos]->oid, oid_stat, size_out, data_out);
818 * Frees memory within pl which was allocated for exclude patterns and
819 * the file buffer. Does not free pl itself.
821 void clear_pattern_list(struct pattern_list *pl)
823 int i;
825 for (i = 0; i < pl->nr; i++)
826 free(pl->patterns[i]);
827 free(pl->patterns);
828 free(pl->filebuf);
830 memset(pl, 0, sizeof(*pl));
833 static void trim_trailing_spaces(char *buf)
835 char *p, *last_space = NULL;
837 for (p = buf; *p; p++)
838 switch (*p) {
839 case ' ':
840 if (!last_space)
841 last_space = p;
842 break;
843 case '\\':
844 p++;
845 if (!*p)
846 return;
847 /* fallthrough */
848 default:
849 last_space = NULL;
852 if (last_space)
853 *last_space = '\0';
857 * Given a subdirectory name and "dir" of the current directory,
858 * search the subdir in "dir" and return it, or create a new one if it
859 * does not exist in "dir".
861 * If "name" has the trailing slash, it'll be excluded in the search.
863 static struct untracked_cache_dir *lookup_untracked(struct untracked_cache *uc,
864 struct untracked_cache_dir *dir,
865 const char *name, int len)
867 int first, last;
868 struct untracked_cache_dir *d;
869 if (!dir)
870 return NULL;
871 if (len && name[len - 1] == '/')
872 len--;
873 first = 0;
874 last = dir->dirs_nr;
875 while (last > first) {
876 int cmp, next = first + ((last - first) >> 1);
877 d = dir->dirs[next];
878 cmp = strncmp(name, d->name, len);
879 if (!cmp && strlen(d->name) > len)
880 cmp = -1;
881 if (!cmp)
882 return d;
883 if (cmp < 0) {
884 last = next;
885 continue;
887 first = next+1;
890 uc->dir_created++;
891 FLEX_ALLOC_MEM(d, name, name, len);
893 ALLOC_GROW(dir->dirs, dir->dirs_nr + 1, dir->dirs_alloc);
894 MOVE_ARRAY(dir->dirs + first + 1, dir->dirs + first,
895 dir->dirs_nr - first);
896 dir->dirs_nr++;
897 dir->dirs[first] = d;
898 return d;
901 static void do_invalidate_gitignore(struct untracked_cache_dir *dir)
903 int i;
904 dir->valid = 0;
905 dir->untracked_nr = 0;
906 for (i = 0; i < dir->dirs_nr; i++)
907 do_invalidate_gitignore(dir->dirs[i]);
910 static void invalidate_gitignore(struct untracked_cache *uc,
911 struct untracked_cache_dir *dir)
913 uc->gitignore_invalidated++;
914 do_invalidate_gitignore(dir);
917 static void invalidate_directory(struct untracked_cache *uc,
918 struct untracked_cache_dir *dir)
920 int i;
923 * Invalidation increment here is just roughly correct. If
924 * untracked_nr or any of dirs[].recurse is non-zero, we
925 * should increment dir_invalidated too. But that's more
926 * expensive to do.
928 if (dir->valid)
929 uc->dir_invalidated++;
931 dir->valid = 0;
932 dir->untracked_nr = 0;
933 for (i = 0; i < dir->dirs_nr; i++)
934 dir->dirs[i]->recurse = 0;
937 static int add_patterns_from_buffer(char *buf, size_t size,
938 const char *base, int baselen,
939 struct pattern_list *pl);
942 * Given a file with name "fname", read it (either from disk, or from
943 * an index if 'istate' is non-null), parse it and store the
944 * exclude rules in "pl".
946 * If "ss" is not NULL, compute SHA-1 of the exclude file and fill
947 * stat data from disk (only valid if add_patterns returns zero). If
948 * ss_valid is non-zero, "ss" must contain good value as input.
950 static int add_patterns(const char *fname, const char *base, int baselen,
951 struct pattern_list *pl, struct index_state *istate,
952 struct oid_stat *oid_stat)
954 struct stat st;
955 int r;
956 int fd;
957 size_t size = 0;
958 char *buf;
960 fd = open(fname, O_RDONLY);
961 if (fd < 0 || fstat(fd, &st) < 0) {
962 if (fd < 0)
963 warn_on_fopen_errors(fname);
964 else
965 close(fd);
966 if (!istate)
967 return -1;
968 r = read_skip_worktree_file_from_index(istate, fname,
969 &size, &buf,
970 oid_stat);
971 if (r != 1)
972 return r;
973 } else {
974 size = xsize_t(st.st_size);
975 if (size == 0) {
976 if (oid_stat) {
977 fill_stat_data(&oid_stat->stat, &st);
978 oidcpy(&oid_stat->oid, the_hash_algo->empty_blob);
979 oid_stat->valid = 1;
981 close(fd);
982 return 0;
984 buf = xmallocz(size);
985 if (read_in_full(fd, buf, size) != size) {
986 free(buf);
987 close(fd);
988 return -1;
990 buf[size++] = '\n';
991 close(fd);
992 if (oid_stat) {
993 int pos;
994 if (oid_stat->valid &&
995 !match_stat_data_racy(istate, &oid_stat->stat, &st))
996 ; /* no content change, ss->sha1 still good */
997 else if (istate &&
998 (pos = index_name_pos(istate, fname, strlen(fname))) >= 0 &&
999 !ce_stage(istate->cache[pos]) &&
1000 ce_uptodate(istate->cache[pos]) &&
1001 !would_convert_to_git(istate, fname))
1002 oidcpy(&oid_stat->oid,
1003 &istate->cache[pos]->oid);
1004 else
1005 hash_object_file(buf, size, "blob",
1006 &oid_stat->oid);
1007 fill_stat_data(&oid_stat->stat, &st);
1008 oid_stat->valid = 1;
1012 add_patterns_from_buffer(buf, size, base, baselen, pl);
1013 return 0;
1016 static int add_patterns_from_buffer(char *buf, size_t size,
1017 const char *base, int baselen,
1018 struct pattern_list *pl)
1020 int i, lineno = 1;
1021 char *entry;
1023 hashmap_init(&pl->recursive_hashmap, pl_hashmap_cmp, NULL, 0);
1024 hashmap_init(&pl->parent_hashmap, pl_hashmap_cmp, NULL, 0);
1026 pl->filebuf = buf;
1028 if (skip_utf8_bom(&buf, size))
1029 size -= buf - pl->filebuf;
1031 entry = buf;
1033 for (i = 0; i < size; i++) {
1034 if (buf[i] == '\n') {
1035 if (entry != buf + i && entry[0] != '#') {
1036 buf[i - (i && buf[i-1] == '\r')] = 0;
1037 trim_trailing_spaces(entry);
1038 add_pattern(entry, base, baselen, pl, lineno);
1040 lineno++;
1041 entry = buf + i + 1;
1044 return 0;
1047 int add_patterns_from_file_to_list(const char *fname, const char *base,
1048 int baselen, struct pattern_list *pl,
1049 struct index_state *istate)
1051 return add_patterns(fname, base, baselen, pl, istate, NULL);
1054 int add_patterns_from_blob_to_list(
1055 struct object_id *oid,
1056 const char *base, int baselen,
1057 struct pattern_list *pl)
1059 char *buf;
1060 size_t size;
1061 int r;
1063 r = do_read_blob(oid, NULL, &size, &buf);
1064 if (r != 1)
1065 return r;
1067 add_patterns_from_buffer(buf, size, base, baselen, pl);
1068 return 0;
1071 struct pattern_list *add_pattern_list(struct dir_struct *dir,
1072 int group_type, const char *src)
1074 struct pattern_list *pl;
1075 struct exclude_list_group *group;
1077 group = &dir->exclude_list_group[group_type];
1078 ALLOC_GROW(group->pl, group->nr + 1, group->alloc);
1079 pl = &group->pl[group->nr++];
1080 memset(pl, 0, sizeof(*pl));
1081 pl->src = src;
1082 return pl;
1086 * Used to set up core.excludesfile and .git/info/exclude lists.
1088 static void add_patterns_from_file_1(struct dir_struct *dir, const char *fname,
1089 struct oid_stat *oid_stat)
1091 struct pattern_list *pl;
1093 * catch setup_standard_excludes() that's called before
1094 * dir->untracked is assigned. That function behaves
1095 * differently when dir->untracked is non-NULL.
1097 if (!dir->untracked)
1098 dir->unmanaged_exclude_files++;
1099 pl = add_pattern_list(dir, EXC_FILE, fname);
1100 if (add_patterns(fname, "", 0, pl, NULL, oid_stat) < 0)
1101 die(_("cannot use %s as an exclude file"), fname);
1104 void add_patterns_from_file(struct dir_struct *dir, const char *fname)
1106 dir->unmanaged_exclude_files++; /* see validate_untracked_cache() */
1107 add_patterns_from_file_1(dir, fname, NULL);
1110 int match_basename(const char *basename, int basenamelen,
1111 const char *pattern, int prefix, int patternlen,
1112 unsigned flags)
1114 if (prefix == patternlen) {
1115 if (patternlen == basenamelen &&
1116 !fspathncmp(pattern, basename, basenamelen))
1117 return 1;
1118 } else if (flags & PATTERN_FLAG_ENDSWITH) {
1119 /* "*literal" matching against "fooliteral" */
1120 if (patternlen - 1 <= basenamelen &&
1121 !fspathncmp(pattern + 1,
1122 basename + basenamelen - (patternlen - 1),
1123 patternlen - 1))
1124 return 1;
1125 } else {
1126 if (fnmatch_icase_mem(pattern, patternlen,
1127 basename, basenamelen,
1128 0) == 0)
1129 return 1;
1131 return 0;
1134 int match_pathname(const char *pathname, int pathlen,
1135 const char *base, int baselen,
1136 const char *pattern, int prefix, int patternlen,
1137 unsigned flags)
1139 const char *name;
1140 int namelen;
1143 * match with FNM_PATHNAME; the pattern has base implicitly
1144 * in front of it.
1146 if (*pattern == '/') {
1147 pattern++;
1148 patternlen--;
1149 prefix--;
1153 * baselen does not count the trailing slash. base[] may or
1154 * may not end with a trailing slash though.
1156 if (pathlen < baselen + 1 ||
1157 (baselen && pathname[baselen] != '/') ||
1158 fspathncmp(pathname, base, baselen))
1159 return 0;
1161 namelen = baselen ? pathlen - baselen - 1 : pathlen;
1162 name = pathname + pathlen - namelen;
1164 if (prefix) {
1166 * if the non-wildcard part is longer than the
1167 * remaining pathname, surely it cannot match.
1169 if (prefix > namelen)
1170 return 0;
1172 if (fspathncmp(pattern, name, prefix))
1173 return 0;
1174 pattern += prefix;
1175 patternlen -= prefix;
1176 name += prefix;
1177 namelen -= prefix;
1180 * If the whole pattern did not have a wildcard,
1181 * then our prefix match is all we need; we
1182 * do not need to call fnmatch at all.
1184 if (!patternlen && !namelen)
1185 return 1;
1188 return fnmatch_icase_mem(pattern, patternlen,
1189 name, namelen,
1190 WM_PATHNAME) == 0;
1194 * Scan the given exclude list in reverse to see whether pathname
1195 * should be ignored. The first match (i.e. the last on the list), if
1196 * any, determines the fate. Returns the exclude_list element which
1197 * matched, or NULL for undecided.
1199 static struct path_pattern *last_matching_pattern_from_list(const char *pathname,
1200 int pathlen,
1201 const char *basename,
1202 int *dtype,
1203 struct pattern_list *pl,
1204 struct index_state *istate)
1206 struct path_pattern *res = NULL; /* undecided */
1207 int i;
1209 if (!pl->nr)
1210 return NULL; /* undefined */
1212 for (i = pl->nr - 1; 0 <= i; i--) {
1213 struct path_pattern *pattern = pl->patterns[i];
1214 const char *exclude = pattern->pattern;
1215 int prefix = pattern->nowildcardlen;
1217 if (pattern->flags & PATTERN_FLAG_MUSTBEDIR) {
1218 if (*dtype == DT_UNKNOWN)
1219 *dtype = get_dtype(NULL, istate, pathname, pathlen);
1220 if (*dtype != DT_DIR)
1221 continue;
1224 if (pattern->flags & PATTERN_FLAG_NODIR) {
1225 if (match_basename(basename,
1226 pathlen - (basename - pathname),
1227 exclude, prefix, pattern->patternlen,
1228 pattern->flags)) {
1229 res = pattern;
1230 break;
1232 continue;
1235 assert(pattern->baselen == 0 ||
1236 pattern->base[pattern->baselen - 1] == '/');
1237 if (match_pathname(pathname, pathlen,
1238 pattern->base,
1239 pattern->baselen ? pattern->baselen - 1 : 0,
1240 exclude, prefix, pattern->patternlen,
1241 pattern->flags)) {
1242 res = pattern;
1243 break;
1246 return res;
1250 * Scan the list of patterns to determine if the ordered list
1251 * of patterns matches on 'pathname'.
1253 * Return 1 for a match, 0 for not matched and -1 for undecided.
1255 enum pattern_match_result path_matches_pattern_list(
1256 const char *pathname, int pathlen,
1257 const char *basename, int *dtype,
1258 struct pattern_list *pl,
1259 struct index_state *istate)
1261 struct path_pattern *pattern;
1262 struct strbuf parent_pathname = STRBUF_INIT;
1263 int result = NOT_MATCHED;
1264 const char *slash_pos;
1266 if (!pl->use_cone_patterns) {
1267 pattern = last_matching_pattern_from_list(pathname, pathlen, basename,
1268 dtype, pl, istate);
1269 if (pattern) {
1270 if (pattern->flags & PATTERN_FLAG_NEGATIVE)
1271 return NOT_MATCHED;
1272 else
1273 return MATCHED;
1276 return UNDECIDED;
1279 if (pl->full_cone)
1280 return MATCHED;
1282 strbuf_addch(&parent_pathname, '/');
1283 strbuf_add(&parent_pathname, pathname, pathlen);
1285 if (hashmap_contains_path(&pl->recursive_hashmap,
1286 &parent_pathname)) {
1287 result = MATCHED_RECURSIVE;
1288 goto done;
1291 slash_pos = strrchr(parent_pathname.buf, '/');
1293 if (slash_pos == parent_pathname.buf) {
1294 /* include every file in root */
1295 result = MATCHED;
1296 goto done;
1299 strbuf_setlen(&parent_pathname, slash_pos - parent_pathname.buf);
1301 if (hashmap_contains_path(&pl->parent_hashmap, &parent_pathname)) {
1302 result = MATCHED;
1303 goto done;
1306 if (hashmap_contains_parent(&pl->recursive_hashmap,
1307 pathname,
1308 &parent_pathname))
1309 result = MATCHED_RECURSIVE;
1311 done:
1312 strbuf_release(&parent_pathname);
1313 return result;
1316 static struct path_pattern *last_matching_pattern_from_lists(
1317 struct dir_struct *dir, struct index_state *istate,
1318 const char *pathname, int pathlen,
1319 const char *basename, int *dtype_p)
1321 int i, j;
1322 struct exclude_list_group *group;
1323 struct path_pattern *pattern;
1324 for (i = EXC_CMDL; i <= EXC_FILE; i++) {
1325 group = &dir->exclude_list_group[i];
1326 for (j = group->nr - 1; j >= 0; j--) {
1327 pattern = last_matching_pattern_from_list(
1328 pathname, pathlen, basename, dtype_p,
1329 &group->pl[j], istate);
1330 if (pattern)
1331 return pattern;
1334 return NULL;
1338 * Loads the per-directory exclude list for the substring of base
1339 * which has a char length of baselen.
1341 static void prep_exclude(struct dir_struct *dir,
1342 struct index_state *istate,
1343 const char *base, int baselen)
1345 struct exclude_list_group *group;
1346 struct pattern_list *pl;
1347 struct exclude_stack *stk = NULL;
1348 struct untracked_cache_dir *untracked;
1349 int current;
1351 group = &dir->exclude_list_group[EXC_DIRS];
1354 * Pop the exclude lists from the EXCL_DIRS exclude_list_group
1355 * which originate from directories not in the prefix of the
1356 * path being checked.
1358 while ((stk = dir->exclude_stack) != NULL) {
1359 if (stk->baselen <= baselen &&
1360 !strncmp(dir->basebuf.buf, base, stk->baselen))
1361 break;
1362 pl = &group->pl[dir->exclude_stack->exclude_ix];
1363 dir->exclude_stack = stk->prev;
1364 dir->pattern = NULL;
1365 free((char *)pl->src); /* see strbuf_detach() below */
1366 clear_pattern_list(pl);
1367 free(stk);
1368 group->nr--;
1371 /* Skip traversing into sub directories if the parent is excluded */
1372 if (dir->pattern)
1373 return;
1376 * Lazy initialization. All call sites currently just
1377 * memset(dir, 0, sizeof(*dir)) before use. Changing all of
1378 * them seems lots of work for little benefit.
1380 if (!dir->basebuf.buf)
1381 strbuf_init(&dir->basebuf, PATH_MAX);
1383 /* Read from the parent directories and push them down. */
1384 current = stk ? stk->baselen : -1;
1385 strbuf_setlen(&dir->basebuf, current < 0 ? 0 : current);
1386 if (dir->untracked)
1387 untracked = stk ? stk->ucd : dir->untracked->root;
1388 else
1389 untracked = NULL;
1391 while (current < baselen) {
1392 const char *cp;
1393 struct oid_stat oid_stat;
1395 stk = xcalloc(1, sizeof(*stk));
1396 if (current < 0) {
1397 cp = base;
1398 current = 0;
1399 } else {
1400 cp = strchr(base + current + 1, '/');
1401 if (!cp)
1402 die("oops in prep_exclude");
1403 cp++;
1404 untracked =
1405 lookup_untracked(dir->untracked, untracked,
1406 base + current,
1407 cp - base - current);
1409 stk->prev = dir->exclude_stack;
1410 stk->baselen = cp - base;
1411 stk->exclude_ix = group->nr;
1412 stk->ucd = untracked;
1413 pl = add_pattern_list(dir, EXC_DIRS, NULL);
1414 strbuf_add(&dir->basebuf, base + current, stk->baselen - current);
1415 assert(stk->baselen == dir->basebuf.len);
1417 /* Abort if the directory is excluded */
1418 if (stk->baselen) {
1419 int dt = DT_DIR;
1420 dir->basebuf.buf[stk->baselen - 1] = 0;
1421 dir->pattern = last_matching_pattern_from_lists(dir,
1422 istate,
1423 dir->basebuf.buf, stk->baselen - 1,
1424 dir->basebuf.buf + current, &dt);
1425 dir->basebuf.buf[stk->baselen - 1] = '/';
1426 if (dir->pattern &&
1427 dir->pattern->flags & PATTERN_FLAG_NEGATIVE)
1428 dir->pattern = NULL;
1429 if (dir->pattern) {
1430 dir->exclude_stack = stk;
1431 return;
1435 /* Try to read per-directory file */
1436 oidclr(&oid_stat.oid);
1437 oid_stat.valid = 0;
1438 if (dir->exclude_per_dir &&
1440 * If we know that no files have been added in
1441 * this directory (i.e. valid_cached_dir() has
1442 * been executed and set untracked->valid) ..
1444 (!untracked || !untracked->valid ||
1446 * .. and .gitignore does not exist before
1447 * (i.e. null exclude_oid). Then we can skip
1448 * loading .gitignore, which would result in
1449 * ENOENT anyway.
1451 !is_null_oid(&untracked->exclude_oid))) {
1453 * dir->basebuf gets reused by the traversal, but we
1454 * need fname to remain unchanged to ensure the src
1455 * member of each struct path_pattern correctly
1456 * back-references its source file. Other invocations
1457 * of add_pattern_list provide stable strings, so we
1458 * strbuf_detach() and free() here in the caller.
1460 struct strbuf sb = STRBUF_INIT;
1461 strbuf_addbuf(&sb, &dir->basebuf);
1462 strbuf_addstr(&sb, dir->exclude_per_dir);
1463 pl->src = strbuf_detach(&sb, NULL);
1464 add_patterns(pl->src, pl->src, stk->baselen, pl, istate,
1465 untracked ? &oid_stat : NULL);
1468 * NEEDSWORK: when untracked cache is enabled, prep_exclude()
1469 * will first be called in valid_cached_dir() then maybe many
1470 * times more in last_matching_pattern(). When the cache is
1471 * used, last_matching_pattern() will not be called and
1472 * reading .gitignore content will be a waste.
1474 * So when it's called by valid_cached_dir() and we can get
1475 * .gitignore SHA-1 from the index (i.e. .gitignore is not
1476 * modified on work tree), we could delay reading the
1477 * .gitignore content until we absolutely need it in
1478 * last_matching_pattern(). Be careful about ignore rule
1479 * order, though, if you do that.
1481 if (untracked &&
1482 !oideq(&oid_stat.oid, &untracked->exclude_oid)) {
1483 invalidate_gitignore(dir->untracked, untracked);
1484 oidcpy(&untracked->exclude_oid, &oid_stat.oid);
1486 dir->exclude_stack = stk;
1487 current = stk->baselen;
1489 strbuf_setlen(&dir->basebuf, baselen);
1493 * Loads the exclude lists for the directory containing pathname, then
1494 * scans all exclude lists to determine whether pathname is excluded.
1495 * Returns the exclude_list element which matched, or NULL for
1496 * undecided.
1498 struct path_pattern *last_matching_pattern(struct dir_struct *dir,
1499 struct index_state *istate,
1500 const char *pathname,
1501 int *dtype_p)
1503 int pathlen = strlen(pathname);
1504 const char *basename = strrchr(pathname, '/');
1505 basename = (basename) ? basename+1 : pathname;
1507 prep_exclude(dir, istate, pathname, basename-pathname);
1509 if (dir->pattern)
1510 return dir->pattern;
1512 return last_matching_pattern_from_lists(dir, istate, pathname, pathlen,
1513 basename, dtype_p);
1517 * Loads the exclude lists for the directory containing pathname, then
1518 * scans all exclude lists to determine whether pathname is excluded.
1519 * Returns 1 if true, otherwise 0.
1521 int is_excluded(struct dir_struct *dir, struct index_state *istate,
1522 const char *pathname, int *dtype_p)
1524 struct path_pattern *pattern =
1525 last_matching_pattern(dir, istate, pathname, dtype_p);
1526 if (pattern)
1527 return pattern->flags & PATTERN_FLAG_NEGATIVE ? 0 : 1;
1528 return 0;
1531 static struct dir_entry *dir_entry_new(const char *pathname, int len)
1533 struct dir_entry *ent;
1535 FLEX_ALLOC_MEM(ent, name, pathname, len);
1536 ent->len = len;
1537 return ent;
1540 static struct dir_entry *dir_add_name(struct dir_struct *dir,
1541 struct index_state *istate,
1542 const char *pathname, int len)
1544 if (index_file_exists(istate, pathname, len, ignore_case))
1545 return NULL;
1547 ALLOC_GROW(dir->entries, dir->nr+1, dir->alloc);
1548 return dir->entries[dir->nr++] = dir_entry_new(pathname, len);
1551 struct dir_entry *dir_add_ignored(struct dir_struct *dir,
1552 struct index_state *istate,
1553 const char *pathname, int len)
1555 if (!index_name_is_other(istate, pathname, len))
1556 return NULL;
1558 ALLOC_GROW(dir->ignored, dir->ignored_nr+1, dir->ignored_alloc);
1559 return dir->ignored[dir->ignored_nr++] = dir_entry_new(pathname, len);
1562 enum exist_status {
1563 index_nonexistent = 0,
1564 index_directory,
1565 index_gitdir
1569 * Do not use the alphabetically sorted index to look up
1570 * the directory name; instead, use the case insensitive
1571 * directory hash.
1573 static enum exist_status directory_exists_in_index_icase(struct index_state *istate,
1574 const char *dirname, int len)
1576 struct cache_entry *ce;
1578 if (index_dir_exists(istate, dirname, len))
1579 return index_directory;
1581 ce = index_file_exists(istate, dirname, len, ignore_case);
1582 if (ce && S_ISGITLINK(ce->ce_mode))
1583 return index_gitdir;
1585 return index_nonexistent;
1589 * The index sorts alphabetically by entry name, which
1590 * means that a gitlink sorts as '\0' at the end, while
1591 * a directory (which is defined not as an entry, but as
1592 * the files it contains) will sort with the '/' at the
1593 * end.
1595 static enum exist_status directory_exists_in_index(struct index_state *istate,
1596 const char *dirname, int len)
1598 int pos;
1600 if (ignore_case)
1601 return directory_exists_in_index_icase(istate, dirname, len);
1603 pos = index_name_pos(istate, dirname, len);
1604 if (pos < 0)
1605 pos = -pos-1;
1606 while (pos < istate->cache_nr) {
1607 const struct cache_entry *ce = istate->cache[pos++];
1608 unsigned char endchar;
1610 if (strncmp(ce->name, dirname, len))
1611 break;
1612 endchar = ce->name[len];
1613 if (endchar > '/')
1614 break;
1615 if (endchar == '/')
1616 return index_directory;
1617 if (!endchar && S_ISGITLINK(ce->ce_mode))
1618 return index_gitdir;
1620 return index_nonexistent;
1624 * When we find a directory when traversing the filesystem, we
1625 * have three distinct cases:
1627 * - ignore it
1628 * - see it as a directory
1629 * - recurse into it
1631 * and which one we choose depends on a combination of existing
1632 * git index contents and the flags passed into the directory
1633 * traversal routine.
1635 * Case 1: If we *already* have entries in the index under that
1636 * directory name, we always recurse into the directory to see
1637 * all the files.
1639 * Case 2: If we *already* have that directory name as a gitlink,
1640 * we always continue to see it as a gitlink, regardless of whether
1641 * there is an actual git directory there or not (it might not
1642 * be checked out as a subproject!)
1644 * Case 3: if we didn't have it in the index previously, we
1645 * have a few sub-cases:
1647 * (a) if "show_other_directories" is true, we show it as
1648 * just a directory, unless "hide_empty_directories" is
1649 * also true, in which case we need to check if it contains any
1650 * untracked and / or ignored files.
1651 * (b) if it looks like a git directory, and we don't have
1652 * 'no_gitlinks' set we treat it as a gitlink, and show it
1653 * as a directory.
1654 * (c) otherwise, we recurse into it.
1656 static enum path_treatment treat_directory(struct dir_struct *dir,
1657 struct index_state *istate,
1658 struct untracked_cache_dir *untracked,
1659 const char *dirname, int len, int baselen, int exclude,
1660 const struct pathspec *pathspec)
1662 int nested_repo = 0;
1664 /* The "len-1" is to strip the final '/' */
1665 switch (directory_exists_in_index(istate, dirname, len-1)) {
1666 case index_directory:
1667 return path_recurse;
1669 case index_gitdir:
1670 return path_none;
1672 case index_nonexistent:
1673 if ((dir->flags & DIR_SKIP_NESTED_GIT) ||
1674 !(dir->flags & DIR_NO_GITLINKS)) {
1675 struct strbuf sb = STRBUF_INIT;
1676 strbuf_addstr(&sb, dirname);
1677 nested_repo = is_nonbare_repository_dir(&sb);
1678 strbuf_release(&sb);
1680 if (nested_repo)
1681 return ((dir->flags & DIR_SKIP_NESTED_GIT) ? path_none :
1682 (exclude ? path_excluded : path_untracked));
1684 if (dir->flags & DIR_SHOW_OTHER_DIRECTORIES)
1685 break;
1686 if (exclude &&
1687 (dir->flags & DIR_SHOW_IGNORED_TOO) &&
1688 (dir->flags & DIR_SHOW_IGNORED_TOO_MODE_MATCHING)) {
1691 * This is an excluded directory and we are
1692 * showing ignored paths that match an exclude
1693 * pattern. (e.g. show directory as ignored
1694 * only if it matches an exclude pattern).
1695 * This path will either be 'path_excluded`
1696 * (if we are showing empty directories or if
1697 * the directory is not empty), or will be
1698 * 'path_none' (empty directory, and we are
1699 * not showing empty directories).
1701 if (!(dir->flags & DIR_HIDE_EMPTY_DIRECTORIES))
1702 return path_excluded;
1704 if (read_directory_recursive(dir, istate, dirname, len,
1705 untracked, 1, 1, pathspec) == path_excluded)
1706 return path_excluded;
1708 return path_none;
1710 return path_recurse;
1713 /* This is the "show_other_directories" case */
1715 if (!(dir->flags & DIR_HIDE_EMPTY_DIRECTORIES))
1716 return exclude ? path_excluded : path_untracked;
1718 untracked = lookup_untracked(dir->untracked, untracked,
1719 dirname + baselen, len - baselen);
1722 * If this is an excluded directory, then we only need to check if
1723 * the directory contains any files.
1725 return read_directory_recursive(dir, istate, dirname, len,
1726 untracked, 1, exclude, pathspec);
1730 * This is an inexact early pruning of any recursive directory
1731 * reading - if the path cannot possibly be in the pathspec,
1732 * return true, and we'll skip it early.
1734 static int simplify_away(const char *path, int pathlen,
1735 const struct pathspec *pathspec)
1737 int i;
1739 if (!pathspec || !pathspec->nr)
1740 return 0;
1742 GUARD_PATHSPEC(pathspec,
1743 PATHSPEC_FROMTOP |
1744 PATHSPEC_MAXDEPTH |
1745 PATHSPEC_LITERAL |
1746 PATHSPEC_GLOB |
1747 PATHSPEC_ICASE |
1748 PATHSPEC_EXCLUDE |
1749 PATHSPEC_ATTR);
1751 for (i = 0; i < pathspec->nr; i++) {
1752 const struct pathspec_item *item = &pathspec->items[i];
1753 int len = item->nowildcard_len;
1755 if (len > pathlen)
1756 len = pathlen;
1757 if (!ps_strncmp(item, item->match, path, len))
1758 return 0;
1761 return 1;
1765 * This function tells us whether an excluded path matches a
1766 * list of "interesting" pathspecs. That is, whether a path matched
1767 * by any of the pathspecs could possibly be ignored by excluding
1768 * the specified path. This can happen if:
1770 * 1. the path is mentioned explicitly in the pathspec
1772 * 2. the path is a directory prefix of some element in the
1773 * pathspec
1775 static int exclude_matches_pathspec(const char *path, int pathlen,
1776 const struct pathspec *pathspec)
1778 int i;
1780 if (!pathspec || !pathspec->nr)
1781 return 0;
1783 GUARD_PATHSPEC(pathspec,
1784 PATHSPEC_FROMTOP |
1785 PATHSPEC_MAXDEPTH |
1786 PATHSPEC_LITERAL |
1787 PATHSPEC_GLOB |
1788 PATHSPEC_ICASE |
1789 PATHSPEC_EXCLUDE);
1791 for (i = 0; i < pathspec->nr; i++) {
1792 const struct pathspec_item *item = &pathspec->items[i];
1793 int len = item->nowildcard_len;
1795 if (len == pathlen &&
1796 !ps_strncmp(item, item->match, path, pathlen))
1797 return 1;
1798 if (len > pathlen &&
1799 item->match[pathlen] == '/' &&
1800 !ps_strncmp(item, item->match, path, pathlen))
1801 return 1;
1803 return 0;
1806 static int get_index_dtype(struct index_state *istate,
1807 const char *path, int len)
1809 int pos;
1810 const struct cache_entry *ce;
1812 ce = index_file_exists(istate, path, len, 0);
1813 if (ce) {
1814 if (!ce_uptodate(ce))
1815 return DT_UNKNOWN;
1816 if (S_ISGITLINK(ce->ce_mode))
1817 return DT_DIR;
1819 * Nobody actually cares about the
1820 * difference between DT_LNK and DT_REG
1822 return DT_REG;
1825 /* Try to look it up as a directory */
1826 pos = index_name_pos(istate, path, len);
1827 if (pos >= 0)
1828 return DT_UNKNOWN;
1829 pos = -pos-1;
1830 while (pos < istate->cache_nr) {
1831 ce = istate->cache[pos++];
1832 if (strncmp(ce->name, path, len))
1833 break;
1834 if (ce->name[len] > '/')
1835 break;
1836 if (ce->name[len] < '/')
1837 continue;
1838 if (!ce_uptodate(ce))
1839 break; /* continue? */
1840 return DT_DIR;
1842 return DT_UNKNOWN;
1845 static int get_dtype(struct dirent *de, struct index_state *istate,
1846 const char *path, int len)
1848 int dtype = de ? DTYPE(de) : DT_UNKNOWN;
1849 struct stat st;
1851 if (dtype != DT_UNKNOWN)
1852 return dtype;
1853 dtype = get_index_dtype(istate, path, len);
1854 if (dtype != DT_UNKNOWN)
1855 return dtype;
1856 if (lstat(path, &st))
1857 return dtype;
1858 if (S_ISREG(st.st_mode))
1859 return DT_REG;
1860 if (S_ISDIR(st.st_mode))
1861 return DT_DIR;
1862 if (S_ISLNK(st.st_mode))
1863 return DT_LNK;
1864 return dtype;
1867 static enum path_treatment treat_one_path(struct dir_struct *dir,
1868 struct untracked_cache_dir *untracked,
1869 struct index_state *istate,
1870 struct strbuf *path,
1871 int baselen,
1872 const struct pathspec *pathspec,
1873 int dtype, struct dirent *de)
1875 int exclude;
1876 int has_path_in_index = !!index_file_exists(istate, path->buf, path->len, ignore_case);
1877 enum path_treatment path_treatment;
1879 if (dtype == DT_UNKNOWN)
1880 dtype = get_dtype(de, istate, path->buf, path->len);
1882 /* Always exclude indexed files */
1883 if (dtype != DT_DIR && has_path_in_index)
1884 return path_none;
1887 * When we are looking at a directory P in the working tree,
1888 * there are three cases:
1890 * (1) P exists in the index. Everything inside the directory P in
1891 * the working tree needs to go when P is checked out from the
1892 * index.
1894 * (2) P does not exist in the index, but there is P/Q in the index.
1895 * We know P will stay a directory when we check out the contents
1896 * of the index, but we do not know yet if there is a directory
1897 * P/Q in the working tree to be killed, so we need to recurse.
1899 * (3) P does not exist in the index, and there is no P/Q in the index
1900 * to require P to be a directory, either. Only in this case, we
1901 * know that everything inside P will not be killed without
1902 * recursing.
1904 if ((dir->flags & DIR_COLLECT_KILLED_ONLY) &&
1905 (dtype == DT_DIR) &&
1906 !has_path_in_index &&
1907 (directory_exists_in_index(istate, path->buf, path->len) == index_nonexistent))
1908 return path_none;
1910 exclude = is_excluded(dir, istate, path->buf, &dtype);
1913 * Excluded? If we don't explicitly want to show
1914 * ignored files, ignore it
1916 if (exclude && !(dir->flags & (DIR_SHOW_IGNORED|DIR_SHOW_IGNORED_TOO)))
1917 return path_excluded;
1919 switch (dtype) {
1920 default:
1921 return path_none;
1922 case DT_DIR:
1923 strbuf_addch(path, '/');
1924 path_treatment = treat_directory(dir, istate, untracked,
1925 path->buf, path->len,
1926 baselen, exclude, pathspec);
1928 * If 1) we only want to return directories that
1929 * match an exclude pattern and 2) this directory does
1930 * not match an exclude pattern but all of its
1931 * contents are excluded, then indicate that we should
1932 * recurse into this directory (instead of marking the
1933 * directory itself as an ignored path).
1935 if (!exclude &&
1936 path_treatment == path_excluded &&
1937 (dir->flags & DIR_SHOW_IGNORED_TOO) &&
1938 (dir->flags & DIR_SHOW_IGNORED_TOO_MODE_MATCHING))
1939 return path_recurse;
1940 return path_treatment;
1941 case DT_REG:
1942 case DT_LNK:
1943 return exclude ? path_excluded : path_untracked;
1947 static enum path_treatment treat_path_fast(struct dir_struct *dir,
1948 struct untracked_cache_dir *untracked,
1949 struct cached_dir *cdir,
1950 struct index_state *istate,
1951 struct strbuf *path,
1952 int baselen,
1953 const struct pathspec *pathspec)
1955 strbuf_setlen(path, baselen);
1956 if (!cdir->ucd) {
1957 strbuf_addstr(path, cdir->file);
1958 return path_untracked;
1960 strbuf_addstr(path, cdir->ucd->name);
1961 /* treat_one_path() does this before it calls treat_directory() */
1962 strbuf_complete(path, '/');
1963 if (cdir->ucd->check_only)
1965 * check_only is set as a result of treat_directory() getting
1966 * to its bottom. Verify again the same set of directories
1967 * with check_only set.
1969 return read_directory_recursive(dir, istate, path->buf, path->len,
1970 cdir->ucd, 1, 0, pathspec);
1972 * We get path_recurse in the first run when
1973 * directory_exists_in_index() returns index_nonexistent. We
1974 * are sure that new changes in the index does not impact the
1975 * outcome. Return now.
1977 return path_recurse;
1980 static enum path_treatment treat_path(struct dir_struct *dir,
1981 struct untracked_cache_dir *untracked,
1982 struct cached_dir *cdir,
1983 struct index_state *istate,
1984 struct strbuf *path,
1985 int baselen,
1986 const struct pathspec *pathspec)
1988 int dtype;
1989 struct dirent *de = cdir->de;
1991 if (!de)
1992 return treat_path_fast(dir, untracked, cdir, istate, path,
1993 baselen, pathspec);
1994 if (is_dot_or_dotdot(de->d_name) || !fspathcmp(de->d_name, ".git"))
1995 return path_none;
1996 strbuf_setlen(path, baselen);
1997 strbuf_addstr(path, de->d_name);
1998 if (simplify_away(path->buf, path->len, pathspec))
1999 return path_none;
2001 dtype = DTYPE(de);
2002 return treat_one_path(dir, untracked, istate, path, baselen, pathspec, dtype, de);
2005 static void add_untracked(struct untracked_cache_dir *dir, const char *name)
2007 if (!dir)
2008 return;
2009 ALLOC_GROW(dir->untracked, dir->untracked_nr + 1,
2010 dir->untracked_alloc);
2011 dir->untracked[dir->untracked_nr++] = xstrdup(name);
2014 static int valid_cached_dir(struct dir_struct *dir,
2015 struct untracked_cache_dir *untracked,
2016 struct index_state *istate,
2017 struct strbuf *path,
2018 int check_only)
2020 struct stat st;
2022 if (!untracked)
2023 return 0;
2026 * With fsmonitor, we can trust the untracked cache's valid field.
2028 refresh_fsmonitor(istate);
2029 if (!(dir->untracked->use_fsmonitor && untracked->valid)) {
2030 if (lstat(path->len ? path->buf : ".", &st)) {
2031 memset(&untracked->stat_data, 0, sizeof(untracked->stat_data));
2032 return 0;
2034 if (!untracked->valid ||
2035 match_stat_data_racy(istate, &untracked->stat_data, &st)) {
2036 fill_stat_data(&untracked->stat_data, &st);
2037 return 0;
2041 if (untracked->check_only != !!check_only)
2042 return 0;
2045 * prep_exclude will be called eventually on this directory,
2046 * but it's called much later in last_matching_pattern(). We
2047 * need it now to determine the validity of the cache for this
2048 * path. The next calls will be nearly no-op, the way
2049 * prep_exclude() is designed.
2051 if (path->len && path->buf[path->len - 1] != '/') {
2052 strbuf_addch(path, '/');
2053 prep_exclude(dir, istate, path->buf, path->len);
2054 strbuf_setlen(path, path->len - 1);
2055 } else
2056 prep_exclude(dir, istate, path->buf, path->len);
2058 /* hopefully prep_exclude() haven't invalidated this entry... */
2059 return untracked->valid;
2062 static int open_cached_dir(struct cached_dir *cdir,
2063 struct dir_struct *dir,
2064 struct untracked_cache_dir *untracked,
2065 struct index_state *istate,
2066 struct strbuf *path,
2067 int check_only)
2069 const char *c_path;
2071 memset(cdir, 0, sizeof(*cdir));
2072 cdir->untracked = untracked;
2073 if (valid_cached_dir(dir, untracked, istate, path, check_only))
2074 return 0;
2075 c_path = path->len ? path->buf : ".";
2076 cdir->fdir = opendir(c_path);
2077 if (!cdir->fdir)
2078 warning_errno(_("could not open directory '%s'"), c_path);
2079 if (dir->untracked) {
2080 invalidate_directory(dir->untracked, untracked);
2081 dir->untracked->dir_opened++;
2083 if (!cdir->fdir)
2084 return -1;
2085 return 0;
2088 static int read_cached_dir(struct cached_dir *cdir)
2090 if (cdir->fdir) {
2091 cdir->de = readdir(cdir->fdir);
2092 if (!cdir->de)
2093 return -1;
2094 return 0;
2096 while (cdir->nr_dirs < cdir->untracked->dirs_nr) {
2097 struct untracked_cache_dir *d = cdir->untracked->dirs[cdir->nr_dirs];
2098 if (!d->recurse) {
2099 cdir->nr_dirs++;
2100 continue;
2102 cdir->ucd = d;
2103 cdir->nr_dirs++;
2104 return 0;
2106 cdir->ucd = NULL;
2107 if (cdir->nr_files < cdir->untracked->untracked_nr) {
2108 struct untracked_cache_dir *d = cdir->untracked;
2109 cdir->file = d->untracked[cdir->nr_files++];
2110 return 0;
2112 return -1;
2115 static void close_cached_dir(struct cached_dir *cdir)
2117 if (cdir->fdir)
2118 closedir(cdir->fdir);
2120 * We have gone through this directory and found no untracked
2121 * entries. Mark it valid.
2123 if (cdir->untracked) {
2124 cdir->untracked->valid = 1;
2125 cdir->untracked->recurse = 1;
2129 static void add_path_to_appropriate_result_list(struct dir_struct *dir,
2130 struct untracked_cache_dir *untracked,
2131 struct cached_dir *cdir,
2132 struct index_state *istate,
2133 struct strbuf *path,
2134 int baselen,
2135 const struct pathspec *pathspec,
2136 enum path_treatment state)
2138 /* add the path to the appropriate result list */
2139 switch (state) {
2140 case path_excluded:
2141 if (dir->flags & DIR_SHOW_IGNORED)
2142 dir_add_name(dir, istate, path->buf, path->len);
2143 else if ((dir->flags & DIR_SHOW_IGNORED_TOO) ||
2144 ((dir->flags & DIR_COLLECT_IGNORED) &&
2145 exclude_matches_pathspec(path->buf, path->len,
2146 pathspec)))
2147 dir_add_ignored(dir, istate, path->buf, path->len);
2148 break;
2150 case path_untracked:
2151 if (dir->flags & DIR_SHOW_IGNORED)
2152 break;
2153 dir_add_name(dir, istate, path->buf, path->len);
2154 if (cdir->fdir)
2155 add_untracked(untracked, path->buf + baselen);
2156 break;
2158 default:
2159 break;
2164 * Read a directory tree. We currently ignore anything but
2165 * directories, regular files and symlinks. That's because git
2166 * doesn't handle them at all yet. Maybe that will change some
2167 * day.
2169 * Also, we ignore the name ".git" (even if it is not a directory).
2170 * That likely will not change.
2172 * If 'stop_at_first_file' is specified, 'path_excluded' is returned
2173 * to signal that a file was found. This is the least significant value that
2174 * indicates that a file was encountered that does not depend on the order of
2175 * whether an untracked or exluded path was encountered first.
2177 * Returns the most significant path_treatment value encountered in the scan.
2178 * If 'stop_at_first_file' is specified, `path_excluded` is the most
2179 * significant path_treatment value that will be returned.
2182 static enum path_treatment read_directory_recursive(struct dir_struct *dir,
2183 struct index_state *istate, const char *base, int baselen,
2184 struct untracked_cache_dir *untracked, int check_only,
2185 int stop_at_first_file, const struct pathspec *pathspec)
2188 * WARNING WARNING WARNING:
2190 * Any updates to the traversal logic here may need corresponding
2191 * updates in treat_leading_path(). See the commit message for the
2192 * commit adding this warning as well as the commit preceding it
2193 * for details.
2196 struct cached_dir cdir;
2197 enum path_treatment state, subdir_state, dir_state = path_none;
2198 struct strbuf path = STRBUF_INIT;
2200 strbuf_add(&path, base, baselen);
2202 if (open_cached_dir(&cdir, dir, untracked, istate, &path, check_only))
2203 goto out;
2205 if (untracked)
2206 untracked->check_only = !!check_only;
2208 while (!read_cached_dir(&cdir)) {
2209 /* check how the file or directory should be treated */
2210 state = treat_path(dir, untracked, &cdir, istate, &path,
2211 baselen, pathspec);
2213 if (state > dir_state)
2214 dir_state = state;
2216 /* recurse into subdir if instructed by treat_path */
2217 if ((state == path_recurse) ||
2218 ((state == path_untracked) &&
2219 (get_dtype(cdir.de, istate, path.buf, path.len) == DT_DIR) &&
2220 ((dir->flags & DIR_SHOW_IGNORED_TOO) ||
2221 (pathspec &&
2222 do_match_pathspec(istate, pathspec, path.buf, path.len,
2223 baselen, NULL, DO_MATCH_LEADING_PATHSPEC) == MATCHED_RECURSIVELY_LEADING_PATHSPEC)))) {
2224 struct untracked_cache_dir *ud;
2225 ud = lookup_untracked(dir->untracked, untracked,
2226 path.buf + baselen,
2227 path.len - baselen);
2228 subdir_state =
2229 read_directory_recursive(dir, istate, path.buf,
2230 path.len, ud,
2231 check_only, stop_at_first_file, pathspec);
2232 if (subdir_state > dir_state)
2233 dir_state = subdir_state;
2235 if (pathspec &&
2236 !match_pathspec(istate, pathspec, path.buf, path.len,
2237 0 /* prefix */, NULL,
2238 0 /* do NOT special case dirs */))
2239 state = path_none;
2242 if (check_only) {
2243 if (stop_at_first_file) {
2245 * If stopping at first file, then
2246 * signal that a file was found by
2247 * returning `path_excluded`. This is
2248 * to return a consistent value
2249 * regardless of whether an ignored or
2250 * excluded file happened to be
2251 * encountered 1st.
2253 * In current usage, the
2254 * `stop_at_first_file` is passed when
2255 * an ancestor directory has matched
2256 * an exclude pattern, so any found
2257 * files will be excluded.
2259 if (dir_state >= path_excluded) {
2260 dir_state = path_excluded;
2261 break;
2265 /* abort early if maximum state has been reached */
2266 if (dir_state == path_untracked) {
2267 if (cdir.fdir)
2268 add_untracked(untracked, path.buf + baselen);
2269 break;
2271 /* skip the dir_add_* part */
2272 continue;
2275 add_path_to_appropriate_result_list(dir, untracked, &cdir,
2276 istate, &path, baselen,
2277 pathspec, state);
2279 close_cached_dir(&cdir);
2280 out:
2281 strbuf_release(&path);
2283 return dir_state;
2286 int cmp_dir_entry(const void *p1, const void *p2)
2288 const struct dir_entry *e1 = *(const struct dir_entry **)p1;
2289 const struct dir_entry *e2 = *(const struct dir_entry **)p2;
2291 return name_compare(e1->name, e1->len, e2->name, e2->len);
2294 /* check if *out lexically strictly contains *in */
2295 int check_dir_entry_contains(const struct dir_entry *out, const struct dir_entry *in)
2297 return (out->len < in->len) &&
2298 (out->name[out->len - 1] == '/') &&
2299 !memcmp(out->name, in->name, out->len);
2302 static int treat_leading_path(struct dir_struct *dir,
2303 struct index_state *istate,
2304 const char *path, int len,
2305 const struct pathspec *pathspec)
2308 * WARNING WARNING WARNING:
2310 * Any updates to the traversal logic here may need corresponding
2311 * updates in treat_leading_path(). See the commit message for the
2312 * commit adding this warning as well as the commit preceding it
2313 * for details.
2316 struct strbuf sb = STRBUF_INIT;
2317 int prevlen, baselen;
2318 const char *cp;
2319 struct cached_dir cdir;
2320 struct dirent *de;
2321 enum path_treatment state = path_none;
2324 * For each directory component of path, we are going to check whether
2325 * that path is relevant given the pathspec. For example, if path is
2326 * foo/bar/baz/
2327 * then we will ask treat_path() whether we should go into foo, then
2328 * whether we should go into bar, then whether baz is relevant.
2329 * Checking each is important because e.g. if path is
2330 * .git/info/
2331 * then we need to check .git to know we shouldn't traverse it.
2332 * If the return from treat_path() is:
2333 * * path_none, for any path, we return false.
2334 * * path_recurse, for all path components, we return true
2335 * * <anything else> for some intermediate component, we make sure
2336 * to add that path to the relevant list but return false
2337 * signifying that we shouldn't recurse into it.
2340 while (len && path[len - 1] == '/')
2341 len--;
2342 if (!len)
2343 return 1;
2346 * We need a manufactured dirent with sufficient space to store a
2347 * leading directory component of path in its d_name. Here, we
2348 * assume that the dirent's d_name is either declared as
2349 * char d_name[BIG_ENOUGH]
2350 * or that it is declared at the end of the struct as
2351 * char d_name[]
2352 * For either case, padding with len+1 bytes at the end will ensure
2353 * sufficient storage space.
2355 de = xcalloc(1, st_add3(sizeof(struct dirent), len, 1));
2356 memset(&cdir, 0, sizeof(cdir));
2357 cdir.de = de;
2358 #if defined(DT_UNKNOWN) && !defined(NO_D_TYPE_IN_DIRENT)
2359 de->d_type = DT_DIR;
2360 #endif
2361 baselen = 0;
2362 prevlen = 0;
2363 while (1) {
2364 prevlen = baselen + !!baselen;
2365 cp = path + prevlen;
2366 cp = memchr(cp, '/', path + len - cp);
2367 if (!cp)
2368 baselen = len;
2369 else
2370 baselen = cp - path;
2371 strbuf_reset(&sb);
2372 strbuf_add(&sb, path, baselen);
2373 if (!is_directory(sb.buf))
2374 break;
2375 strbuf_reset(&sb);
2376 strbuf_add(&sb, path, prevlen);
2377 memcpy(de->d_name, path+prevlen, baselen-prevlen);
2378 de->d_name[baselen-prevlen] = '\0';
2379 state = treat_path(dir, NULL, &cdir, istate, &sb, prevlen,
2380 pathspec);
2381 if (state == path_untracked &&
2382 get_dtype(cdir.de, istate, sb.buf, sb.len) == DT_DIR &&
2383 (dir->flags & DIR_SHOW_IGNORED_TOO ||
2384 do_match_pathspec(istate, pathspec, sb.buf, sb.len,
2385 baselen, NULL, DO_MATCH_LEADING_PATHSPEC) == MATCHED_RECURSIVELY_LEADING_PATHSPEC)) {
2386 add_path_to_appropriate_result_list(dir, NULL, &cdir,
2387 istate,
2388 &sb, baselen,
2389 pathspec, state);
2390 state = path_recurse;
2393 if (state != path_recurse)
2394 break; /* do not recurse into it */
2395 if (len <= baselen)
2396 break; /* finished checking */
2398 add_path_to_appropriate_result_list(dir, NULL, &cdir, istate,
2399 &sb, baselen, pathspec,
2400 state);
2402 free(de);
2403 strbuf_release(&sb);
2404 return state == path_recurse;
2407 static const char *get_ident_string(void)
2409 static struct strbuf sb = STRBUF_INIT;
2410 struct utsname uts;
2412 if (sb.len)
2413 return sb.buf;
2414 if (uname(&uts) < 0)
2415 die_errno(_("failed to get kernel name and information"));
2416 strbuf_addf(&sb, "Location %s, system %s", get_git_work_tree(),
2417 uts.sysname);
2418 return sb.buf;
2421 static int ident_in_untracked(const struct untracked_cache *uc)
2424 * Previous git versions may have saved many NUL separated
2425 * strings in the "ident" field, but it is insane to manage
2426 * many locations, so just take care of the first one.
2429 return !strcmp(uc->ident.buf, get_ident_string());
2432 static void set_untracked_ident(struct untracked_cache *uc)
2434 strbuf_reset(&uc->ident);
2435 strbuf_addstr(&uc->ident, get_ident_string());
2438 * This strbuf used to contain a list of NUL separated
2439 * strings, so save NUL too for backward compatibility.
2441 strbuf_addch(&uc->ident, 0);
2444 static void new_untracked_cache(struct index_state *istate)
2446 struct untracked_cache *uc = xcalloc(1, sizeof(*uc));
2447 strbuf_init(&uc->ident, 100);
2448 uc->exclude_per_dir = ".gitignore";
2449 /* should be the same flags used by git-status */
2450 uc->dir_flags = DIR_SHOW_OTHER_DIRECTORIES | DIR_HIDE_EMPTY_DIRECTORIES;
2451 set_untracked_ident(uc);
2452 istate->untracked = uc;
2453 istate->cache_changed |= UNTRACKED_CHANGED;
2456 void add_untracked_cache(struct index_state *istate)
2458 if (!istate->untracked) {
2459 new_untracked_cache(istate);
2460 } else {
2461 if (!ident_in_untracked(istate->untracked)) {
2462 free_untracked_cache(istate->untracked);
2463 new_untracked_cache(istate);
2468 void remove_untracked_cache(struct index_state *istate)
2470 if (istate->untracked) {
2471 free_untracked_cache(istate->untracked);
2472 istate->untracked = NULL;
2473 istate->cache_changed |= UNTRACKED_CHANGED;
2477 static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *dir,
2478 int base_len,
2479 const struct pathspec *pathspec)
2481 struct untracked_cache_dir *root;
2482 static int untracked_cache_disabled = -1;
2484 if (!dir->untracked)
2485 return NULL;
2486 if (untracked_cache_disabled < 0)
2487 untracked_cache_disabled = git_env_bool("GIT_DISABLE_UNTRACKED_CACHE", 0);
2488 if (untracked_cache_disabled)
2489 return NULL;
2492 * We only support $GIT_DIR/info/exclude and core.excludesfile
2493 * as the global ignore rule files. Any other additions
2494 * (e.g. from command line) invalidate the cache. This
2495 * condition also catches running setup_standard_excludes()
2496 * before setting dir->untracked!
2498 if (dir->unmanaged_exclude_files)
2499 return NULL;
2502 * Optimize for the main use case only: whole-tree git
2503 * status. More work involved in treat_leading_path() if we
2504 * use cache on just a subset of the worktree. pathspec
2505 * support could make the matter even worse.
2507 if (base_len || (pathspec && pathspec->nr))
2508 return NULL;
2510 /* Different set of flags may produce different results */
2511 if (dir->flags != dir->untracked->dir_flags ||
2513 * See treat_directory(), case index_nonexistent. Without
2514 * this flag, we may need to also cache .git file content
2515 * for the resolve_gitlink_ref() call, which we don't.
2517 !(dir->flags & DIR_SHOW_OTHER_DIRECTORIES) ||
2518 /* We don't support collecting ignore files */
2519 (dir->flags & (DIR_SHOW_IGNORED | DIR_SHOW_IGNORED_TOO |
2520 DIR_COLLECT_IGNORED)))
2521 return NULL;
2524 * If we use .gitignore in the cache and now you change it to
2525 * .gitexclude, everything will go wrong.
2527 if (dir->exclude_per_dir != dir->untracked->exclude_per_dir &&
2528 strcmp(dir->exclude_per_dir, dir->untracked->exclude_per_dir))
2529 return NULL;
2532 * EXC_CMDL is not considered in the cache. If people set it,
2533 * skip the cache.
2535 if (dir->exclude_list_group[EXC_CMDL].nr)
2536 return NULL;
2538 if (!ident_in_untracked(dir->untracked)) {
2539 warning(_("untracked cache is disabled on this system or location"));
2540 return NULL;
2543 if (!dir->untracked->root) {
2544 const int len = sizeof(*dir->untracked->root);
2545 dir->untracked->root = xmalloc(len);
2546 memset(dir->untracked->root, 0, len);
2549 /* Validate $GIT_DIR/info/exclude and core.excludesfile */
2550 root = dir->untracked->root;
2551 if (!oideq(&dir->ss_info_exclude.oid,
2552 &dir->untracked->ss_info_exclude.oid)) {
2553 invalidate_gitignore(dir->untracked, root);
2554 dir->untracked->ss_info_exclude = dir->ss_info_exclude;
2556 if (!oideq(&dir->ss_excludes_file.oid,
2557 &dir->untracked->ss_excludes_file.oid)) {
2558 invalidate_gitignore(dir->untracked, root);
2559 dir->untracked->ss_excludes_file = dir->ss_excludes_file;
2562 /* Make sure this directory is not dropped out at saving phase */
2563 root->recurse = 1;
2564 return root;
2567 int read_directory(struct dir_struct *dir, struct index_state *istate,
2568 const char *path, int len, const struct pathspec *pathspec)
2570 struct untracked_cache_dir *untracked;
2572 trace_performance_enter();
2574 if (has_symlink_leading_path(path, len)) {
2575 trace_performance_leave("read directory %.*s", len, path);
2576 return dir->nr;
2579 untracked = validate_untracked_cache(dir, len, pathspec);
2580 if (!untracked)
2582 * make sure untracked cache code path is disabled,
2583 * e.g. prep_exclude()
2585 dir->untracked = NULL;
2586 if (!len || treat_leading_path(dir, istate, path, len, pathspec))
2587 read_directory_recursive(dir, istate, path, len, untracked, 0, 0, pathspec);
2588 QSORT(dir->entries, dir->nr, cmp_dir_entry);
2589 QSORT(dir->ignored, dir->ignored_nr, cmp_dir_entry);
2592 * If DIR_SHOW_IGNORED_TOO is set, read_directory_recursive() will
2593 * also pick up untracked contents of untracked dirs; by default
2594 * we discard these, but given DIR_KEEP_UNTRACKED_CONTENTS we do not.
2596 if ((dir->flags & DIR_SHOW_IGNORED_TOO) &&
2597 !(dir->flags & DIR_KEEP_UNTRACKED_CONTENTS)) {
2598 int i, j;
2600 /* remove from dir->entries untracked contents of untracked dirs */
2601 for (i = j = 0; j < dir->nr; j++) {
2602 if (i &&
2603 check_dir_entry_contains(dir->entries[i - 1], dir->entries[j])) {
2604 FREE_AND_NULL(dir->entries[j]);
2605 } else {
2606 dir->entries[i++] = dir->entries[j];
2610 dir->nr = i;
2613 trace_performance_leave("read directory %.*s", len, path);
2614 if (dir->untracked) {
2615 static int force_untracked_cache = -1;
2616 static struct trace_key trace_untracked_stats = TRACE_KEY_INIT(UNTRACKED_STATS);
2618 if (force_untracked_cache < 0)
2619 force_untracked_cache =
2620 git_env_bool("GIT_FORCE_UNTRACKED_CACHE", 0);
2621 trace_printf_key(&trace_untracked_stats,
2622 "node creation: %u\n"
2623 "gitignore invalidation: %u\n"
2624 "directory invalidation: %u\n"
2625 "opendir: %u\n",
2626 dir->untracked->dir_created,
2627 dir->untracked->gitignore_invalidated,
2628 dir->untracked->dir_invalidated,
2629 dir->untracked->dir_opened);
2630 if (force_untracked_cache &&
2631 dir->untracked == istate->untracked &&
2632 (dir->untracked->dir_opened ||
2633 dir->untracked->gitignore_invalidated ||
2634 dir->untracked->dir_invalidated))
2635 istate->cache_changed |= UNTRACKED_CHANGED;
2636 if (dir->untracked != istate->untracked) {
2637 FREE_AND_NULL(dir->untracked);
2640 return dir->nr;
2643 int file_exists(const char *f)
2645 struct stat sb;
2646 return lstat(f, &sb) == 0;
2649 int repo_file_exists(struct repository *repo, const char *path)
2651 if (repo != the_repository)
2652 BUG("do not know how to check file existence in arbitrary repo");
2654 return file_exists(path);
2657 static int cmp_icase(char a, char b)
2659 if (a == b)
2660 return 0;
2661 if (ignore_case)
2662 return toupper(a) - toupper(b);
2663 return a - b;
2667 * Given two normalized paths (a trailing slash is ok), if subdir is
2668 * outside dir, return -1. Otherwise return the offset in subdir that
2669 * can be used as relative path to dir.
2671 int dir_inside_of(const char *subdir, const char *dir)
2673 int offset = 0;
2675 assert(dir && subdir && *dir && *subdir);
2677 while (*dir && *subdir && !cmp_icase(*dir, *subdir)) {
2678 dir++;
2679 subdir++;
2680 offset++;
2683 /* hel[p]/me vs hel[l]/yeah */
2684 if (*dir && *subdir)
2685 return -1;
2687 if (!*subdir)
2688 return !*dir ? offset : -1; /* same dir */
2690 /* foo/[b]ar vs foo/[] */
2691 if (is_dir_sep(dir[-1]))
2692 return is_dir_sep(subdir[-1]) ? offset : -1;
2694 /* foo[/]bar vs foo[] */
2695 return is_dir_sep(*subdir) ? offset + 1 : -1;
2698 int is_inside_dir(const char *dir)
2700 char *cwd;
2701 int rc;
2703 if (!dir)
2704 return 0;
2706 cwd = xgetcwd();
2707 rc = (dir_inside_of(cwd, dir) >= 0);
2708 free(cwd);
2709 return rc;
2712 int is_empty_dir(const char *path)
2714 DIR *dir = opendir(path);
2715 struct dirent *e;
2716 int ret = 1;
2718 if (!dir)
2719 return 0;
2721 while ((e = readdir(dir)) != NULL)
2722 if (!is_dot_or_dotdot(e->d_name)) {
2723 ret = 0;
2724 break;
2727 closedir(dir);
2728 return ret;
2731 static int remove_dir_recurse(struct strbuf *path, int flag, int *kept_up)
2733 DIR *dir;
2734 struct dirent *e;
2735 int ret = 0, original_len = path->len, len, kept_down = 0;
2736 int only_empty = (flag & REMOVE_DIR_EMPTY_ONLY);
2737 int keep_toplevel = (flag & REMOVE_DIR_KEEP_TOPLEVEL);
2738 struct object_id submodule_head;
2740 if ((flag & REMOVE_DIR_KEEP_NESTED_GIT) &&
2741 !resolve_gitlink_ref(path->buf, "HEAD", &submodule_head)) {
2742 /* Do not descend and nuke a nested git work tree. */
2743 if (kept_up)
2744 *kept_up = 1;
2745 return 0;
2748 flag &= ~REMOVE_DIR_KEEP_TOPLEVEL;
2749 dir = opendir(path->buf);
2750 if (!dir) {
2751 if (errno == ENOENT)
2752 return keep_toplevel ? -1 : 0;
2753 else if (errno == EACCES && !keep_toplevel)
2755 * An empty dir could be removable even if it
2756 * is unreadable:
2758 return rmdir(path->buf);
2759 else
2760 return -1;
2762 strbuf_complete(path, '/');
2764 len = path->len;
2765 while ((e = readdir(dir)) != NULL) {
2766 struct stat st;
2767 if (is_dot_or_dotdot(e->d_name))
2768 continue;
2770 strbuf_setlen(path, len);
2771 strbuf_addstr(path, e->d_name);
2772 if (lstat(path->buf, &st)) {
2773 if (errno == ENOENT)
2775 * file disappeared, which is what we
2776 * wanted anyway
2778 continue;
2779 /* fall through */
2780 } else if (S_ISDIR(st.st_mode)) {
2781 if (!remove_dir_recurse(path, flag, &kept_down))
2782 continue; /* happy */
2783 } else if (!only_empty &&
2784 (!unlink(path->buf) || errno == ENOENT)) {
2785 continue; /* happy, too */
2788 /* path too long, stat fails, or non-directory still exists */
2789 ret = -1;
2790 break;
2792 closedir(dir);
2794 strbuf_setlen(path, original_len);
2795 if (!ret && !keep_toplevel && !kept_down)
2796 ret = (!rmdir(path->buf) || errno == ENOENT) ? 0 : -1;
2797 else if (kept_up)
2799 * report the uplevel that it is not an error that we
2800 * did not rmdir() our directory.
2802 *kept_up = !ret;
2803 return ret;
2806 int remove_dir_recursively(struct strbuf *path, int flag)
2808 return remove_dir_recurse(path, flag, NULL);
2811 static GIT_PATH_FUNC(git_path_info_exclude, "info/exclude")
2813 void setup_standard_excludes(struct dir_struct *dir)
2815 dir->exclude_per_dir = ".gitignore";
2817 /* core.excludesfile defaulting to $XDG_CONFIG_HOME/git/ignore */
2818 if (!excludes_file)
2819 excludes_file = xdg_config_home("ignore");
2820 if (excludes_file && !access_or_warn(excludes_file, R_OK, 0))
2821 add_patterns_from_file_1(dir, excludes_file,
2822 dir->untracked ? &dir->ss_excludes_file : NULL);
2824 /* per repository user preference */
2825 if (startup_info->have_repository) {
2826 const char *path = git_path_info_exclude();
2827 if (!access_or_warn(path, R_OK, 0))
2828 add_patterns_from_file_1(dir, path,
2829 dir->untracked ? &dir->ss_info_exclude : NULL);
2833 int remove_path(const char *name)
2835 char *slash;
2837 if (unlink(name) && !is_missing_file_error(errno))
2838 return -1;
2840 slash = strrchr(name, '/');
2841 if (slash) {
2842 char *dirs = xstrdup(name);
2843 slash = dirs + (slash - name);
2844 do {
2845 *slash = '\0';
2846 } while (rmdir(dirs) == 0 && (slash = strrchr(dirs, '/')));
2847 free(dirs);
2849 return 0;
2853 * Frees memory within dir which was allocated for exclude lists and
2854 * the exclude_stack. Does not free dir itself.
2856 void clear_directory(struct dir_struct *dir)
2858 int i, j;
2859 struct exclude_list_group *group;
2860 struct pattern_list *pl;
2861 struct exclude_stack *stk;
2863 for (i = EXC_CMDL; i <= EXC_FILE; i++) {
2864 group = &dir->exclude_list_group[i];
2865 for (j = 0; j < group->nr; j++) {
2866 pl = &group->pl[j];
2867 if (i == EXC_DIRS)
2868 free((char *)pl->src);
2869 clear_pattern_list(pl);
2871 free(group->pl);
2874 stk = dir->exclude_stack;
2875 while (stk) {
2876 struct exclude_stack *prev = stk->prev;
2877 free(stk);
2878 stk = prev;
2880 strbuf_release(&dir->basebuf);
2883 struct ondisk_untracked_cache {
2884 struct stat_data info_exclude_stat;
2885 struct stat_data excludes_file_stat;
2886 uint32_t dir_flags;
2889 #define ouc_offset(x) offsetof(struct ondisk_untracked_cache, x)
2891 struct write_data {
2892 int index; /* number of written untracked_cache_dir */
2893 struct ewah_bitmap *check_only; /* from untracked_cache_dir */
2894 struct ewah_bitmap *valid; /* from untracked_cache_dir */
2895 struct ewah_bitmap *sha1_valid; /* set if exclude_sha1 is not null */
2896 struct strbuf out;
2897 struct strbuf sb_stat;
2898 struct strbuf sb_sha1;
2901 static void stat_data_to_disk(struct stat_data *to, const struct stat_data *from)
2903 to->sd_ctime.sec = htonl(from->sd_ctime.sec);
2904 to->sd_ctime.nsec = htonl(from->sd_ctime.nsec);
2905 to->sd_mtime.sec = htonl(from->sd_mtime.sec);
2906 to->sd_mtime.nsec = htonl(from->sd_mtime.nsec);
2907 to->sd_dev = htonl(from->sd_dev);
2908 to->sd_ino = htonl(from->sd_ino);
2909 to->sd_uid = htonl(from->sd_uid);
2910 to->sd_gid = htonl(from->sd_gid);
2911 to->sd_size = htonl(from->sd_size);
2914 static void write_one_dir(struct untracked_cache_dir *untracked,
2915 struct write_data *wd)
2917 struct stat_data stat_data;
2918 struct strbuf *out = &wd->out;
2919 unsigned char intbuf[16];
2920 unsigned int intlen, value;
2921 int i = wd->index++;
2924 * untracked_nr should be reset whenever valid is clear, but
2925 * for safety..
2927 if (!untracked->valid) {
2928 untracked->untracked_nr = 0;
2929 untracked->check_only = 0;
2932 if (untracked->check_only)
2933 ewah_set(wd->check_only, i);
2934 if (untracked->valid) {
2935 ewah_set(wd->valid, i);
2936 stat_data_to_disk(&stat_data, &untracked->stat_data);
2937 strbuf_add(&wd->sb_stat, &stat_data, sizeof(stat_data));
2939 if (!is_null_oid(&untracked->exclude_oid)) {
2940 ewah_set(wd->sha1_valid, i);
2941 strbuf_add(&wd->sb_sha1, untracked->exclude_oid.hash,
2942 the_hash_algo->rawsz);
2945 intlen = encode_varint(untracked->untracked_nr, intbuf);
2946 strbuf_add(out, intbuf, intlen);
2948 /* skip non-recurse directories */
2949 for (i = 0, value = 0; i < untracked->dirs_nr; i++)
2950 if (untracked->dirs[i]->recurse)
2951 value++;
2952 intlen = encode_varint(value, intbuf);
2953 strbuf_add(out, intbuf, intlen);
2955 strbuf_add(out, untracked->name, strlen(untracked->name) + 1);
2957 for (i = 0; i < untracked->untracked_nr; i++)
2958 strbuf_add(out, untracked->untracked[i],
2959 strlen(untracked->untracked[i]) + 1);
2961 for (i = 0; i < untracked->dirs_nr; i++)
2962 if (untracked->dirs[i]->recurse)
2963 write_one_dir(untracked->dirs[i], wd);
2966 void write_untracked_extension(struct strbuf *out, struct untracked_cache *untracked)
2968 struct ondisk_untracked_cache *ouc;
2969 struct write_data wd;
2970 unsigned char varbuf[16];
2971 int varint_len;
2972 const unsigned hashsz = the_hash_algo->rawsz;
2974 ouc = xcalloc(1, sizeof(*ouc));
2975 stat_data_to_disk(&ouc->info_exclude_stat, &untracked->ss_info_exclude.stat);
2976 stat_data_to_disk(&ouc->excludes_file_stat, &untracked->ss_excludes_file.stat);
2977 ouc->dir_flags = htonl(untracked->dir_flags);
2979 varint_len = encode_varint(untracked->ident.len, varbuf);
2980 strbuf_add(out, varbuf, varint_len);
2981 strbuf_addbuf(out, &untracked->ident);
2983 strbuf_add(out, ouc, sizeof(*ouc));
2984 strbuf_add(out, untracked->ss_info_exclude.oid.hash, hashsz);
2985 strbuf_add(out, untracked->ss_excludes_file.oid.hash, hashsz);
2986 strbuf_add(out, untracked->exclude_per_dir, strlen(untracked->exclude_per_dir) + 1);
2987 FREE_AND_NULL(ouc);
2989 if (!untracked->root) {
2990 varint_len = encode_varint(0, varbuf);
2991 strbuf_add(out, varbuf, varint_len);
2992 return;
2995 wd.index = 0;
2996 wd.check_only = ewah_new();
2997 wd.valid = ewah_new();
2998 wd.sha1_valid = ewah_new();
2999 strbuf_init(&wd.out, 1024);
3000 strbuf_init(&wd.sb_stat, 1024);
3001 strbuf_init(&wd.sb_sha1, 1024);
3002 write_one_dir(untracked->root, &wd);
3004 varint_len = encode_varint(wd.index, varbuf);
3005 strbuf_add(out, varbuf, varint_len);
3006 strbuf_addbuf(out, &wd.out);
3007 ewah_serialize_strbuf(wd.valid, out);
3008 ewah_serialize_strbuf(wd.check_only, out);
3009 ewah_serialize_strbuf(wd.sha1_valid, out);
3010 strbuf_addbuf(out, &wd.sb_stat);
3011 strbuf_addbuf(out, &wd.sb_sha1);
3012 strbuf_addch(out, '\0'); /* safe guard for string lists */
3014 ewah_free(wd.valid);
3015 ewah_free(wd.check_only);
3016 ewah_free(wd.sha1_valid);
3017 strbuf_release(&wd.out);
3018 strbuf_release(&wd.sb_stat);
3019 strbuf_release(&wd.sb_sha1);
3022 static void free_untracked(struct untracked_cache_dir *ucd)
3024 int i;
3025 if (!ucd)
3026 return;
3027 for (i = 0; i < ucd->dirs_nr; i++)
3028 free_untracked(ucd->dirs[i]);
3029 for (i = 0; i < ucd->untracked_nr; i++)
3030 free(ucd->untracked[i]);
3031 free(ucd->untracked);
3032 free(ucd->dirs);
3033 free(ucd);
3036 void free_untracked_cache(struct untracked_cache *uc)
3038 if (uc)
3039 free_untracked(uc->root);
3040 free(uc);
3043 struct read_data {
3044 int index;
3045 struct untracked_cache_dir **ucd;
3046 struct ewah_bitmap *check_only;
3047 struct ewah_bitmap *valid;
3048 struct ewah_bitmap *sha1_valid;
3049 const unsigned char *data;
3050 const unsigned char *end;
3053 static void stat_data_from_disk(struct stat_data *to, const unsigned char *data)
3055 memcpy(to, data, sizeof(*to));
3056 to->sd_ctime.sec = ntohl(to->sd_ctime.sec);
3057 to->sd_ctime.nsec = ntohl(to->sd_ctime.nsec);
3058 to->sd_mtime.sec = ntohl(to->sd_mtime.sec);
3059 to->sd_mtime.nsec = ntohl(to->sd_mtime.nsec);
3060 to->sd_dev = ntohl(to->sd_dev);
3061 to->sd_ino = ntohl(to->sd_ino);
3062 to->sd_uid = ntohl(to->sd_uid);
3063 to->sd_gid = ntohl(to->sd_gid);
3064 to->sd_size = ntohl(to->sd_size);
3067 static int read_one_dir(struct untracked_cache_dir **untracked_,
3068 struct read_data *rd)
3070 struct untracked_cache_dir ud, *untracked;
3071 const unsigned char *data = rd->data, *end = rd->end;
3072 const unsigned char *eos;
3073 unsigned int value;
3074 int i;
3076 memset(&ud, 0, sizeof(ud));
3078 value = decode_varint(&data);
3079 if (data > end)
3080 return -1;
3081 ud.recurse = 1;
3082 ud.untracked_alloc = value;
3083 ud.untracked_nr = value;
3084 if (ud.untracked_nr)
3085 ALLOC_ARRAY(ud.untracked, ud.untracked_nr);
3087 ud.dirs_alloc = ud.dirs_nr = decode_varint(&data);
3088 if (data > end)
3089 return -1;
3090 ALLOC_ARRAY(ud.dirs, ud.dirs_nr);
3092 eos = memchr(data, '\0', end - data);
3093 if (!eos || eos == end)
3094 return -1;
3096 *untracked_ = untracked = xmalloc(st_add3(sizeof(*untracked), eos - data, 1));
3097 memcpy(untracked, &ud, sizeof(ud));
3098 memcpy(untracked->name, data, eos - data + 1);
3099 data = eos + 1;
3101 for (i = 0; i < untracked->untracked_nr; i++) {
3102 eos = memchr(data, '\0', end - data);
3103 if (!eos || eos == end)
3104 return -1;
3105 untracked->untracked[i] = xmemdupz(data, eos - data);
3106 data = eos + 1;
3109 rd->ucd[rd->index++] = untracked;
3110 rd->data = data;
3112 for (i = 0; i < untracked->dirs_nr; i++) {
3113 if (read_one_dir(untracked->dirs + i, rd) < 0)
3114 return -1;
3116 return 0;
3119 static void set_check_only(size_t pos, void *cb)
3121 struct read_data *rd = cb;
3122 struct untracked_cache_dir *ud = rd->ucd[pos];
3123 ud->check_only = 1;
3126 static void read_stat(size_t pos, void *cb)
3128 struct read_data *rd = cb;
3129 struct untracked_cache_dir *ud = rd->ucd[pos];
3130 if (rd->data + sizeof(struct stat_data) > rd->end) {
3131 rd->data = rd->end + 1;
3132 return;
3134 stat_data_from_disk(&ud->stat_data, rd->data);
3135 rd->data += sizeof(struct stat_data);
3136 ud->valid = 1;
3139 static void read_oid(size_t pos, void *cb)
3141 struct read_data *rd = cb;
3142 struct untracked_cache_dir *ud = rd->ucd[pos];
3143 if (rd->data + the_hash_algo->rawsz > rd->end) {
3144 rd->data = rd->end + 1;
3145 return;
3147 hashcpy(ud->exclude_oid.hash, rd->data);
3148 rd->data += the_hash_algo->rawsz;
3151 static void load_oid_stat(struct oid_stat *oid_stat, const unsigned char *data,
3152 const unsigned char *sha1)
3154 stat_data_from_disk(&oid_stat->stat, data);
3155 hashcpy(oid_stat->oid.hash, sha1);
3156 oid_stat->valid = 1;
3159 struct untracked_cache *read_untracked_extension(const void *data, unsigned long sz)
3161 struct untracked_cache *uc;
3162 struct read_data rd;
3163 const unsigned char *next = data, *end = (const unsigned char *)data + sz;
3164 const char *ident;
3165 int ident_len;
3166 ssize_t len;
3167 const char *exclude_per_dir;
3168 const unsigned hashsz = the_hash_algo->rawsz;
3169 const unsigned offset = sizeof(struct ondisk_untracked_cache);
3170 const unsigned exclude_per_dir_offset = offset + 2 * hashsz;
3172 if (sz <= 1 || end[-1] != '\0')
3173 return NULL;
3174 end--;
3176 ident_len = decode_varint(&next);
3177 if (next + ident_len > end)
3178 return NULL;
3179 ident = (const char *)next;
3180 next += ident_len;
3182 if (next + exclude_per_dir_offset + 1 > end)
3183 return NULL;
3185 uc = xcalloc(1, sizeof(*uc));
3186 strbuf_init(&uc->ident, ident_len);
3187 strbuf_add(&uc->ident, ident, ident_len);
3188 load_oid_stat(&uc->ss_info_exclude,
3189 next + ouc_offset(info_exclude_stat),
3190 next + offset);
3191 load_oid_stat(&uc->ss_excludes_file,
3192 next + ouc_offset(excludes_file_stat),
3193 next + offset + hashsz);
3194 uc->dir_flags = get_be32(next + ouc_offset(dir_flags));
3195 exclude_per_dir = (const char *)next + exclude_per_dir_offset;
3196 uc->exclude_per_dir = xstrdup(exclude_per_dir);
3197 /* NUL after exclude_per_dir is covered by sizeof(*ouc) */
3198 next += exclude_per_dir_offset + strlen(exclude_per_dir) + 1;
3199 if (next >= end)
3200 goto done2;
3202 len = decode_varint(&next);
3203 if (next > end || len == 0)
3204 goto done2;
3206 rd.valid = ewah_new();
3207 rd.check_only = ewah_new();
3208 rd.sha1_valid = ewah_new();
3209 rd.data = next;
3210 rd.end = end;
3211 rd.index = 0;
3212 ALLOC_ARRAY(rd.ucd, len);
3214 if (read_one_dir(&uc->root, &rd) || rd.index != len)
3215 goto done;
3217 next = rd.data;
3218 len = ewah_read_mmap(rd.valid, next, end - next);
3219 if (len < 0)
3220 goto done;
3222 next += len;
3223 len = ewah_read_mmap(rd.check_only, next, end - next);
3224 if (len < 0)
3225 goto done;
3227 next += len;
3228 len = ewah_read_mmap(rd.sha1_valid, next, end - next);
3229 if (len < 0)
3230 goto done;
3232 ewah_each_bit(rd.check_only, set_check_only, &rd);
3233 rd.data = next + len;
3234 ewah_each_bit(rd.valid, read_stat, &rd);
3235 ewah_each_bit(rd.sha1_valid, read_oid, &rd);
3236 next = rd.data;
3238 done:
3239 free(rd.ucd);
3240 ewah_free(rd.valid);
3241 ewah_free(rd.check_only);
3242 ewah_free(rd.sha1_valid);
3243 done2:
3244 if (next != end) {
3245 free_untracked_cache(uc);
3246 uc = NULL;
3248 return uc;
3251 static void invalidate_one_directory(struct untracked_cache *uc,
3252 struct untracked_cache_dir *ucd)
3254 uc->dir_invalidated++;
3255 ucd->valid = 0;
3256 ucd->untracked_nr = 0;
3260 * Normally when an entry is added or removed from a directory,
3261 * invalidating that directory is enough. No need to touch its
3262 * ancestors. When a directory is shown as "foo/bar/" in git-status
3263 * however, deleting or adding an entry may have cascading effect.
3265 * Say the "foo/bar/file" has become untracked, we need to tell the
3266 * untracked_cache_dir of "foo" that "bar/" is not an untracked
3267 * directory any more (because "bar" is managed by foo as an untracked
3268 * "file").
3270 * Similarly, if "foo/bar/file" moves from untracked to tracked and it
3271 * was the last untracked entry in the entire "foo", we should show
3272 * "foo/" instead. Which means we have to invalidate past "bar" up to
3273 * "foo".
3275 * This function traverses all directories from root to leaf. If there
3276 * is a chance of one of the above cases happening, we invalidate back
3277 * to root. Otherwise we just invalidate the leaf. There may be a more
3278 * sophisticated way than checking for SHOW_OTHER_DIRECTORIES to
3279 * detect these cases and avoid unnecessary invalidation, for example,
3280 * checking for the untracked entry named "bar/" in "foo", but for now
3281 * stick to something safe and simple.
3283 static int invalidate_one_component(struct untracked_cache *uc,
3284 struct untracked_cache_dir *dir,
3285 const char *path, int len)
3287 const char *rest = strchr(path, '/');
3289 if (rest) {
3290 int component_len = rest - path;
3291 struct untracked_cache_dir *d =
3292 lookup_untracked(uc, dir, path, component_len);
3293 int ret =
3294 invalidate_one_component(uc, d, rest + 1,
3295 len - (component_len + 1));
3296 if (ret)
3297 invalidate_one_directory(uc, dir);
3298 return ret;
3301 invalidate_one_directory(uc, dir);
3302 return uc->dir_flags & DIR_SHOW_OTHER_DIRECTORIES;
3305 void untracked_cache_invalidate_path(struct index_state *istate,
3306 const char *path, int safe_path)
3308 if (!istate->untracked || !istate->untracked->root)
3309 return;
3310 if (!safe_path && !verify_path(path, 0))
3311 return;
3312 invalidate_one_component(istate->untracked, istate->untracked->root,
3313 path, strlen(path));
3316 void untracked_cache_remove_from_index(struct index_state *istate,
3317 const char *path)
3319 untracked_cache_invalidate_path(istate, path, 1);
3322 void untracked_cache_add_to_index(struct index_state *istate,
3323 const char *path)
3325 untracked_cache_invalidate_path(istate, path, 1);
3328 static void connect_wt_gitdir_in_nested(const char *sub_worktree,
3329 const char *sub_gitdir)
3331 int i;
3332 struct repository subrepo;
3333 struct strbuf sub_wt = STRBUF_INIT;
3334 struct strbuf sub_gd = STRBUF_INIT;
3336 const struct submodule *sub;
3338 /* If the submodule has no working tree, we can ignore it. */
3339 if (repo_init(&subrepo, sub_gitdir, sub_worktree))
3340 return;
3342 if (repo_read_index(&subrepo) < 0)
3343 die(_("index file corrupt in repo %s"), subrepo.gitdir);
3345 for (i = 0; i < subrepo.index->cache_nr; i++) {
3346 const struct cache_entry *ce = subrepo.index->cache[i];
3348 if (!S_ISGITLINK(ce->ce_mode))
3349 continue;
3351 while (i + 1 < subrepo.index->cache_nr &&
3352 !strcmp(ce->name, subrepo.index->cache[i + 1]->name))
3354 * Skip entries with the same name in different stages
3355 * to make sure an entry is returned only once.
3357 i++;
3359 sub = submodule_from_path(&subrepo, &null_oid, ce->name);
3360 if (!sub || !is_submodule_active(&subrepo, ce->name))
3361 /* .gitmodules broken or inactive sub */
3362 continue;
3364 strbuf_reset(&sub_wt);
3365 strbuf_reset(&sub_gd);
3366 strbuf_addf(&sub_wt, "%s/%s", sub_worktree, sub->path);
3367 strbuf_addf(&sub_gd, "%s/modules/%s", sub_gitdir, sub->name);
3369 connect_work_tree_and_git_dir(sub_wt.buf, sub_gd.buf, 1);
3371 strbuf_release(&sub_wt);
3372 strbuf_release(&sub_gd);
3373 repo_clear(&subrepo);
3376 void connect_work_tree_and_git_dir(const char *work_tree_,
3377 const char *git_dir_,
3378 int recurse_into_nested)
3380 struct strbuf gitfile_sb = STRBUF_INIT;
3381 struct strbuf cfg_sb = STRBUF_INIT;
3382 struct strbuf rel_path = STRBUF_INIT;
3383 char *git_dir, *work_tree;
3385 /* Prepare .git file */
3386 strbuf_addf(&gitfile_sb, "%s/.git", work_tree_);
3387 if (safe_create_leading_directories_const(gitfile_sb.buf))
3388 die(_("could not create directories for %s"), gitfile_sb.buf);
3390 /* Prepare config file */
3391 strbuf_addf(&cfg_sb, "%s/config", git_dir_);
3392 if (safe_create_leading_directories_const(cfg_sb.buf))
3393 die(_("could not create directories for %s"), cfg_sb.buf);
3395 git_dir = real_pathdup(git_dir_, 1);
3396 work_tree = real_pathdup(work_tree_, 1);
3398 /* Write .git file */
3399 write_file(gitfile_sb.buf, "gitdir: %s",
3400 relative_path(git_dir, work_tree, &rel_path));
3401 /* Update core.worktree setting */
3402 git_config_set_in_file(cfg_sb.buf, "core.worktree",
3403 relative_path(work_tree, git_dir, &rel_path));
3405 strbuf_release(&gitfile_sb);
3406 strbuf_release(&cfg_sb);
3407 strbuf_release(&rel_path);
3409 if (recurse_into_nested)
3410 connect_wt_gitdir_in_nested(work_tree, git_dir);
3412 free(work_tree);
3413 free(git_dir);
3417 * Migrate the git directory of the given path from old_git_dir to new_git_dir.
3419 void relocate_gitdir(const char *path, const char *old_git_dir, const char *new_git_dir)
3421 if (rename(old_git_dir, new_git_dir) < 0)
3422 die_errno(_("could not migrate git directory from '%s' to '%s'"),
3423 old_git_dir, new_git_dir);
3425 connect_work_tree_and_git_dir(path, new_git_dir, 0);