1/* 2 * This handles recursive filename detection with exclude 3 * files, index knowledge etc.. 4 * 5 * See Documentation/technical/api-directory-listing.txt 6 * 7 * Copyright (C) Linus Torvalds, 2005-2006 8 * Junio Hamano, 2005-2006 9 */ 10#include"cache.h" 11#include"config.h" 12#include"dir.h" 13#include"object-store.h" 14#include"attr.h" 15#include"refs.h" 16#include"wildmatch.h" 17#include"pathspec.h" 18#include"utf8.h" 19#include"varint.h" 20#include"ewah/ewok.h" 21#include"fsmonitor.h" 22#include"submodule-config.h" 23 24/* 25 * Tells read_directory_recursive how a file or directory should be treated. 26 * Values are ordered by significance, e.g. if a directory contains both 27 * excluded and untracked files, it is listed as untracked because 28 * path_untracked > path_excluded. 29 */ 30enum path_treatment { 31 path_none =0, 32 path_recurse, 33 path_excluded, 34 path_untracked 35}; 36 37/* 38 * Support data structure for our opendir/readdir/closedir wrappers 39 */ 40struct cached_dir { 41DIR*fdir; 42struct untracked_cache_dir *untracked; 43int nr_files; 44int nr_dirs; 45 46struct dirent *de; 47const char*file; 48struct untracked_cache_dir *ucd; 49}; 50 51static enum path_treatment read_directory_recursive(struct dir_struct *dir, 52struct index_state *istate,const char*path,int len, 53struct untracked_cache_dir *untracked, 54int check_only,int stop_at_first_file,const struct pathspec *pathspec); 55static intget_dtype(struct dirent *de,struct index_state *istate, 56const char*path,int len); 57 58intcount_slashes(const char*s) 59{ 60int cnt =0; 61while(*s) 62if(*s++ =='/') 63 cnt++; 64return cnt; 65} 66 67intfspathcmp(const char*a,const char*b) 68{ 69return ignore_case ?strcasecmp(a, b) :strcmp(a, b); 70} 71 72intfspathncmp(const char*a,const char*b,size_t count) 73{ 74return ignore_case ?strncasecmp(a, b, count) :strncmp(a, b, count); 75} 76 77intgit_fnmatch(const struct pathspec_item *item, 78const char*pattern,const char*string, 79int prefix) 80{ 81if(prefix >0) { 82if(ps_strncmp(item, pattern, string, prefix)) 83return WM_NOMATCH; 84 pattern += prefix; 85 string += prefix; 86} 87if(item->flags & PATHSPEC_ONESTAR) { 88int pattern_len =strlen(++pattern); 89int string_len =strlen(string); 90return string_len < pattern_len || 91ps_strcmp(item, pattern, 92 string + string_len - pattern_len); 93} 94if(item->magic & PATHSPEC_GLOB) 95returnwildmatch(pattern, string, 96 WM_PATHNAME | 97(item->magic & PATHSPEC_ICASE ? WM_CASEFOLD :0)); 98else 99/* wildmatch has not learned no FNM_PATHNAME mode yet */ 100returnwildmatch(pattern, string, 101 item->magic & PATHSPEC_ICASE ? WM_CASEFOLD :0); 102} 103 104static intfnmatch_icase_mem(const char*pattern,int patternlen, 105const char*string,int stringlen, 106int flags) 107{ 108int match_status; 109struct strbuf pat_buf = STRBUF_INIT; 110struct strbuf str_buf = STRBUF_INIT; 111const char*use_pat = pattern; 112const char*use_str = string; 113 114if(pattern[patternlen]) { 115strbuf_add(&pat_buf, pattern, patternlen); 116 use_pat = pat_buf.buf; 117} 118if(string[stringlen]) { 119strbuf_add(&str_buf, string, stringlen); 120 use_str = str_buf.buf; 121} 122 123if(ignore_case) 124 flags |= WM_CASEFOLD; 125 match_status =wildmatch(use_pat, use_str, flags); 126 127strbuf_release(&pat_buf); 128strbuf_release(&str_buf); 129 130return match_status; 131} 132 133static size_tcommon_prefix_len(const struct pathspec *pathspec) 134{ 135int n; 136size_t max =0; 137 138/* 139 * ":(icase)path" is treated as a pathspec full of 140 * wildcard. In other words, only prefix is considered common 141 * prefix. If the pathspec is abc/foo abc/bar, running in 142 * subdir xyz, the common prefix is still xyz, not xuz/abc as 143 * in non-:(icase). 144 */ 145GUARD_PATHSPEC(pathspec, 146 PATHSPEC_FROMTOP | 147 PATHSPEC_MAXDEPTH | 148 PATHSPEC_LITERAL | 149 PATHSPEC_GLOB | 150 PATHSPEC_ICASE | 151 PATHSPEC_EXCLUDE | 152 PATHSPEC_ATTR); 153 154for(n =0; n < pathspec->nr; n++) { 155size_t i =0, len =0, item_len; 156if(pathspec->items[n].magic & PATHSPEC_EXCLUDE) 157continue; 158if(pathspec->items[n].magic & PATHSPEC_ICASE) 159 item_len = pathspec->items[n].prefix; 160else 161 item_len = pathspec->items[n].nowildcard_len; 162while(i < item_len && (n ==0|| i < max)) { 163char c = pathspec->items[n].match[i]; 164if(c != pathspec->items[0].match[i]) 165break; 166if(c =='/') 167 len = i +1; 168 i++; 169} 170if(n ==0|| len < max) { 171 max = len; 172if(!max) 173break; 174} 175} 176return max; 177} 178 179/* 180 * Returns a copy of the longest leading path common among all 181 * pathspecs. 182 */ 183char*common_prefix(const struct pathspec *pathspec) 184{ 185unsigned long len =common_prefix_len(pathspec); 186 187return len ?xmemdupz(pathspec->items[0].match, len) : NULL; 188} 189 190intfill_directory(struct dir_struct *dir, 191struct index_state *istate, 192const struct pathspec *pathspec) 193{ 194const char*prefix; 195size_t prefix_len; 196 197/* 198 * Calculate common prefix for the pathspec, and 199 * use that to optimize the directory walk 200 */ 201 prefix_len =common_prefix_len(pathspec); 202 prefix = prefix_len ? pathspec->items[0].match :""; 203 204/* Read the directory and prune it */ 205read_directory(dir, istate, prefix, prefix_len, pathspec); 206 207return prefix_len; 208} 209 210intwithin_depth(const char*name,int namelen, 211int depth,int max_depth) 212{ 213const char*cp = name, *cpe = name + namelen; 214 215while(cp < cpe) { 216if(*cp++ !='/') 217continue; 218 depth++; 219if(depth > max_depth) 220return0; 221} 222return1; 223} 224 225/* 226 * Read the contents of the blob with the given OID into a buffer. 227 * Append a trailing LF to the end if the last line doesn't have one. 228 * 229 * Returns: 230 * -1 when the OID is invalid or unknown or does not refer to a blob. 231 * 0 when the blob is empty. 232 * 1 along with { data, size } of the (possibly augmented) buffer 233 * when successful. 234 * 235 * Optionally updates the given oid_stat with the given OID (when valid). 236 */ 237static intdo_read_blob(const struct object_id *oid,struct oid_stat *oid_stat, 238size_t*size_out,char**data_out) 239{ 240enum object_type type; 241unsigned long sz; 242char*data; 243 244*size_out =0; 245*data_out = NULL; 246 247 data =read_object_file(oid, &type, &sz); 248if(!data || type != OBJ_BLOB) { 249free(data); 250return-1; 251} 252 253if(oid_stat) { 254memset(&oid_stat->stat,0,sizeof(oid_stat->stat)); 255oidcpy(&oid_stat->oid, oid); 256} 257 258if(sz ==0) { 259free(data); 260return0; 261} 262 263if(data[sz -1] !='\n') { 264 data =xrealloc(data,st_add(sz,1)); 265 data[sz++] ='\n'; 266} 267 268*size_out =xsize_t(sz); 269*data_out = data; 270 271return1; 272} 273 274#define DO_MATCH_EXCLUDE (1<<0) 275#define DO_MATCH_DIRECTORY (1<<1) 276#define DO_MATCH_SUBMODULE (1<<2) 277 278/* 279 * Does 'match' match the given name? 280 * A match is found if 281 * 282 * (1) the 'match' string is leading directory of 'name', or 283 * (2) the 'match' string is a wildcard and matches 'name', or 284 * (3) the 'match' string is exactly the same as 'name'. 285 * 286 * and the return value tells which case it was. 287 * 288 * It returns 0 when there is no match. 289 */ 290static intmatch_pathspec_item(const struct index_state *istate, 291const struct pathspec_item *item,int prefix, 292const char*name,int namelen,unsigned flags) 293{ 294/* name/namelen has prefix cut off by caller */ 295const char*match = item->match + prefix; 296int matchlen = item->len - prefix; 297 298/* 299 * The normal call pattern is: 300 * 1. prefix = common_prefix_len(ps); 301 * 2. prune something, or fill_directory 302 * 3. match_pathspec() 303 * 304 * 'prefix' at #1 may be shorter than the command's prefix and 305 * it's ok for #2 to match extra files. Those extras will be 306 * trimmed at #3. 307 * 308 * Suppose the pathspec is 'foo' and '../bar' running from 309 * subdir 'xyz'. The common prefix at #1 will be empty, thanks 310 * to "../". We may have xyz/foo _and_ XYZ/foo after #2. The 311 * user does not want XYZ/foo, only the "foo" part should be 312 * case-insensitive. We need to filter out XYZ/foo here. In 313 * other words, we do not trust the caller on comparing the 314 * prefix part when :(icase) is involved. We do exact 315 * comparison ourselves. 316 * 317 * Normally the caller (common_prefix_len() in fact) does 318 * _exact_ matching on name[-prefix+1..-1] and we do not need 319 * to check that part. Be defensive and check it anyway, in 320 * case common_prefix_len is changed, or a new caller is 321 * introduced that does not use common_prefix_len. 322 * 323 * If the penalty turns out too high when prefix is really 324 * long, maybe change it to 325 * strncmp(match, name, item->prefix - prefix) 326 */ 327if(item->prefix && (item->magic & PATHSPEC_ICASE) && 328strncmp(item->match, name - prefix, item->prefix)) 329return0; 330 331if(item->attr_match_nr && 332!match_pathspec_attrs(istate, name, namelen, item)) 333return0; 334 335/* If the match was just the prefix, we matched */ 336if(!*match) 337return MATCHED_RECURSIVELY; 338 339if(matchlen <= namelen && !ps_strncmp(item, match, name, matchlen)) { 340if(matchlen == namelen) 341return MATCHED_EXACTLY; 342 343if(match[matchlen-1] =='/'|| name[matchlen] =='/') 344return MATCHED_RECURSIVELY; 345}else if((flags & DO_MATCH_DIRECTORY) && 346 match[matchlen -1] =='/'&& 347 namelen == matchlen -1&& 348!ps_strncmp(item, match, name, namelen)) 349return MATCHED_EXACTLY; 350 351if(item->nowildcard_len < item->len && 352!git_fnmatch(item, match, name, 353 item->nowildcard_len - prefix)) 354return MATCHED_FNMATCH; 355 356/* Perform checks to see if "name" is a super set of the pathspec */ 357if(flags & DO_MATCH_SUBMODULE) { 358/* name is a literal prefix of the pathspec */ 359if((namelen < matchlen) && 360(match[namelen] =='/') && 361!ps_strncmp(item, match, name, namelen)) 362return MATCHED_RECURSIVELY; 363 364/* name" doesn't match up to the first wild character */ 365if(item->nowildcard_len < item->len && 366ps_strncmp(item, match, name, 367 item->nowildcard_len - prefix)) 368return0; 369 370/* 371 * Here is where we would perform a wildmatch to check if 372 * "name" can be matched as a directory (or a prefix) against 373 * the pathspec. Since wildmatch doesn't have this capability 374 * at the present we have to punt and say that it is a match, 375 * potentially returning a false positive 376 * The submodules themselves will be able to perform more 377 * accurate matching to determine if the pathspec matches. 378 */ 379return MATCHED_RECURSIVELY; 380} 381 382return0; 383} 384 385/* 386 * Given a name and a list of pathspecs, returns the nature of the 387 * closest (i.e. most specific) match of the name to any of the 388 * pathspecs. 389 * 390 * The caller typically calls this multiple times with the same 391 * pathspec and seen[] array but with different name/namelen 392 * (e.g. entries from the index) and is interested in seeing if and 393 * how each pathspec matches all the names it calls this function 394 * with. A mark is left in the seen[] array for each pathspec element 395 * indicating the closest type of match that element achieved, so if 396 * seen[n] remains zero after multiple invocations, that means the nth 397 * pathspec did not match any names, which could indicate that the 398 * user mistyped the nth pathspec. 399 */ 400static intdo_match_pathspec(const struct index_state *istate, 401const struct pathspec *ps, 402const char*name,int namelen, 403int prefix,char*seen, 404unsigned flags) 405{ 406int i, retval =0, exclude = flags & DO_MATCH_EXCLUDE; 407 408GUARD_PATHSPEC(ps, 409 PATHSPEC_FROMTOP | 410 PATHSPEC_MAXDEPTH | 411 PATHSPEC_LITERAL | 412 PATHSPEC_GLOB | 413 PATHSPEC_ICASE | 414 PATHSPEC_EXCLUDE | 415 PATHSPEC_ATTR); 416 417if(!ps->nr) { 418if(!ps->recursive || 419!(ps->magic & PATHSPEC_MAXDEPTH) || 420 ps->max_depth == -1) 421return MATCHED_RECURSIVELY; 422 423if(within_depth(name, namelen,0, ps->max_depth)) 424return MATCHED_EXACTLY; 425else 426return0; 427} 428 429 name += prefix; 430 namelen -= prefix; 431 432for(i = ps->nr -1; i >=0; i--) { 433int how; 434 435if((!exclude && ps->items[i].magic & PATHSPEC_EXCLUDE) || 436( exclude && !(ps->items[i].magic & PATHSPEC_EXCLUDE))) 437continue; 438 439if(seen && seen[i] == MATCHED_EXACTLY) 440continue; 441/* 442 * Make exclude patterns optional and never report 443 * "pathspec ':(exclude)foo' matches no files" 444 */ 445if(seen && ps->items[i].magic & PATHSPEC_EXCLUDE) 446 seen[i] = MATCHED_FNMATCH; 447 how =match_pathspec_item(istate, ps->items+i, prefix, name, 448 namelen, flags); 449if(ps->recursive && 450(ps->magic & PATHSPEC_MAXDEPTH) && 451 ps->max_depth != -1&& 452 how && how != MATCHED_FNMATCH) { 453int len = ps->items[i].len; 454if(name[len] =='/') 455 len++; 456if(within_depth(name+len, namelen-len,0, ps->max_depth)) 457 how = MATCHED_EXACTLY; 458else 459 how =0; 460} 461if(how) { 462if(retval < how) 463 retval = how; 464if(seen && seen[i] < how) 465 seen[i] = how; 466} 467} 468return retval; 469} 470 471intmatch_pathspec(const struct index_state *istate, 472const struct pathspec *ps, 473const char*name,int namelen, 474int prefix,char*seen,int is_dir) 475{ 476int positive, negative; 477unsigned flags = is_dir ? DO_MATCH_DIRECTORY :0; 478 positive =do_match_pathspec(istate, ps, name, namelen, 479 prefix, seen, flags); 480if(!(ps->magic & PATHSPEC_EXCLUDE) || !positive) 481return positive; 482 negative =do_match_pathspec(istate, ps, name, namelen, 483 prefix, seen, 484 flags | DO_MATCH_EXCLUDE); 485return negative ?0: positive; 486} 487 488/** 489 * Check if a submodule is a superset of the pathspec 490 */ 491intsubmodule_path_match(const struct index_state *istate, 492const struct pathspec *ps, 493const char*submodule_name, 494char*seen) 495{ 496int matched =do_match_pathspec(istate, ps, submodule_name, 497strlen(submodule_name), 4980, seen, 499 DO_MATCH_DIRECTORY | 500 DO_MATCH_SUBMODULE); 501return matched; 502} 503 504intreport_path_error(const char*ps_matched, 505const struct pathspec *pathspec) 506{ 507/* 508 * Make sure all pathspec matched; otherwise it is an error. 509 */ 510int num, errors =0; 511for(num =0; num < pathspec->nr; num++) { 512int other, found_dup; 513 514if(ps_matched[num]) 515continue; 516/* 517 * The caller might have fed identical pathspec 518 * twice. Do not barf on such a mistake. 519 * FIXME: parse_pathspec should have eliminated 520 * duplicate pathspec. 521 */ 522for(found_dup = other =0; 523!found_dup && other < pathspec->nr; 524 other++) { 525if(other == num || !ps_matched[other]) 526continue; 527if(!strcmp(pathspec->items[other].original, 528 pathspec->items[num].original)) 529/* 530 * Ok, we have a match already. 531 */ 532 found_dup =1; 533} 534if(found_dup) 535continue; 536 537error(_("pathspec '%s' did not match any file(s) known to git"), 538 pathspec->items[num].original); 539 errors++; 540} 541return errors; 542} 543 544/* 545 * Return the length of the "simple" part of a path match limiter. 546 */ 547intsimple_length(const char*match) 548{ 549int len = -1; 550 551for(;;) { 552unsigned char c = *match++; 553 len++; 554if(c =='\0'||is_glob_special(c)) 555return len; 556} 557} 558 559intno_wildcard(const char*string) 560{ 561return string[simple_length(string)] =='\0'; 562} 563 564voidparse_exclude_pattern(const char**pattern, 565int*patternlen, 566unsigned*flags, 567int*nowildcardlen) 568{ 569const char*p = *pattern; 570size_t i, len; 571 572*flags =0; 573if(*p =='!') { 574*flags |= EXC_FLAG_NEGATIVE; 575 p++; 576} 577 len =strlen(p); 578if(len && p[len -1] =='/') { 579 len--; 580*flags |= EXC_FLAG_MUSTBEDIR; 581} 582for(i =0; i < len; i++) { 583if(p[i] =='/') 584break; 585} 586if(i == len) 587*flags |= EXC_FLAG_NODIR; 588*nowildcardlen =simple_length(p); 589/* 590 * we should have excluded the trailing slash from 'p' too, 591 * but that's one more allocation. Instead just make sure 592 * nowildcardlen does not exceed real patternlen 593 */ 594if(*nowildcardlen > len) 595*nowildcardlen = len; 596if(*p =='*'&&no_wildcard(p +1)) 597*flags |= EXC_FLAG_ENDSWITH; 598*pattern = p; 599*patternlen = len; 600} 601 602voidadd_exclude(const char*string,const char*base, 603int baselen,struct exclude_list *el,int srcpos) 604{ 605struct exclude *x; 606int patternlen; 607unsigned flags; 608int nowildcardlen; 609 610parse_exclude_pattern(&string, &patternlen, &flags, &nowildcardlen); 611if(flags & EXC_FLAG_MUSTBEDIR) { 612FLEXPTR_ALLOC_MEM(x, pattern, string, patternlen); 613}else{ 614 x =xmalloc(sizeof(*x)); 615 x->pattern = string; 616} 617 x->patternlen = patternlen; 618 x->nowildcardlen = nowildcardlen; 619 x->base = base; 620 x->baselen = baselen; 621 x->flags = flags; 622 x->srcpos = srcpos; 623ALLOC_GROW(el->excludes, el->nr +1, el->alloc); 624 el->excludes[el->nr++] = x; 625 x->el = el; 626} 627 628static intread_skip_worktree_file_from_index(const struct index_state *istate, 629const char*path, 630size_t*size_out,char**data_out, 631struct oid_stat *oid_stat) 632{ 633int pos, len; 634 635 len =strlen(path); 636 pos =index_name_pos(istate, path, len); 637if(pos <0) 638return-1; 639if(!ce_skip_worktree(istate->cache[pos])) 640return-1; 641 642returndo_read_blob(&istate->cache[pos]->oid, oid_stat, size_out, data_out); 643} 644 645/* 646 * Frees memory within el which was allocated for exclude patterns and 647 * the file buffer. Does not free el itself. 648 */ 649voidclear_exclude_list(struct exclude_list *el) 650{ 651int i; 652 653for(i =0; i < el->nr; i++) 654free(el->excludes[i]); 655free(el->excludes); 656free(el->filebuf); 657 658memset(el,0,sizeof(*el)); 659} 660 661static voidtrim_trailing_spaces(char*buf) 662{ 663char*p, *last_space = NULL; 664 665for(p = buf; *p; p++) 666switch(*p) { 667case' ': 668if(!last_space) 669 last_space = p; 670break; 671case'\\': 672 p++; 673if(!*p) 674return; 675/* fallthrough */ 676default: 677 last_space = NULL; 678} 679 680if(last_space) 681*last_space ='\0'; 682} 683 684/* 685 * Given a subdirectory name and "dir" of the current directory, 686 * search the subdir in "dir" and return it, or create a new one if it 687 * does not exist in "dir". 688 * 689 * If "name" has the trailing slash, it'll be excluded in the search. 690 */ 691static struct untracked_cache_dir *lookup_untracked(struct untracked_cache *uc, 692struct untracked_cache_dir *dir, 693const char*name,int len) 694{ 695int first, last; 696struct untracked_cache_dir *d; 697if(!dir) 698return NULL; 699if(len && name[len -1] =='/') 700 len--; 701 first =0; 702 last = dir->dirs_nr; 703while(last > first) { 704int cmp, next = (last + first) >>1; 705 d = dir->dirs[next]; 706 cmp =strncmp(name, d->name, len); 707if(!cmp &&strlen(d->name) > len) 708 cmp = -1; 709if(!cmp) 710return d; 711if(cmp <0) { 712 last = next; 713continue; 714} 715 first = next+1; 716} 717 718 uc->dir_created++; 719FLEX_ALLOC_MEM(d, name, name, len); 720 721ALLOC_GROW(dir->dirs, dir->dirs_nr +1, dir->dirs_alloc); 722MOVE_ARRAY(dir->dirs + first +1, dir->dirs + first, 723 dir->dirs_nr - first); 724 dir->dirs_nr++; 725 dir->dirs[first] = d; 726return d; 727} 728 729static voiddo_invalidate_gitignore(struct untracked_cache_dir *dir) 730{ 731int i; 732 dir->valid =0; 733 dir->untracked_nr =0; 734for(i =0; i < dir->dirs_nr; i++) 735do_invalidate_gitignore(dir->dirs[i]); 736} 737 738static voidinvalidate_gitignore(struct untracked_cache *uc, 739struct untracked_cache_dir *dir) 740{ 741 uc->gitignore_invalidated++; 742do_invalidate_gitignore(dir); 743} 744 745static voidinvalidate_directory(struct untracked_cache *uc, 746struct untracked_cache_dir *dir) 747{ 748int i; 749 750/* 751 * Invalidation increment here is just roughly correct. If 752 * untracked_nr or any of dirs[].recurse is non-zero, we 753 * should increment dir_invalidated too. But that's more 754 * expensive to do. 755 */ 756if(dir->valid) 757 uc->dir_invalidated++; 758 759 dir->valid =0; 760 dir->untracked_nr =0; 761for(i =0; i < dir->dirs_nr; i++) 762 dir->dirs[i]->recurse =0; 763} 764 765static intadd_excludes_from_buffer(char*buf,size_t size, 766const char*base,int baselen, 767struct exclude_list *el); 768 769/* 770 * Given a file with name "fname", read it (either from disk, or from 771 * an index if 'istate' is non-null), parse it and store the 772 * exclude rules in "el". 773 * 774 * If "ss" is not NULL, compute SHA-1 of the exclude file and fill 775 * stat data from disk (only valid if add_excludes returns zero). If 776 * ss_valid is non-zero, "ss" must contain good value as input. 777 */ 778static intadd_excludes(const char*fname,const char*base,int baselen, 779struct exclude_list *el,struct index_state *istate, 780struct oid_stat *oid_stat) 781{ 782struct stat st; 783int r; 784int fd; 785size_t size =0; 786char*buf; 787 788 fd =open(fname, O_RDONLY); 789if(fd <0||fstat(fd, &st) <0) { 790if(fd <0) 791warn_on_fopen_errors(fname); 792else 793close(fd); 794if(!istate) 795return-1; 796 r =read_skip_worktree_file_from_index(istate, fname, 797&size, &buf, 798 oid_stat); 799if(r !=1) 800return r; 801}else{ 802 size =xsize_t(st.st_size); 803if(size ==0) { 804if(oid_stat) { 805fill_stat_data(&oid_stat->stat, &st); 806oidcpy(&oid_stat->oid, the_hash_algo->empty_blob); 807 oid_stat->valid =1; 808} 809close(fd); 810return0; 811} 812 buf =xmallocz(size); 813if(read_in_full(fd, buf, size) != size) { 814free(buf); 815close(fd); 816return-1; 817} 818 buf[size++] ='\n'; 819close(fd); 820if(oid_stat) { 821int pos; 822if(oid_stat->valid && 823!match_stat_data_racy(istate, &oid_stat->stat, &st)) 824;/* no content change, ss->sha1 still good */ 825else if(istate && 826(pos =index_name_pos(istate, fname,strlen(fname))) >=0&& 827!ce_stage(istate->cache[pos]) && 828ce_uptodate(istate->cache[pos]) && 829!would_convert_to_git(istate, fname)) 830oidcpy(&oid_stat->oid, 831&istate->cache[pos]->oid); 832else 833hash_object_file(buf, size,"blob", 834&oid_stat->oid); 835fill_stat_data(&oid_stat->stat, &st); 836 oid_stat->valid =1; 837} 838} 839 840add_excludes_from_buffer(buf, size, base, baselen, el); 841return0; 842} 843 844static intadd_excludes_from_buffer(char*buf,size_t size, 845const char*base,int baselen, 846struct exclude_list *el) 847{ 848int i, lineno =1; 849char*entry; 850 851 el->filebuf = buf; 852 853if(skip_utf8_bom(&buf, size)) 854 size -= buf - el->filebuf; 855 856 entry = buf; 857 858for(i =0; i < size; i++) { 859if(buf[i] =='\n') { 860if(entry != buf + i && entry[0] !='#') { 861 buf[i - (i && buf[i-1] =='\r')] =0; 862trim_trailing_spaces(entry); 863add_exclude(entry, base, baselen, el, lineno); 864} 865 lineno++; 866 entry = buf + i +1; 867} 868} 869return0; 870} 871 872intadd_excludes_from_file_to_list(const char*fname,const char*base, 873int baselen,struct exclude_list *el, 874struct index_state *istate) 875{ 876returnadd_excludes(fname, base, baselen, el, istate, NULL); 877} 878 879intadd_excludes_from_blob_to_list( 880struct object_id *oid, 881const char*base,int baselen, 882struct exclude_list *el) 883{ 884char*buf; 885size_t size; 886int r; 887 888 r =do_read_blob(oid, NULL, &size, &buf); 889if(r !=1) 890return r; 891 892add_excludes_from_buffer(buf, size, base, baselen, el); 893return0; 894} 895 896struct exclude_list *add_exclude_list(struct dir_struct *dir, 897int group_type,const char*src) 898{ 899struct exclude_list *el; 900struct exclude_list_group *group; 901 902 group = &dir->exclude_list_group[group_type]; 903ALLOC_GROW(group->el, group->nr +1, group->alloc); 904 el = &group->el[group->nr++]; 905memset(el,0,sizeof(*el)); 906 el->src = src; 907return el; 908} 909 910/* 911 * Used to set up core.excludesfile and .git/info/exclude lists. 912 */ 913static voidadd_excludes_from_file_1(struct dir_struct *dir,const char*fname, 914struct oid_stat *oid_stat) 915{ 916struct exclude_list *el; 917/* 918 * catch setup_standard_excludes() that's called before 919 * dir->untracked is assigned. That function behaves 920 * differently when dir->untracked is non-NULL. 921 */ 922if(!dir->untracked) 923 dir->unmanaged_exclude_files++; 924 el =add_exclude_list(dir, EXC_FILE, fname); 925if(add_excludes(fname,"",0, el, NULL, oid_stat) <0) 926die(_("cannot use%sas an exclude file"), fname); 927} 928 929voidadd_excludes_from_file(struct dir_struct *dir,const char*fname) 930{ 931 dir->unmanaged_exclude_files++;/* see validate_untracked_cache() */ 932add_excludes_from_file_1(dir, fname, NULL); 933} 934 935intmatch_basename(const char*basename,int basenamelen, 936const char*pattern,int prefix,int patternlen, 937unsigned flags) 938{ 939if(prefix == patternlen) { 940if(patternlen == basenamelen && 941!fspathncmp(pattern, basename, basenamelen)) 942return1; 943}else if(flags & EXC_FLAG_ENDSWITH) { 944/* "*literal" matching against "fooliteral" */ 945if(patternlen -1<= basenamelen && 946!fspathncmp(pattern +1, 947 basename + basenamelen - (patternlen -1), 948 patternlen -1)) 949return1; 950}else{ 951if(fnmatch_icase_mem(pattern, patternlen, 952 basename, basenamelen, 9530) ==0) 954return1; 955} 956return0; 957} 958 959intmatch_pathname(const char*pathname,int pathlen, 960const char*base,int baselen, 961const char*pattern,int prefix,int patternlen, 962unsigned flags) 963{ 964const char*name; 965int namelen; 966 967/* 968 * match with FNM_PATHNAME; the pattern has base implicitly 969 * in front of it. 970 */ 971if(*pattern =='/') { 972 pattern++; 973 patternlen--; 974 prefix--; 975} 976 977/* 978 * baselen does not count the trailing slash. base[] may or 979 * may not end with a trailing slash though. 980 */ 981if(pathlen < baselen +1|| 982(baselen && pathname[baselen] !='/') || 983fspathncmp(pathname, base, baselen)) 984return0; 985 986 namelen = baselen ? pathlen - baselen -1: pathlen; 987 name = pathname + pathlen - namelen; 988 989if(prefix) { 990/* 991 * if the non-wildcard part is longer than the 992 * remaining pathname, surely it cannot match. 993 */ 994if(prefix > namelen) 995return0; 996 997if(fspathncmp(pattern, name, prefix)) 998return0; 999 pattern += prefix;1000 patternlen -= prefix;1001 name += prefix;1002 namelen -= prefix;10031004/*1005 * If the whole pattern did not have a wildcard,1006 * then our prefix match is all we need; we1007 * do not need to call fnmatch at all.1008 */1009if(!patternlen && !namelen)1010return1;1011}10121013returnfnmatch_icase_mem(pattern, patternlen,1014 name, namelen,1015 WM_PATHNAME) ==0;1016}10171018/*1019 * Scan the given exclude list in reverse to see whether pathname1020 * should be ignored. The first match (i.e. the last on the list), if1021 * any, determines the fate. Returns the exclude_list element which1022 * matched, or NULL for undecided.1023 */1024static struct exclude *last_exclude_matching_from_list(const char*pathname,1025int pathlen,1026const char*basename,1027int*dtype,1028struct exclude_list *el,1029struct index_state *istate)1030{1031struct exclude *exc = NULL;/* undecided */1032int i;10331034if(!el->nr)1035return NULL;/* undefined */10361037for(i = el->nr -1;0<= i; i--) {1038struct exclude *x = el->excludes[i];1039const char*exclude = x->pattern;1040int prefix = x->nowildcardlen;10411042if(x->flags & EXC_FLAG_MUSTBEDIR) {1043if(*dtype == DT_UNKNOWN)1044*dtype =get_dtype(NULL, istate, pathname, pathlen);1045if(*dtype != DT_DIR)1046continue;1047}10481049if(x->flags & EXC_FLAG_NODIR) {1050if(match_basename(basename,1051 pathlen - (basename - pathname),1052 exclude, prefix, x->patternlen,1053 x->flags)) {1054 exc = x;1055break;1056}1057continue;1058}10591060assert(x->baselen ==0|| x->base[x->baselen -1] =='/');1061if(match_pathname(pathname, pathlen,1062 x->base, x->baselen ? x->baselen -1:0,1063 exclude, prefix, x->patternlen, x->flags)) {1064 exc = x;1065break;1066}1067}1068return exc;1069}10701071/*1072 * Scan the list and let the last match determine the fate.1073 * Return 1 for exclude, 0 for include and -1 for undecided.1074 */1075intis_excluded_from_list(const char*pathname,1076int pathlen,const char*basename,int*dtype,1077struct exclude_list *el,struct index_state *istate)1078{1079struct exclude *exclude;1080 exclude =last_exclude_matching_from_list(pathname, pathlen, basename,1081 dtype, el, istate);1082if(exclude)1083return exclude->flags & EXC_FLAG_NEGATIVE ?0:1;1084return-1;/* undecided */1085}10861087static struct exclude *last_exclude_matching_from_lists(struct dir_struct *dir,1088struct index_state *istate,1089const char*pathname,int pathlen,const char*basename,1090int*dtype_p)1091{1092int i, j;1093struct exclude_list_group *group;1094struct exclude *exclude;1095for(i = EXC_CMDL; i <= EXC_FILE; i++) {1096 group = &dir->exclude_list_group[i];1097for(j = group->nr -1; j >=0; j--) {1098 exclude =last_exclude_matching_from_list(1099 pathname, pathlen, basename, dtype_p,1100&group->el[j], istate);1101if(exclude)1102return exclude;1103}1104}1105return NULL;1106}11071108/*1109 * Loads the per-directory exclude list for the substring of base1110 * which has a char length of baselen.1111 */1112static voidprep_exclude(struct dir_struct *dir,1113struct index_state *istate,1114const char*base,int baselen)1115{1116struct exclude_list_group *group;1117struct exclude_list *el;1118struct exclude_stack *stk = NULL;1119struct untracked_cache_dir *untracked;1120int current;11211122 group = &dir->exclude_list_group[EXC_DIRS];11231124/*1125 * Pop the exclude lists from the EXCL_DIRS exclude_list_group1126 * which originate from directories not in the prefix of the1127 * path being checked.1128 */1129while((stk = dir->exclude_stack) != NULL) {1130if(stk->baselen <= baselen &&1131!strncmp(dir->basebuf.buf, base, stk->baselen))1132break;1133 el = &group->el[dir->exclude_stack->exclude_ix];1134 dir->exclude_stack = stk->prev;1135 dir->exclude = NULL;1136free((char*)el->src);/* see strbuf_detach() below */1137clear_exclude_list(el);1138free(stk);1139 group->nr--;1140}11411142/* Skip traversing into sub directories if the parent is excluded */1143if(dir->exclude)1144return;11451146/*1147 * Lazy initialization. All call sites currently just1148 * memset(dir, 0, sizeof(*dir)) before use. Changing all of1149 * them seems lots of work for little benefit.1150 */1151if(!dir->basebuf.buf)1152strbuf_init(&dir->basebuf, PATH_MAX);11531154/* Read from the parent directories and push them down. */1155 current = stk ? stk->baselen : -1;1156strbuf_setlen(&dir->basebuf, current <0?0: current);1157if(dir->untracked)1158 untracked = stk ? stk->ucd : dir->untracked->root;1159else1160 untracked = NULL;11611162while(current < baselen) {1163const char*cp;1164struct oid_stat oid_stat;11651166 stk =xcalloc(1,sizeof(*stk));1167if(current <0) {1168 cp = base;1169 current =0;1170}else{1171 cp =strchr(base + current +1,'/');1172if(!cp)1173die("oops in prep_exclude");1174 cp++;1175 untracked =1176lookup_untracked(dir->untracked, untracked,1177 base + current,1178 cp - base - current);1179}1180 stk->prev = dir->exclude_stack;1181 stk->baselen = cp - base;1182 stk->exclude_ix = group->nr;1183 stk->ucd = untracked;1184 el =add_exclude_list(dir, EXC_DIRS, NULL);1185strbuf_add(&dir->basebuf, base + current, stk->baselen - current);1186assert(stk->baselen == dir->basebuf.len);11871188/* Abort if the directory is excluded */1189if(stk->baselen) {1190int dt = DT_DIR;1191 dir->basebuf.buf[stk->baselen -1] =0;1192 dir->exclude =last_exclude_matching_from_lists(dir,1193 istate,1194 dir->basebuf.buf, stk->baselen -1,1195 dir->basebuf.buf + current, &dt);1196 dir->basebuf.buf[stk->baselen -1] ='/';1197if(dir->exclude &&1198 dir->exclude->flags & EXC_FLAG_NEGATIVE)1199 dir->exclude = NULL;1200if(dir->exclude) {1201 dir->exclude_stack = stk;1202return;1203}1204}12051206/* Try to read per-directory file */1207oidclr(&oid_stat.oid);1208 oid_stat.valid =0;1209if(dir->exclude_per_dir &&1210/*1211 * If we know that no files have been added in1212 * this directory (i.e. valid_cached_dir() has1213 * been executed and set untracked->valid) ..1214 */1215(!untracked || !untracked->valid ||1216/*1217 * .. and .gitignore does not exist before1218 * (i.e. null exclude_oid). Then we can skip1219 * loading .gitignore, which would result in1220 * ENOENT anyway.1221 */1222!is_null_oid(&untracked->exclude_oid))) {1223/*1224 * dir->basebuf gets reused by the traversal, but we1225 * need fname to remain unchanged to ensure the src1226 * member of each struct exclude correctly1227 * back-references its source file. Other invocations1228 * of add_exclude_list provide stable strings, so we1229 * strbuf_detach() and free() here in the caller.1230 */1231struct strbuf sb = STRBUF_INIT;1232strbuf_addbuf(&sb, &dir->basebuf);1233strbuf_addstr(&sb, dir->exclude_per_dir);1234 el->src =strbuf_detach(&sb, NULL);1235add_excludes(el->src, el->src, stk->baselen, el, istate,1236 untracked ? &oid_stat : NULL);1237}1238/*1239 * NEEDSWORK: when untracked cache is enabled, prep_exclude()1240 * will first be called in valid_cached_dir() then maybe many1241 * times more in last_exclude_matching(). When the cache is1242 * used, last_exclude_matching() will not be called and1243 * reading .gitignore content will be a waste.1244 *1245 * So when it's called by valid_cached_dir() and we can get1246 * .gitignore SHA-1 from the index (i.e. .gitignore is not1247 * modified on work tree), we could delay reading the1248 * .gitignore content until we absolutely need it in1249 * last_exclude_matching(). Be careful about ignore rule1250 * order, though, if you do that.1251 */1252if(untracked &&1253!oideq(&oid_stat.oid, &untracked->exclude_oid)) {1254invalidate_gitignore(dir->untracked, untracked);1255oidcpy(&untracked->exclude_oid, &oid_stat.oid);1256}1257 dir->exclude_stack = stk;1258 current = stk->baselen;1259}1260strbuf_setlen(&dir->basebuf, baselen);1261}12621263/*1264 * Loads the exclude lists for the directory containing pathname, then1265 * scans all exclude lists to determine whether pathname is excluded.1266 * Returns the exclude_list element which matched, or NULL for1267 * undecided.1268 */1269struct exclude *last_exclude_matching(struct dir_struct *dir,1270struct index_state *istate,1271const char*pathname,1272int*dtype_p)1273{1274int pathlen =strlen(pathname);1275const char*basename =strrchr(pathname,'/');1276 basename = (basename) ? basename+1: pathname;12771278prep_exclude(dir, istate, pathname, basename-pathname);12791280if(dir->exclude)1281return dir->exclude;12821283returnlast_exclude_matching_from_lists(dir, istate, pathname, pathlen,1284 basename, dtype_p);1285}12861287/*1288 * Loads the exclude lists for the directory containing pathname, then1289 * scans all exclude lists to determine whether pathname is excluded.1290 * Returns 1 if true, otherwise 0.1291 */1292intis_excluded(struct dir_struct *dir,struct index_state *istate,1293const char*pathname,int*dtype_p)1294{1295struct exclude *exclude =1296last_exclude_matching(dir, istate, pathname, dtype_p);1297if(exclude)1298return exclude->flags & EXC_FLAG_NEGATIVE ?0:1;1299return0;1300}13011302static struct dir_entry *dir_entry_new(const char*pathname,int len)1303{1304struct dir_entry *ent;13051306FLEX_ALLOC_MEM(ent, name, pathname, len);1307 ent->len = len;1308return ent;1309}13101311static struct dir_entry *dir_add_name(struct dir_struct *dir,1312struct index_state *istate,1313const char*pathname,int len)1314{1315if(index_file_exists(istate, pathname, len, ignore_case))1316return NULL;13171318ALLOC_GROW(dir->entries, dir->nr+1, dir->alloc);1319return dir->entries[dir->nr++] =dir_entry_new(pathname, len);1320}13211322struct dir_entry *dir_add_ignored(struct dir_struct *dir,1323struct index_state *istate,1324const char*pathname,int len)1325{1326if(!index_name_is_other(istate, pathname, len))1327return NULL;13281329ALLOC_GROW(dir->ignored, dir->ignored_nr+1, dir->ignored_alloc);1330return dir->ignored[dir->ignored_nr++] =dir_entry_new(pathname, len);1331}13321333enum exist_status {1334 index_nonexistent =0,1335 index_directory,1336 index_gitdir1337};13381339/*1340 * Do not use the alphabetically sorted index to look up1341 * the directory name; instead, use the case insensitive1342 * directory hash.1343 */1344static enum exist_status directory_exists_in_index_icase(struct index_state *istate,1345const char*dirname,int len)1346{1347struct cache_entry *ce;13481349if(index_dir_exists(istate, dirname, len))1350return index_directory;13511352 ce =index_file_exists(istate, dirname, len, ignore_case);1353if(ce &&S_ISGITLINK(ce->ce_mode))1354return index_gitdir;13551356return index_nonexistent;1357}13581359/*1360 * The index sorts alphabetically by entry name, which1361 * means that a gitlink sorts as '\0' at the end, while1362 * a directory (which is defined not as an entry, but as1363 * the files it contains) will sort with the '/' at the1364 * end.1365 */1366static enum exist_status directory_exists_in_index(struct index_state *istate,1367const char*dirname,int len)1368{1369int pos;13701371if(ignore_case)1372returndirectory_exists_in_index_icase(istate, dirname, len);13731374 pos =index_name_pos(istate, dirname, len);1375if(pos <0)1376 pos = -pos-1;1377while(pos < istate->cache_nr) {1378const struct cache_entry *ce = istate->cache[pos++];1379unsigned char endchar;13801381if(strncmp(ce->name, dirname, len))1382break;1383 endchar = ce->name[len];1384if(endchar >'/')1385break;1386if(endchar =='/')1387return index_directory;1388if(!endchar &&S_ISGITLINK(ce->ce_mode))1389return index_gitdir;1390}1391return index_nonexistent;1392}13931394/*1395 * When we find a directory when traversing the filesystem, we1396 * have three distinct cases:1397 *1398 * - ignore it1399 * - see it as a directory1400 * - recurse into it1401 *1402 * and which one we choose depends on a combination of existing1403 * git index contents and the flags passed into the directory1404 * traversal routine.1405 *1406 * Case 1: If we *already* have entries in the index under that1407 * directory name, we always recurse into the directory to see1408 * all the files.1409 *1410 * Case 2: If we *already* have that directory name as a gitlink,1411 * we always continue to see it as a gitlink, regardless of whether1412 * there is an actual git directory there or not (it might not1413 * be checked out as a subproject!)1414 *1415 * Case 3: if we didn't have it in the index previously, we1416 * have a few sub-cases:1417 *1418 * (a) if "show_other_directories" is true, we show it as1419 * just a directory, unless "hide_empty_directories" is1420 * also true, in which case we need to check if it contains any1421 * untracked and / or ignored files.1422 * (b) if it looks like a git directory, and we don't have1423 * 'no_gitlinks' set we treat it as a gitlink, and show it1424 * as a directory.1425 * (c) otherwise, we recurse into it.1426 */1427static enum path_treatment treat_directory(struct dir_struct *dir,1428struct index_state *istate,1429struct untracked_cache_dir *untracked,1430const char*dirname,int len,int baselen,int exclude,1431const struct pathspec *pathspec)1432{1433/* The "len-1" is to strip the final '/' */1434switch(directory_exists_in_index(istate, dirname, len-1)) {1435case index_directory:1436return path_recurse;14371438case index_gitdir:1439return path_none;14401441case index_nonexistent:1442if(dir->flags & DIR_SHOW_OTHER_DIRECTORIES)1443break;1444if(exclude &&1445(dir->flags & DIR_SHOW_IGNORED_TOO) &&1446(dir->flags & DIR_SHOW_IGNORED_TOO_MODE_MATCHING)) {14471448/*1449 * This is an excluded directory and we are1450 * showing ignored paths that match an exclude1451 * pattern. (e.g. show directory as ignored1452 * only if it matches an exclude pattern).1453 * This path will either be 'path_excluded`1454 * (if we are showing empty directories or if1455 * the directory is not empty), or will be1456 * 'path_none' (empty directory, and we are1457 * not showing empty directories).1458 */1459if(!(dir->flags & DIR_HIDE_EMPTY_DIRECTORIES))1460return path_excluded;14611462if(read_directory_recursive(dir, istate, dirname, len,1463 untracked,1,1, pathspec) == path_excluded)1464return path_excluded;14651466return path_none;1467}1468if(!(dir->flags & DIR_NO_GITLINKS)) {1469struct object_id oid;1470if(resolve_gitlink_ref(dirname,"HEAD", &oid) ==0)1471return exclude ? path_excluded : path_untracked;1472}1473return path_recurse;1474}14751476/* This is the "show_other_directories" case */14771478if(!(dir->flags & DIR_HIDE_EMPTY_DIRECTORIES))1479return exclude ? path_excluded : path_untracked;14801481 untracked =lookup_untracked(dir->untracked, untracked,1482 dirname + baselen, len - baselen);14831484/*1485 * If this is an excluded directory, then we only need to check if1486 * the directory contains any files.1487 */1488returnread_directory_recursive(dir, istate, dirname, len,1489 untracked,1, exclude, pathspec);1490}14911492/*1493 * This is an inexact early pruning of any recursive directory1494 * reading - if the path cannot possibly be in the pathspec,1495 * return true, and we'll skip it early.1496 */1497static intsimplify_away(const char*path,int pathlen,1498const struct pathspec *pathspec)1499{1500int i;15011502if(!pathspec || !pathspec->nr)1503return0;15041505GUARD_PATHSPEC(pathspec,1506 PATHSPEC_FROMTOP |1507 PATHSPEC_MAXDEPTH |1508 PATHSPEC_LITERAL |1509 PATHSPEC_GLOB |1510 PATHSPEC_ICASE |1511 PATHSPEC_EXCLUDE |1512 PATHSPEC_ATTR);15131514for(i =0; i < pathspec->nr; i++) {1515const struct pathspec_item *item = &pathspec->items[i];1516int len = item->nowildcard_len;15171518if(len > pathlen)1519 len = pathlen;1520if(!ps_strncmp(item, item->match, path, len))1521return0;1522}15231524return1;1525}15261527/*1528 * This function tells us whether an excluded path matches a1529 * list of "interesting" pathspecs. That is, whether a path matched1530 * by any of the pathspecs could possibly be ignored by excluding1531 * the specified path. This can happen if:1532 *1533 * 1. the path is mentioned explicitly in the pathspec1534 *1535 * 2. the path is a directory prefix of some element in the1536 * pathspec1537 */1538static intexclude_matches_pathspec(const char*path,int pathlen,1539const struct pathspec *pathspec)1540{1541int i;15421543if(!pathspec || !pathspec->nr)1544return0;15451546GUARD_PATHSPEC(pathspec,1547 PATHSPEC_FROMTOP |1548 PATHSPEC_MAXDEPTH |1549 PATHSPEC_LITERAL |1550 PATHSPEC_GLOB |1551 PATHSPEC_ICASE |1552 PATHSPEC_EXCLUDE);15531554for(i =0; i < pathspec->nr; i++) {1555const struct pathspec_item *item = &pathspec->items[i];1556int len = item->nowildcard_len;15571558if(len == pathlen &&1559!ps_strncmp(item, item->match, path, pathlen))1560return1;1561if(len > pathlen &&1562 item->match[pathlen] =='/'&&1563!ps_strncmp(item, item->match, path, pathlen))1564return1;1565}1566return0;1567}15681569static intget_index_dtype(struct index_state *istate,1570const char*path,int len)1571{1572int pos;1573const struct cache_entry *ce;15741575 ce =index_file_exists(istate, path, len,0);1576if(ce) {1577if(!ce_uptodate(ce))1578return DT_UNKNOWN;1579if(S_ISGITLINK(ce->ce_mode))1580return DT_DIR;1581/*1582 * Nobody actually cares about the1583 * difference between DT_LNK and DT_REG1584 */1585return DT_REG;1586}15871588/* Try to look it up as a directory */1589 pos =index_name_pos(istate, path, len);1590if(pos >=0)1591return DT_UNKNOWN;1592 pos = -pos-1;1593while(pos < istate->cache_nr) {1594 ce = istate->cache[pos++];1595if(strncmp(ce->name, path, len))1596break;1597if(ce->name[len] >'/')1598break;1599if(ce->name[len] <'/')1600continue;1601if(!ce_uptodate(ce))1602break;/* continue? */1603return DT_DIR;1604}1605return DT_UNKNOWN;1606}16071608static intget_dtype(struct dirent *de,struct index_state *istate,1609const char*path,int len)1610{1611int dtype = de ?DTYPE(de) : DT_UNKNOWN;1612struct stat st;16131614if(dtype != DT_UNKNOWN)1615return dtype;1616 dtype =get_index_dtype(istate, path, len);1617if(dtype != DT_UNKNOWN)1618return dtype;1619if(lstat(path, &st))1620return dtype;1621if(S_ISREG(st.st_mode))1622return DT_REG;1623if(S_ISDIR(st.st_mode))1624return DT_DIR;1625if(S_ISLNK(st.st_mode))1626return DT_LNK;1627return dtype;1628}16291630static enum path_treatment treat_one_path(struct dir_struct *dir,1631struct untracked_cache_dir *untracked,1632struct index_state *istate,1633struct strbuf *path,1634int baselen,1635const struct pathspec *pathspec,1636int dtype,struct dirent *de)1637{1638int exclude;1639int has_path_in_index = !!index_file_exists(istate, path->buf, path->len, ignore_case);1640enum path_treatment path_treatment;16411642if(dtype == DT_UNKNOWN)1643 dtype =get_dtype(de, istate, path->buf, path->len);16441645/* Always exclude indexed files */1646if(dtype != DT_DIR && has_path_in_index)1647return path_none;16481649/*1650 * When we are looking at a directory P in the working tree,1651 * there are three cases:1652 *1653 * (1) P exists in the index. Everything inside the directory P in1654 * the working tree needs to go when P is checked out from the1655 * index.1656 *1657 * (2) P does not exist in the index, but there is P/Q in the index.1658 * We know P will stay a directory when we check out the contents1659 * of the index, but we do not know yet if there is a directory1660 * P/Q in the working tree to be killed, so we need to recurse.1661 *1662 * (3) P does not exist in the index, and there is no P/Q in the index1663 * to require P to be a directory, either. Only in this case, we1664 * know that everything inside P will not be killed without1665 * recursing.1666 */1667if((dir->flags & DIR_COLLECT_KILLED_ONLY) &&1668(dtype == DT_DIR) &&1669!has_path_in_index &&1670(directory_exists_in_index(istate, path->buf, path->len) == index_nonexistent))1671return path_none;16721673 exclude =is_excluded(dir, istate, path->buf, &dtype);16741675/*1676 * Excluded? If we don't explicitly want to show1677 * ignored files, ignore it1678 */1679if(exclude && !(dir->flags & (DIR_SHOW_IGNORED|DIR_SHOW_IGNORED_TOO)))1680return path_excluded;16811682switch(dtype) {1683default:1684return path_none;1685case DT_DIR:1686strbuf_addch(path,'/');1687 path_treatment =treat_directory(dir, istate, untracked,1688 path->buf, path->len,1689 baselen, exclude, pathspec);1690/*1691 * If 1) we only want to return directories that1692 * match an exclude pattern and 2) this directory does1693 * not match an exclude pattern but all of its1694 * contents are excluded, then indicate that we should1695 * recurse into this directory (instead of marking the1696 * directory itself as an ignored path).1697 */1698if(!exclude &&1699 path_treatment == path_excluded &&1700(dir->flags & DIR_SHOW_IGNORED_TOO) &&1701(dir->flags & DIR_SHOW_IGNORED_TOO_MODE_MATCHING))1702return path_recurse;1703return path_treatment;1704case DT_REG:1705case DT_LNK:1706return exclude ? path_excluded : path_untracked;1707}1708}17091710static enum path_treatment treat_path_fast(struct dir_struct *dir,1711struct untracked_cache_dir *untracked,1712struct cached_dir *cdir,1713struct index_state *istate,1714struct strbuf *path,1715int baselen,1716const struct pathspec *pathspec)1717{1718strbuf_setlen(path, baselen);1719if(!cdir->ucd) {1720strbuf_addstr(path, cdir->file);1721return path_untracked;1722}1723strbuf_addstr(path, cdir->ucd->name);1724/* treat_one_path() does this before it calls treat_directory() */1725strbuf_complete(path,'/');1726if(cdir->ucd->check_only)1727/*1728 * check_only is set as a result of treat_directory() getting1729 * to its bottom. Verify again the same set of directories1730 * with check_only set.1731 */1732returnread_directory_recursive(dir, istate, path->buf, path->len,1733 cdir->ucd,1,0, pathspec);1734/*1735 * We get path_recurse in the first run when1736 * directory_exists_in_index() returns index_nonexistent. We1737 * are sure that new changes in the index does not impact the1738 * outcome. Return now.1739 */1740return path_recurse;1741}17421743static enum path_treatment treat_path(struct dir_struct *dir,1744struct untracked_cache_dir *untracked,1745struct cached_dir *cdir,1746struct index_state *istate,1747struct strbuf *path,1748int baselen,1749const struct pathspec *pathspec)1750{1751int dtype;1752struct dirent *de = cdir->de;17531754if(!de)1755returntreat_path_fast(dir, untracked, cdir, istate, path,1756 baselen, pathspec);1757if(is_dot_or_dotdot(de->d_name) || !fspathcmp(de->d_name,".git"))1758return path_none;1759strbuf_setlen(path, baselen);1760strbuf_addstr(path, de->d_name);1761if(simplify_away(path->buf, path->len, pathspec))1762return path_none;17631764 dtype =DTYPE(de);1765returntreat_one_path(dir, untracked, istate, path, baselen, pathspec, dtype, de);1766}17671768static voidadd_untracked(struct untracked_cache_dir *dir,const char*name)1769{1770if(!dir)1771return;1772ALLOC_GROW(dir->untracked, dir->untracked_nr +1,1773 dir->untracked_alloc);1774 dir->untracked[dir->untracked_nr++] =xstrdup(name);1775}17761777static intvalid_cached_dir(struct dir_struct *dir,1778struct untracked_cache_dir *untracked,1779struct index_state *istate,1780struct strbuf *path,1781int check_only)1782{1783struct stat st;17841785if(!untracked)1786return0;17871788/*1789 * With fsmonitor, we can trust the untracked cache's valid field.1790 */1791refresh_fsmonitor(istate);1792if(!(dir->untracked->use_fsmonitor && untracked->valid)) {1793if(lstat(path->len ? path->buf :".", &st)) {1794memset(&untracked->stat_data,0,sizeof(untracked->stat_data));1795return0;1796}1797if(!untracked->valid ||1798match_stat_data_racy(istate, &untracked->stat_data, &st)) {1799fill_stat_data(&untracked->stat_data, &st);1800return0;1801}1802}18031804if(untracked->check_only != !!check_only)1805return0;18061807/*1808 * prep_exclude will be called eventually on this directory,1809 * but it's called much later in last_exclude_matching(). We1810 * need it now to determine the validity of the cache for this1811 * path. The next calls will be nearly no-op, the way1812 * prep_exclude() is designed.1813 */1814if(path->len && path->buf[path->len -1] !='/') {1815strbuf_addch(path,'/');1816prep_exclude(dir, istate, path->buf, path->len);1817strbuf_setlen(path, path->len -1);1818}else1819prep_exclude(dir, istate, path->buf, path->len);18201821/* hopefully prep_exclude() haven't invalidated this entry... */1822return untracked->valid;1823}18241825static intopen_cached_dir(struct cached_dir *cdir,1826struct dir_struct *dir,1827struct untracked_cache_dir *untracked,1828struct index_state *istate,1829struct strbuf *path,1830int check_only)1831{1832const char*c_path;18331834memset(cdir,0,sizeof(*cdir));1835 cdir->untracked = untracked;1836if(valid_cached_dir(dir, untracked, istate, path, check_only))1837return0;1838 c_path = path->len ? path->buf :".";1839 cdir->fdir =opendir(c_path);1840if(!cdir->fdir)1841warning_errno(_("could not open directory '%s'"), c_path);1842if(dir->untracked) {1843invalidate_directory(dir->untracked, untracked);1844 dir->untracked->dir_opened++;1845}1846if(!cdir->fdir)1847return-1;1848return0;1849}18501851static intread_cached_dir(struct cached_dir *cdir)1852{1853if(cdir->fdir) {1854 cdir->de =readdir(cdir->fdir);1855if(!cdir->de)1856return-1;1857return0;1858}1859while(cdir->nr_dirs < cdir->untracked->dirs_nr) {1860struct untracked_cache_dir *d = cdir->untracked->dirs[cdir->nr_dirs];1861if(!d->recurse) {1862 cdir->nr_dirs++;1863continue;1864}1865 cdir->ucd = d;1866 cdir->nr_dirs++;1867return0;1868}1869 cdir->ucd = NULL;1870if(cdir->nr_files < cdir->untracked->untracked_nr) {1871struct untracked_cache_dir *d = cdir->untracked;1872 cdir->file = d->untracked[cdir->nr_files++];1873return0;1874}1875return-1;1876}18771878static voidclose_cached_dir(struct cached_dir *cdir)1879{1880if(cdir->fdir)1881closedir(cdir->fdir);1882/*1883 * We have gone through this directory and found no untracked1884 * entries. Mark it valid.1885 */1886if(cdir->untracked) {1887 cdir->untracked->valid =1;1888 cdir->untracked->recurse =1;1889}1890}18911892/*1893 * Read a directory tree. We currently ignore anything but1894 * directories, regular files and symlinks. That's because git1895 * doesn't handle them at all yet. Maybe that will change some1896 * day.1897 *1898 * Also, we ignore the name ".git" (even if it is not a directory).1899 * That likely will not change.1900 *1901 * If 'stop_at_first_file' is specified, 'path_excluded' is returned1902 * to signal that a file was found. This is the least significant value that1903 * indicates that a file was encountered that does not depend on the order of1904 * whether an untracked or exluded path was encountered first.1905 *1906 * Returns the most significant path_treatment value encountered in the scan.1907 * If 'stop_at_first_file' is specified, `path_excluded` is the most1908 * significant path_treatment value that will be returned.1909 */19101911static enum path_treatment read_directory_recursive(struct dir_struct *dir,1912struct index_state *istate,const char*base,int baselen,1913struct untracked_cache_dir *untracked,int check_only,1914int stop_at_first_file,const struct pathspec *pathspec)1915{1916struct cached_dir cdir;1917enum path_treatment state, subdir_state, dir_state = path_none;1918struct strbuf path = STRBUF_INIT;19191920strbuf_add(&path, base, baselen);19211922if(open_cached_dir(&cdir, dir, untracked, istate, &path, check_only))1923goto out;19241925if(untracked)1926 untracked->check_only = !!check_only;19271928while(!read_cached_dir(&cdir)) {1929/* check how the file or directory should be treated */1930 state =treat_path(dir, untracked, &cdir, istate, &path,1931 baselen, pathspec);19321933if(state > dir_state)1934 dir_state = state;19351936/* recurse into subdir if instructed by treat_path */1937if((state == path_recurse) ||1938((state == path_untracked) &&1939(dir->flags & DIR_SHOW_IGNORED_TOO) &&1940(get_dtype(cdir.de, istate, path.buf, path.len) == DT_DIR))) {1941struct untracked_cache_dir *ud;1942 ud =lookup_untracked(dir->untracked, untracked,1943 path.buf + baselen,1944 path.len - baselen);1945 subdir_state =1946read_directory_recursive(dir, istate, path.buf,1947 path.len, ud,1948 check_only, stop_at_first_file, pathspec);1949if(subdir_state > dir_state)1950 dir_state = subdir_state;1951}19521953if(check_only) {1954if(stop_at_first_file) {1955/*1956 * If stopping at first file, then1957 * signal that a file was found by1958 * returning `path_excluded`. This is1959 * to return a consistent value1960 * regardless of whether an ignored or1961 * excluded file happened to be1962 * encountered 1st.1963 *1964 * In current usage, the1965 * `stop_at_first_file` is passed when1966 * an ancestor directory has matched1967 * an exclude pattern, so any found1968 * files will be excluded.1969 */1970if(dir_state >= path_excluded) {1971 dir_state = path_excluded;1972break;1973}1974}19751976/* abort early if maximum state has been reached */1977if(dir_state == path_untracked) {1978if(cdir.fdir)1979add_untracked(untracked, path.buf + baselen);1980break;1981}1982/* skip the dir_add_* part */1983continue;1984}19851986/* add the path to the appropriate result list */1987switch(state) {1988case path_excluded:1989if(dir->flags & DIR_SHOW_IGNORED)1990dir_add_name(dir, istate, path.buf, path.len);1991else if((dir->flags & DIR_SHOW_IGNORED_TOO) ||1992((dir->flags & DIR_COLLECT_IGNORED) &&1993exclude_matches_pathspec(path.buf, path.len,1994 pathspec)))1995dir_add_ignored(dir, istate, path.buf, path.len);1996break;19971998case path_untracked:1999if(dir->flags & DIR_SHOW_IGNORED)2000break;2001dir_add_name(dir, istate, path.buf, path.len);2002if(cdir.fdir)2003add_untracked(untracked, path.buf + baselen);2004break;20052006default:2007break;2008}2009}2010close_cached_dir(&cdir);2011 out:2012strbuf_release(&path);20132014return dir_state;2015}20162017intcmp_dir_entry(const void*p1,const void*p2)2018{2019const struct dir_entry *e1 = *(const struct dir_entry **)p1;2020const struct dir_entry *e2 = *(const struct dir_entry **)p2;20212022returnname_compare(e1->name, e1->len, e2->name, e2->len);2023}20242025/* check if *out lexically strictly contains *in */2026intcheck_dir_entry_contains(const struct dir_entry *out,const struct dir_entry *in)2027{2028return(out->len < in->len) &&2029(out->name[out->len -1] =='/') &&2030!memcmp(out->name, in->name, out->len);2031}20322033static inttreat_leading_path(struct dir_struct *dir,2034struct index_state *istate,2035const char*path,int len,2036const struct pathspec *pathspec)2037{2038struct strbuf sb = STRBUF_INIT;2039int baselen, rc =0;2040const char*cp;2041int old_flags = dir->flags;20422043while(len && path[len -1] =='/')2044 len--;2045if(!len)2046return1;2047 baselen =0;2048 dir->flags &= ~DIR_SHOW_OTHER_DIRECTORIES;2049while(1) {2050 cp = path + baselen + !!baselen;2051 cp =memchr(cp,'/', path + len - cp);2052if(!cp)2053 baselen = len;2054else2055 baselen = cp - path;2056strbuf_setlen(&sb,0);2057strbuf_add(&sb, path, baselen);2058if(!is_directory(sb.buf))2059break;2060if(simplify_away(sb.buf, sb.len, pathspec))2061break;2062if(treat_one_path(dir, NULL, istate, &sb, baselen, pathspec,2063 DT_DIR, NULL) == path_none)2064break;/* do not recurse into it */2065if(len <= baselen) {2066 rc =1;2067break;/* finished checking */2068}2069}2070strbuf_release(&sb);2071 dir->flags = old_flags;2072return rc;2073}20742075static const char*get_ident_string(void)2076{2077static struct strbuf sb = STRBUF_INIT;2078struct utsname uts;20792080if(sb.len)2081return sb.buf;2082if(uname(&uts) <0)2083die_errno(_("failed to get kernel name and information"));2084strbuf_addf(&sb,"Location%s, system%s",get_git_work_tree(),2085 uts.sysname);2086return sb.buf;2087}20882089static intident_in_untracked(const struct untracked_cache *uc)2090{2091/*2092 * Previous git versions may have saved many NUL separated2093 * strings in the "ident" field, but it is insane to manage2094 * many locations, so just take care of the first one.2095 */20962097return!strcmp(uc->ident.buf,get_ident_string());2098}20992100static voidset_untracked_ident(struct untracked_cache *uc)2101{2102strbuf_reset(&uc->ident);2103strbuf_addstr(&uc->ident,get_ident_string());21042105/*2106 * This strbuf used to contain a list of NUL separated2107 * strings, so save NUL too for backward compatibility.2108 */2109strbuf_addch(&uc->ident,0);2110}21112112static voidnew_untracked_cache(struct index_state *istate)2113{2114struct untracked_cache *uc =xcalloc(1,sizeof(*uc));2115strbuf_init(&uc->ident,100);2116 uc->exclude_per_dir =".gitignore";2117/* should be the same flags used by git-status */2118 uc->dir_flags = DIR_SHOW_OTHER_DIRECTORIES | DIR_HIDE_EMPTY_DIRECTORIES;2119set_untracked_ident(uc);2120 istate->untracked = uc;2121 istate->cache_changed |= UNTRACKED_CHANGED;2122}21232124voidadd_untracked_cache(struct index_state *istate)2125{2126if(!istate->untracked) {2127new_untracked_cache(istate);2128}else{2129if(!ident_in_untracked(istate->untracked)) {2130free_untracked_cache(istate->untracked);2131new_untracked_cache(istate);2132}2133}2134}21352136voidremove_untracked_cache(struct index_state *istate)2137{2138if(istate->untracked) {2139free_untracked_cache(istate->untracked);2140 istate->untracked = NULL;2141 istate->cache_changed |= UNTRACKED_CHANGED;2142}2143}21442145static struct untracked_cache_dir *validate_untracked_cache(struct dir_struct *dir,2146int base_len,2147const struct pathspec *pathspec)2148{2149struct untracked_cache_dir *root;2150static int untracked_cache_disabled = -1;21512152if(!dir->untracked)2153return NULL;2154if(untracked_cache_disabled <0)2155 untracked_cache_disabled =git_env_bool("GIT_DISABLE_UNTRACKED_CACHE",0);2156if(untracked_cache_disabled)2157return NULL;21582159/*2160 * We only support $GIT_DIR/info/exclude and core.excludesfile2161 * as the global ignore rule files. Any other additions2162 * (e.g. from command line) invalidate the cache. This2163 * condition also catches running setup_standard_excludes()2164 * before setting dir->untracked!2165 */2166if(dir->unmanaged_exclude_files)2167return NULL;21682169/*2170 * Optimize for the main use case only: whole-tree git2171 * status. More work involved in treat_leading_path() if we2172 * use cache on just a subset of the worktree. pathspec2173 * support could make the matter even worse.2174 */2175if(base_len || (pathspec && pathspec->nr))2176return NULL;21772178/* Different set of flags may produce different results */2179if(dir->flags != dir->untracked->dir_flags ||2180/*2181 * See treat_directory(), case index_nonexistent. Without2182 * this flag, we may need to also cache .git file content2183 * for the resolve_gitlink_ref() call, which we don't.2184 */2185!(dir->flags & DIR_SHOW_OTHER_DIRECTORIES) ||2186/* We don't support collecting ignore files */2187(dir->flags & (DIR_SHOW_IGNORED | DIR_SHOW_IGNORED_TOO |2188 DIR_COLLECT_IGNORED)))2189return NULL;21902191/*2192 * If we use .gitignore in the cache and now you change it to2193 * .gitexclude, everything will go wrong.2194 */2195if(dir->exclude_per_dir != dir->untracked->exclude_per_dir &&2196strcmp(dir->exclude_per_dir, dir->untracked->exclude_per_dir))2197return NULL;21982199/*2200 * EXC_CMDL is not considered in the cache. If people set it,2201 * skip the cache.2202 */2203if(dir->exclude_list_group[EXC_CMDL].nr)2204return NULL;22052206if(!ident_in_untracked(dir->untracked)) {2207warning(_("untracked cache is disabled on this system or location"));2208return NULL;2209}22102211if(!dir->untracked->root) {2212const int len =sizeof(*dir->untracked->root);2213 dir->untracked->root =xmalloc(len);2214memset(dir->untracked->root,0, len);2215}22162217/* Validate $GIT_DIR/info/exclude and core.excludesfile */2218 root = dir->untracked->root;2219if(!oideq(&dir->ss_info_exclude.oid,2220&dir->untracked->ss_info_exclude.oid)) {2221invalidate_gitignore(dir->untracked, root);2222 dir->untracked->ss_info_exclude = dir->ss_info_exclude;2223}2224if(!oideq(&dir->ss_excludes_file.oid,2225&dir->untracked->ss_excludes_file.oid)) {2226invalidate_gitignore(dir->untracked, root);2227 dir->untracked->ss_excludes_file = dir->ss_excludes_file;2228}22292230/* Make sure this directory is not dropped out at saving phase */2231 root->recurse =1;2232return root;2233}22342235intread_directory(struct dir_struct *dir,struct index_state *istate,2236const char*path,int len,const struct pathspec *pathspec)2237{2238struct untracked_cache_dir *untracked;22392240trace_performance_enter();22412242if(has_symlink_leading_path(path, len)) {2243trace_performance_leave("read directory %.*s", len, path);2244return dir->nr;2245}22462247 untracked =validate_untracked_cache(dir, len, pathspec);2248if(!untracked)2249/*2250 * make sure untracked cache code path is disabled,2251 * e.g. prep_exclude()2252 */2253 dir->untracked = NULL;2254if(!len ||treat_leading_path(dir, istate, path, len, pathspec))2255read_directory_recursive(dir, istate, path, len, untracked,0,0, pathspec);2256QSORT(dir->entries, dir->nr, cmp_dir_entry);2257QSORT(dir->ignored, dir->ignored_nr, cmp_dir_entry);22582259/*2260 * If DIR_SHOW_IGNORED_TOO is set, read_directory_recursive() will2261 * also pick up untracked contents of untracked dirs; by default2262 * we discard these, but given DIR_KEEP_UNTRACKED_CONTENTS we do not.2263 */2264if((dir->flags & DIR_SHOW_IGNORED_TOO) &&2265!(dir->flags & DIR_KEEP_UNTRACKED_CONTENTS)) {2266int i, j;22672268/* remove from dir->entries untracked contents of untracked dirs */2269for(i = j =0; j < dir->nr; j++) {2270if(i &&2271check_dir_entry_contains(dir->entries[i -1], dir->entries[j])) {2272FREE_AND_NULL(dir->entries[j]);2273}else{2274 dir->entries[i++] = dir->entries[j];2275}2276}22772278 dir->nr = i;2279}22802281trace_performance_leave("read directory %.*s", len, path);2282if(dir->untracked) {2283static int force_untracked_cache = -1;2284static struct trace_key trace_untracked_stats =TRACE_KEY_INIT(UNTRACKED_STATS);22852286if(force_untracked_cache <0)2287 force_untracked_cache =2288git_env_bool("GIT_FORCE_UNTRACKED_CACHE",0);2289trace_printf_key(&trace_untracked_stats,2290"node creation:%u\n"2291"gitignore invalidation:%u\n"2292"directory invalidation:%u\n"2293"opendir:%u\n",2294 dir->untracked->dir_created,2295 dir->untracked->gitignore_invalidated,2296 dir->untracked->dir_invalidated,2297 dir->untracked->dir_opened);2298if(force_untracked_cache &&2299 dir->untracked == istate->untracked &&2300(dir->untracked->dir_opened ||2301 dir->untracked->gitignore_invalidated ||2302 dir->untracked->dir_invalidated))2303 istate->cache_changed |= UNTRACKED_CHANGED;2304if(dir->untracked != istate->untracked) {2305FREE_AND_NULL(dir->untracked);2306}2307}2308return dir->nr;2309}23102311intfile_exists(const char*f)2312{2313struct stat sb;2314returnlstat(f, &sb) ==0;2315}23162317static intcmp_icase(char a,char b)2318{2319if(a == b)2320return0;2321if(ignore_case)2322returntoupper(a) -toupper(b);2323return a - b;2324}23252326/*2327 * Given two normalized paths (a trailing slash is ok), if subdir is2328 * outside dir, return -1. Otherwise return the offset in subdir that2329 * can be used as relative path to dir.2330 */2331intdir_inside_of(const char*subdir,const char*dir)2332{2333int offset =0;23342335assert(dir && subdir && *dir && *subdir);23362337while(*dir && *subdir && !cmp_icase(*dir, *subdir)) {2338 dir++;2339 subdir++;2340 offset++;2341}23422343/* hel[p]/me vs hel[l]/yeah */2344if(*dir && *subdir)2345return-1;23462347if(!*subdir)2348return!*dir ? offset : -1;/* same dir */23492350/* foo/[b]ar vs foo/[] */2351if(is_dir_sep(dir[-1]))2352returnis_dir_sep(subdir[-1]) ? offset : -1;23532354/* foo[/]bar vs foo[] */2355returnis_dir_sep(*subdir) ? offset +1: -1;2356}23572358intis_inside_dir(const char*dir)2359{2360char*cwd;2361int rc;23622363if(!dir)2364return0;23652366 cwd =xgetcwd();2367 rc = (dir_inside_of(cwd, dir) >=0);2368free(cwd);2369return rc;2370}23712372intis_empty_dir(const char*path)2373{2374DIR*dir =opendir(path);2375struct dirent *e;2376int ret =1;23772378if(!dir)2379return0;23802381while((e =readdir(dir)) != NULL)2382if(!is_dot_or_dotdot(e->d_name)) {2383 ret =0;2384break;2385}23862387closedir(dir);2388return ret;2389}23902391static intremove_dir_recurse(struct strbuf *path,int flag,int*kept_up)2392{2393DIR*dir;2394struct dirent *e;2395int ret =0, original_len = path->len, len, kept_down =0;2396int only_empty = (flag & REMOVE_DIR_EMPTY_ONLY);2397int keep_toplevel = (flag & REMOVE_DIR_KEEP_TOPLEVEL);2398struct object_id submodule_head;23992400if((flag & REMOVE_DIR_KEEP_NESTED_GIT) &&2401!resolve_gitlink_ref(path->buf,"HEAD", &submodule_head)) {2402/* Do not descend and nuke a nested git work tree. */2403if(kept_up)2404*kept_up =1;2405return0;2406}24072408 flag &= ~REMOVE_DIR_KEEP_TOPLEVEL;2409 dir =opendir(path->buf);2410if(!dir) {2411if(errno == ENOENT)2412return keep_toplevel ? -1:0;2413else if(errno == EACCES && !keep_toplevel)2414/*2415 * An empty dir could be removable even if it2416 * is unreadable:2417 */2418returnrmdir(path->buf);2419else2420return-1;2421}2422strbuf_complete(path,'/');24232424 len = path->len;2425while((e =readdir(dir)) != NULL) {2426struct stat st;2427if(is_dot_or_dotdot(e->d_name))2428continue;24292430strbuf_setlen(path, len);2431strbuf_addstr(path, e->d_name);2432if(lstat(path->buf, &st)) {2433if(errno == ENOENT)2434/*2435 * file disappeared, which is what we2436 * wanted anyway2437 */2438continue;2439/* fall thru */2440}else if(S_ISDIR(st.st_mode)) {2441if(!remove_dir_recurse(path, flag, &kept_down))2442continue;/* happy */2443}else if(!only_empty &&2444(!unlink(path->buf) || errno == ENOENT)) {2445continue;/* happy, too */2446}24472448/* path too long, stat fails, or non-directory still exists */2449 ret = -1;2450break;2451}2452closedir(dir);24532454strbuf_setlen(path, original_len);2455if(!ret && !keep_toplevel && !kept_down)2456 ret = (!rmdir(path->buf) || errno == ENOENT) ?0: -1;2457else if(kept_up)2458/*2459 * report the uplevel that it is not an error that we2460 * did not rmdir() our directory.2461 */2462*kept_up = !ret;2463return ret;2464}24652466intremove_dir_recursively(struct strbuf *path,int flag)2467{2468returnremove_dir_recurse(path, flag, NULL);2469}24702471staticGIT_PATH_FUNC(git_path_info_exclude,"info/exclude")24722473voidsetup_standard_excludes(struct dir_struct *dir)2474{2475 dir->exclude_per_dir =".gitignore";24762477/* core.excludesfile defaulting to $XDG_CONFIG_HOME/git/ignore */2478if(!excludes_file)2479 excludes_file =xdg_config_home("ignore");2480if(excludes_file && !access_or_warn(excludes_file, R_OK,0))2481add_excludes_from_file_1(dir, excludes_file,2482 dir->untracked ? &dir->ss_excludes_file : NULL);24832484/* per repository user preference */2485if(startup_info->have_repository) {2486const char*path =git_path_info_exclude();2487if(!access_or_warn(path, R_OK,0))2488add_excludes_from_file_1(dir, path,2489 dir->untracked ? &dir->ss_info_exclude : NULL);2490}2491}24922493intremove_path(const char*name)2494{2495char*slash;24962497if(unlink(name) && !is_missing_file_error(errno))2498return-1;24992500 slash =strrchr(name,'/');2501if(slash) {2502char*dirs =xstrdup(name);2503 slash = dirs + (slash - name);2504do{2505*slash ='\0';2506}while(rmdir(dirs) ==0&& (slash =strrchr(dirs,'/')));2507free(dirs);2508}2509return0;2510}25112512/*2513 * Frees memory within dir which was allocated for exclude lists and2514 * the exclude_stack. Does not free dir itself.2515 */2516voidclear_directory(struct dir_struct *dir)2517{2518int i, j;2519struct exclude_list_group *group;2520struct exclude_list *el;2521struct exclude_stack *stk;25222523for(i = EXC_CMDL; i <= EXC_FILE; i++) {2524 group = &dir->exclude_list_group[i];2525for(j =0; j < group->nr; j++) {2526 el = &group->el[j];2527if(i == EXC_DIRS)2528free((char*)el->src);2529clear_exclude_list(el);2530}2531free(group->el);2532}25332534 stk = dir->exclude_stack;2535while(stk) {2536struct exclude_stack *prev = stk->prev;2537free(stk);2538 stk = prev;2539}2540strbuf_release(&dir->basebuf);2541}25422543struct ondisk_untracked_cache {2544struct stat_data info_exclude_stat;2545struct stat_data excludes_file_stat;2546uint32_t dir_flags;2547};25482549#define ouc_offset(x) offsetof(struct ondisk_untracked_cache, x)25502551struct write_data {2552int index;/* number of written untracked_cache_dir */2553struct ewah_bitmap *check_only;/* from untracked_cache_dir */2554struct ewah_bitmap *valid;/* from untracked_cache_dir */2555struct ewah_bitmap *sha1_valid;/* set if exclude_sha1 is not null */2556struct strbuf out;2557struct strbuf sb_stat;2558struct strbuf sb_sha1;2559};25602561static voidstat_data_to_disk(struct stat_data *to,const struct stat_data *from)2562{2563 to->sd_ctime.sec =htonl(from->sd_ctime.sec);2564 to->sd_ctime.nsec =htonl(from->sd_ctime.nsec);2565 to->sd_mtime.sec =htonl(from->sd_mtime.sec);2566 to->sd_mtime.nsec =htonl(from->sd_mtime.nsec);2567 to->sd_dev =htonl(from->sd_dev);2568 to->sd_ino =htonl(from->sd_ino);2569 to->sd_uid =htonl(from->sd_uid);2570 to->sd_gid =htonl(from->sd_gid);2571 to->sd_size =htonl(from->sd_size);2572}25732574static voidwrite_one_dir(struct untracked_cache_dir *untracked,2575struct write_data *wd)2576{2577struct stat_data stat_data;2578struct strbuf *out = &wd->out;2579unsigned char intbuf[16];2580unsigned int intlen, value;2581int i = wd->index++;25822583/*2584 * untracked_nr should be reset whenever valid is clear, but2585 * for safety..2586 */2587if(!untracked->valid) {2588 untracked->untracked_nr =0;2589 untracked->check_only =0;2590}25912592if(untracked->check_only)2593ewah_set(wd->check_only, i);2594if(untracked->valid) {2595ewah_set(wd->valid, i);2596stat_data_to_disk(&stat_data, &untracked->stat_data);2597strbuf_add(&wd->sb_stat, &stat_data,sizeof(stat_data));2598}2599if(!is_null_oid(&untracked->exclude_oid)) {2600ewah_set(wd->sha1_valid, i);2601strbuf_add(&wd->sb_sha1, untracked->exclude_oid.hash,2602 the_hash_algo->rawsz);2603}26042605 intlen =encode_varint(untracked->untracked_nr, intbuf);2606strbuf_add(out, intbuf, intlen);26072608/* skip non-recurse directories */2609for(i =0, value =0; i < untracked->dirs_nr; i++)2610if(untracked->dirs[i]->recurse)2611 value++;2612 intlen =encode_varint(value, intbuf);2613strbuf_add(out, intbuf, intlen);26142615strbuf_add(out, untracked->name,strlen(untracked->name) +1);26162617for(i =0; i < untracked->untracked_nr; i++)2618strbuf_add(out, untracked->untracked[i],2619strlen(untracked->untracked[i]) +1);26202621for(i =0; i < untracked->dirs_nr; i++)2622if(untracked->dirs[i]->recurse)2623write_one_dir(untracked->dirs[i], wd);2624}26252626voidwrite_untracked_extension(struct strbuf *out,struct untracked_cache *untracked)2627{2628struct ondisk_untracked_cache *ouc;2629struct write_data wd;2630unsigned char varbuf[16];2631int varint_len;2632const unsigned hashsz = the_hash_algo->rawsz;26332634 ouc =xcalloc(1,sizeof(*ouc));2635stat_data_to_disk(&ouc->info_exclude_stat, &untracked->ss_info_exclude.stat);2636stat_data_to_disk(&ouc->excludes_file_stat, &untracked->ss_excludes_file.stat);2637 ouc->dir_flags =htonl(untracked->dir_flags);26382639 varint_len =encode_varint(untracked->ident.len, varbuf);2640strbuf_add(out, varbuf, varint_len);2641strbuf_addbuf(out, &untracked->ident);26422643strbuf_add(out, ouc,sizeof(*ouc));2644strbuf_add(out, untracked->ss_info_exclude.oid.hash, hashsz);2645strbuf_add(out, untracked->ss_excludes_file.oid.hash, hashsz);2646strbuf_add(out, untracked->exclude_per_dir,strlen(untracked->exclude_per_dir) +1);2647FREE_AND_NULL(ouc);26482649if(!untracked->root) {2650 varint_len =encode_varint(0, varbuf);2651strbuf_add(out, varbuf, varint_len);2652return;2653}26542655 wd.index =0;2656 wd.check_only =ewah_new();2657 wd.valid =ewah_new();2658 wd.sha1_valid =ewah_new();2659strbuf_init(&wd.out,1024);2660strbuf_init(&wd.sb_stat,1024);2661strbuf_init(&wd.sb_sha1,1024);2662write_one_dir(untracked->root, &wd);26632664 varint_len =encode_varint(wd.index, varbuf);2665strbuf_add(out, varbuf, varint_len);2666strbuf_addbuf(out, &wd.out);2667ewah_serialize_strbuf(wd.valid, out);2668ewah_serialize_strbuf(wd.check_only, out);2669ewah_serialize_strbuf(wd.sha1_valid, out);2670strbuf_addbuf(out, &wd.sb_stat);2671strbuf_addbuf(out, &wd.sb_sha1);2672strbuf_addch(out,'\0');/* safe guard for string lists */26732674ewah_free(wd.valid);2675ewah_free(wd.check_only);2676ewah_free(wd.sha1_valid);2677strbuf_release(&wd.out);2678strbuf_release(&wd.sb_stat);2679strbuf_release(&wd.sb_sha1);2680}26812682static voidfree_untracked(struct untracked_cache_dir *ucd)2683{2684int i;2685if(!ucd)2686return;2687for(i =0; i < ucd->dirs_nr; i++)2688free_untracked(ucd->dirs[i]);2689for(i =0; i < ucd->untracked_nr; i++)2690free(ucd->untracked[i]);2691free(ucd->untracked);2692free(ucd->dirs);2693free(ucd);2694}26952696voidfree_untracked_cache(struct untracked_cache *uc)2697{2698if(uc)2699free_untracked(uc->root);2700free(uc);2701}27022703struct read_data {2704int index;2705struct untracked_cache_dir **ucd;2706struct ewah_bitmap *check_only;2707struct ewah_bitmap *valid;2708struct ewah_bitmap *sha1_valid;2709const unsigned char*data;2710const unsigned char*end;2711};27122713static voidstat_data_from_disk(struct stat_data *to,const unsigned char*data)2714{2715memcpy(to, data,sizeof(*to));2716 to->sd_ctime.sec =ntohl(to->sd_ctime.sec);2717 to->sd_ctime.nsec =ntohl(to->sd_ctime.nsec);2718 to->sd_mtime.sec =ntohl(to->sd_mtime.sec);2719 to->sd_mtime.nsec =ntohl(to->sd_mtime.nsec);2720 to->sd_dev =ntohl(to->sd_dev);2721 to->sd_ino =ntohl(to->sd_ino);2722 to->sd_uid =ntohl(to->sd_uid);2723 to->sd_gid =ntohl(to->sd_gid);2724 to->sd_size =ntohl(to->sd_size);2725}27262727static intread_one_dir(struct untracked_cache_dir **untracked_,2728struct read_data *rd)2729{2730struct untracked_cache_dir ud, *untracked;2731const unsigned char*next, *data = rd->data, *end = rd->end;2732unsigned int value;2733int i, len;27342735memset(&ud,0,sizeof(ud));27362737 next = data;2738 value =decode_varint(&next);2739if(next > end)2740return-1;2741 ud.recurse =1;2742 ud.untracked_alloc = value;2743 ud.untracked_nr = value;2744if(ud.untracked_nr)2745ALLOC_ARRAY(ud.untracked, ud.untracked_nr);2746 data = next;27472748 next = data;2749 ud.dirs_alloc = ud.dirs_nr =decode_varint(&next);2750if(next > end)2751return-1;2752ALLOC_ARRAY(ud.dirs, ud.dirs_nr);2753 data = next;27542755 len =strlen((const char*)data);2756 next = data + len +1;2757if(next > rd->end)2758return-1;2759*untracked_ = untracked =xmalloc(st_add3(sizeof(*untracked), len,1));2760memcpy(untracked, &ud,sizeof(ud));2761memcpy(untracked->name, data, len +1);2762 data = next;27632764for(i =0; i < untracked->untracked_nr; i++) {2765 len =strlen((const char*)data);2766 next = data + len +1;2767if(next > rd->end)2768return-1;2769 untracked->untracked[i] =xstrdup((const char*)data);2770 data = next;2771}27722773 rd->ucd[rd->index++] = untracked;2774 rd->data = data;27752776for(i =0; i < untracked->dirs_nr; i++) {2777 len =read_one_dir(untracked->dirs + i, rd);2778if(len <0)2779return-1;2780}2781return0;2782}27832784static voidset_check_only(size_t pos,void*cb)2785{2786struct read_data *rd = cb;2787struct untracked_cache_dir *ud = rd->ucd[pos];2788 ud->check_only =1;2789}27902791static voidread_stat(size_t pos,void*cb)2792{2793struct read_data *rd = cb;2794struct untracked_cache_dir *ud = rd->ucd[pos];2795if(rd->data +sizeof(struct stat_data) > rd->end) {2796 rd->data = rd->end +1;2797return;2798}2799stat_data_from_disk(&ud->stat_data, rd->data);2800 rd->data +=sizeof(struct stat_data);2801 ud->valid =1;2802}28032804static voidread_oid(size_t pos,void*cb)2805{2806struct read_data *rd = cb;2807struct untracked_cache_dir *ud = rd->ucd[pos];2808if(rd->data + the_hash_algo->rawsz > rd->end) {2809 rd->data = rd->end +1;2810return;2811}2812hashcpy(ud->exclude_oid.hash, rd->data);2813 rd->data += the_hash_algo->rawsz;2814}28152816static voidload_oid_stat(struct oid_stat *oid_stat,const unsigned char*data,2817const unsigned char*sha1)2818{2819stat_data_from_disk(&oid_stat->stat, data);2820hashcpy(oid_stat->oid.hash, sha1);2821 oid_stat->valid =1;2822}28232824struct untracked_cache *read_untracked_extension(const void*data,unsigned long sz)2825{2826struct untracked_cache *uc;2827struct read_data rd;2828const unsigned char*next = data, *end = (const unsigned char*)data + sz;2829const char*ident;2830int ident_len;2831 ssize_t len;2832const char*exclude_per_dir;2833const unsigned hashsz = the_hash_algo->rawsz;2834const unsigned offset =sizeof(struct ondisk_untracked_cache);2835const unsigned exclude_per_dir_offset = offset +2* hashsz;28362837if(sz <=1|| end[-1] !='\0')2838return NULL;2839 end--;28402841 ident_len =decode_varint(&next);2842if(next + ident_len > end)2843return NULL;2844 ident = (const char*)next;2845 next += ident_len;28462847if(next + exclude_per_dir_offset +1> end)2848return NULL;28492850 uc =xcalloc(1,sizeof(*uc));2851strbuf_init(&uc->ident, ident_len);2852strbuf_add(&uc->ident, ident, ident_len);2853load_oid_stat(&uc->ss_info_exclude,2854 next +ouc_offset(info_exclude_stat),2855 next + offset);2856load_oid_stat(&uc->ss_excludes_file,2857 next +ouc_offset(excludes_file_stat),2858 next + offset + hashsz);2859 uc->dir_flags =get_be32(next +ouc_offset(dir_flags));2860 exclude_per_dir = (const char*)next + exclude_per_dir_offset;2861 uc->exclude_per_dir =xstrdup(exclude_per_dir);2862/* NUL after exclude_per_dir is covered by sizeof(*ouc) */2863 next += exclude_per_dir_offset +strlen(exclude_per_dir) +1;2864if(next >= end)2865goto done2;28662867 len =decode_varint(&next);2868if(next > end || len ==0)2869goto done2;28702871 rd.valid =ewah_new();2872 rd.check_only =ewah_new();2873 rd.sha1_valid =ewah_new();2874 rd.data = next;2875 rd.end = end;2876 rd.index =0;2877ALLOC_ARRAY(rd.ucd, len);28782879if(read_one_dir(&uc->root, &rd) || rd.index != len)2880goto done;28812882 next = rd.data;2883 len =ewah_read_mmap(rd.valid, next, end - next);2884if(len <0)2885goto done;28862887 next += len;2888 len =ewah_read_mmap(rd.check_only, next, end - next);2889if(len <0)2890goto done;28912892 next += len;2893 len =ewah_read_mmap(rd.sha1_valid, next, end - next);2894if(len <0)2895goto done;28962897ewah_each_bit(rd.check_only, set_check_only, &rd);2898 rd.data = next + len;2899ewah_each_bit(rd.valid, read_stat, &rd);2900ewah_each_bit(rd.sha1_valid, read_oid, &rd);2901 next = rd.data;29022903done:2904free(rd.ucd);2905ewah_free(rd.valid);2906ewah_free(rd.check_only);2907ewah_free(rd.sha1_valid);2908done2:2909if(next != end) {2910free_untracked_cache(uc);2911 uc = NULL;2912}2913return uc;2914}29152916static voidinvalidate_one_directory(struct untracked_cache *uc,2917struct untracked_cache_dir *ucd)2918{2919 uc->dir_invalidated++;2920 ucd->valid =0;2921 ucd->untracked_nr =0;2922}29232924/*2925 * Normally when an entry is added or removed from a directory,2926 * invalidating that directory is enough. No need to touch its2927 * ancestors. When a directory is shown as "foo/bar/" in git-status2928 * however, deleting or adding an entry may have cascading effect.2929 *2930 * Say the "foo/bar/file" has become untracked, we need to tell the2931 * untracked_cache_dir of "foo" that "bar/" is not an untracked2932 * directory any more (because "bar" is managed by foo as an untracked2933 * "file").2934 *2935 * Similarly, if "foo/bar/file" moves from untracked to tracked and it2936 * was the last untracked entry in the entire "foo", we should show2937 * "foo/" instead. Which means we have to invalidate past "bar" up to2938 * "foo".2939 *2940 * This function traverses all directories from root to leaf. If there2941 * is a chance of one of the above cases happening, we invalidate back2942 * to root. Otherwise we just invalidate the leaf. There may be a more2943 * sophisticated way than checking for SHOW_OTHER_DIRECTORIES to2944 * detect these cases and avoid unnecessary invalidation, for example,2945 * checking for the untracked entry named "bar/" in "foo", but for now2946 * stick to something safe and simple.2947 */2948static intinvalidate_one_component(struct untracked_cache *uc,2949struct untracked_cache_dir *dir,2950const char*path,int len)2951{2952const char*rest =strchr(path,'/');29532954if(rest) {2955int component_len = rest - path;2956struct untracked_cache_dir *d =2957lookup_untracked(uc, dir, path, component_len);2958int ret =2959invalidate_one_component(uc, d, rest +1,2960 len - (component_len +1));2961if(ret)2962invalidate_one_directory(uc, dir);2963return ret;2964}29652966invalidate_one_directory(uc, dir);2967return uc->dir_flags & DIR_SHOW_OTHER_DIRECTORIES;2968}29692970voiduntracked_cache_invalidate_path(struct index_state *istate,2971const char*path,int safe_path)2972{2973if(!istate->untracked || !istate->untracked->root)2974return;2975if(!safe_path && !verify_path(path,0))2976return;2977invalidate_one_component(istate->untracked, istate->untracked->root,2978 path,strlen(path));2979}29802981voiduntracked_cache_remove_from_index(struct index_state *istate,2982const char*path)2983{2984untracked_cache_invalidate_path(istate, path,1);2985}29862987voiduntracked_cache_add_to_index(struct index_state *istate,2988const char*path)2989{2990untracked_cache_invalidate_path(istate, path,1);2991}29922993static voidconnect_wt_gitdir_in_nested(const char*sub_worktree,2994const char*sub_gitdir)2995{2996int i;2997struct repository subrepo;2998struct strbuf sub_wt = STRBUF_INIT;2999struct strbuf sub_gd = STRBUF_INIT;30003001const struct submodule *sub;30023003/* If the submodule has no working tree, we can ignore it. */3004if(repo_init(&subrepo, sub_gitdir, sub_worktree))3005return;30063007if(repo_read_index(&subrepo) <0)3008die(_("index file corrupt in repo%s"), subrepo.gitdir);30093010for(i =0; i < subrepo.index->cache_nr; i++) {3011const struct cache_entry *ce = subrepo.index->cache[i];30123013if(!S_ISGITLINK(ce->ce_mode))3014continue;30153016while(i +1< subrepo.index->cache_nr &&3017!strcmp(ce->name, subrepo.index->cache[i +1]->name))3018/*3019 * Skip entries with the same name in different stages3020 * to make sure an entry is returned only once.3021 */3022 i++;30233024 sub =submodule_from_path(&subrepo, &null_oid, ce->name);3025if(!sub || !is_submodule_active(&subrepo, ce->name))3026/* .gitmodules broken or inactive sub */3027continue;30283029strbuf_reset(&sub_wt);3030strbuf_reset(&sub_gd);3031strbuf_addf(&sub_wt,"%s/%s", sub_worktree, sub->path);3032strbuf_addf(&sub_gd,"%s/modules/%s", sub_gitdir, sub->name);30333034connect_work_tree_and_git_dir(sub_wt.buf, sub_gd.buf,1);3035}3036strbuf_release(&sub_wt);3037strbuf_release(&sub_gd);3038repo_clear(&subrepo);3039}30403041voidconnect_work_tree_and_git_dir(const char*work_tree_,3042const char*git_dir_,3043int recurse_into_nested)3044{3045struct strbuf gitfile_sb = STRBUF_INIT;3046struct strbuf cfg_sb = STRBUF_INIT;3047struct strbuf rel_path = STRBUF_INIT;3048char*git_dir, *work_tree;30493050/* Prepare .git file */3051strbuf_addf(&gitfile_sb,"%s/.git", work_tree_);3052if(safe_create_leading_directories_const(gitfile_sb.buf))3053die(_("could not create directories for%s"), gitfile_sb.buf);30543055/* Prepare config file */3056strbuf_addf(&cfg_sb,"%s/config", git_dir_);3057if(safe_create_leading_directories_const(cfg_sb.buf))3058die(_("could not create directories for%s"), cfg_sb.buf);30593060 git_dir =real_pathdup(git_dir_,1);3061 work_tree =real_pathdup(work_tree_,1);30623063/* Write .git file */3064write_file(gitfile_sb.buf,"gitdir:%s",3065relative_path(git_dir, work_tree, &rel_path));3066/* Update core.worktree setting */3067git_config_set_in_file(cfg_sb.buf,"core.worktree",3068relative_path(work_tree, git_dir, &rel_path));30693070strbuf_release(&gitfile_sb);3071strbuf_release(&cfg_sb);3072strbuf_release(&rel_path);30733074if(recurse_into_nested)3075connect_wt_gitdir_in_nested(work_tree, git_dir);30763077free(work_tree);3078free(git_dir);3079}30803081/*3082 * Migrate the git directory of the given path from old_git_dir to new_git_dir.3083 */3084voidrelocate_gitdir(const char*path,const char*old_git_dir,const char*new_git_dir)3085{3086if(rename(old_git_dir, new_git_dir) <0)3087die_errno(_("could not migrate git directory from '%s' to '%s'"),3088 old_git_dir, new_git_dir);30893090connect_work_tree_and_git_dir(path, new_git_dir,0);3091}