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"dir.h" 12#include"refs.h" 13#include"wildmatch.h" 14 15struct path_simplify { 16int len; 17const char*path; 18}; 19 20/* 21 * Tells read_directory_recursive how a file or directory should be treated. 22 * Values are ordered by significance, e.g. if a directory contains both 23 * excluded and untracked files, it is listed as untracked because 24 * path_untracked > path_excluded. 25 */ 26enum path_treatment { 27 path_none =0, 28 path_recurse, 29 path_excluded, 30 path_untracked 31}; 32 33static enum path_treatment read_directory_recursive(struct dir_struct *dir, 34const char*path,int len, 35int check_only,const struct path_simplify *simplify); 36static intget_dtype(struct dirent *de,const char*path,int len); 37 38/* helper string functions with support for the ignore_case flag */ 39intstrcmp_icase(const char*a,const char*b) 40{ 41return ignore_case ?strcasecmp(a, b) :strcmp(a, b); 42} 43 44intstrncmp_icase(const char*a,const char*b,size_t count) 45{ 46return ignore_case ?strncasecmp(a, b, count) :strncmp(a, b, count); 47} 48 49intfnmatch_icase(const char*pattern,const char*string,int flags) 50{ 51returnfnmatch(pattern, string, flags | (ignore_case ? FNM_CASEFOLD :0)); 52} 53 54inlineintgit_fnmatch(const char*pattern,const char*string, 55int flags,int prefix) 56{ 57int fnm_flags =0; 58if(flags & GFNM_PATHNAME) 59 fnm_flags |= FNM_PATHNAME; 60if(prefix >0) { 61if(strncmp(pattern, string, prefix)) 62return FNM_NOMATCH; 63 pattern += prefix; 64 string += prefix; 65} 66if(flags & GFNM_ONESTAR) { 67int pattern_len =strlen(++pattern); 68int string_len =strlen(string); 69return string_len < pattern_len || 70strcmp(pattern, 71 string + string_len - pattern_len); 72} 73returnfnmatch(pattern, string, fnm_flags); 74} 75 76static intfnmatch_icase_mem(const char*pattern,int patternlen, 77const char*string,int stringlen, 78int flags) 79{ 80int match_status; 81struct strbuf pat_buf = STRBUF_INIT; 82struct strbuf str_buf = STRBUF_INIT; 83const char*use_pat = pattern; 84const char*use_str = string; 85 86if(pattern[patternlen]) { 87strbuf_add(&pat_buf, pattern, patternlen); 88 use_pat = pat_buf.buf; 89} 90if(string[stringlen]) { 91strbuf_add(&str_buf, string, stringlen); 92 use_str = str_buf.buf; 93} 94 95if(ignore_case) 96 flags |= WM_CASEFOLD; 97 match_status =wildmatch(use_pat, use_str, flags, NULL); 98 99strbuf_release(&pat_buf); 100strbuf_release(&str_buf); 101 102return match_status; 103} 104 105static size_tcommon_prefix_len(const char**pathspec) 106{ 107const char*n, *first; 108size_t max =0; 109int literal =limit_pathspec_to_literal(); 110 111if(!pathspec) 112return max; 113 114 first = *pathspec; 115while((n = *pathspec++)) { 116size_t i, len =0; 117for(i =0; first == n || i < max; i++) { 118char c = n[i]; 119if(!c || c != first[i] || (!literal &&is_glob_special(c))) 120break; 121if(c =='/') 122 len = i +1; 123} 124if(first == n || len < max) { 125 max = len; 126if(!max) 127break; 128} 129} 130return max; 131} 132 133/* 134 * Returns a copy of the longest leading path common among all 135 * pathspecs. 136 */ 137char*common_prefix(const char**pathspec) 138{ 139unsigned long len =common_prefix_len(pathspec); 140 141return len ?xmemdupz(*pathspec, len) : NULL; 142} 143 144intfill_directory(struct dir_struct *dir,const char**pathspec) 145{ 146size_t len; 147 148/* 149 * Calculate common prefix for the pathspec, and 150 * use that to optimize the directory walk 151 */ 152 len =common_prefix_len(pathspec); 153 154/* Read the directory and prune it */ 155read_directory(dir, pathspec ? *pathspec :"", len, pathspec); 156return len; 157} 158 159intwithin_depth(const char*name,int namelen, 160int depth,int max_depth) 161{ 162const char*cp = name, *cpe = name + namelen; 163 164while(cp < cpe) { 165if(*cp++ !='/') 166continue; 167 depth++; 168if(depth > max_depth) 169return0; 170} 171return1; 172} 173 174/* 175 * Does 'match' match the given name? 176 * A match is found if 177 * 178 * (1) the 'match' string is leading directory of 'name', or 179 * (2) the 'match' string is a wildcard and matches 'name', or 180 * (3) the 'match' string is exactly the same as 'name'. 181 * 182 * and the return value tells which case it was. 183 * 184 * It returns 0 when there is no match. 185 */ 186static intmatch_one(const char*match,const char*name,int namelen) 187{ 188int matchlen; 189int literal =limit_pathspec_to_literal(); 190 191/* If the match was just the prefix, we matched */ 192if(!*match) 193return MATCHED_RECURSIVELY; 194 195if(ignore_case) { 196for(;;) { 197unsigned char c1 =tolower(*match); 198unsigned char c2 =tolower(*name); 199if(c1 =='\0'|| (!literal &&is_glob_special(c1))) 200break; 201if(c1 != c2) 202return0; 203 match++; 204 name++; 205 namelen--; 206} 207}else{ 208for(;;) { 209unsigned char c1 = *match; 210unsigned char c2 = *name; 211if(c1 =='\0'|| (!literal &&is_glob_special(c1))) 212break; 213if(c1 != c2) 214return0; 215 match++; 216 name++; 217 namelen--; 218} 219} 220 221/* 222 * If we don't match the matchstring exactly, 223 * we need to match by fnmatch 224 */ 225 matchlen =strlen(match); 226if(strncmp_icase(match, name, matchlen)) { 227if(literal) 228return0; 229return!fnmatch_icase(match, name,0) ? MATCHED_FNMATCH :0; 230} 231 232if(namelen == matchlen) 233return MATCHED_EXACTLY; 234if(match[matchlen-1] =='/'|| name[matchlen] =='/') 235return MATCHED_RECURSIVELY; 236return0; 237} 238 239/* 240 * Given a name and a list of pathspecs, returns the nature of the 241 * closest (i.e. most specific) match of the name to any of the 242 * pathspecs. 243 * 244 * The caller typically calls this multiple times with the same 245 * pathspec and seen[] array but with different name/namelen 246 * (e.g. entries from the index) and is interested in seeing if and 247 * how each pathspec matches all the names it calls this function 248 * with. A mark is left in the seen[] array for each pathspec element 249 * indicating the closest type of match that element achieved, so if 250 * seen[n] remains zero after multiple invocations, that means the nth 251 * pathspec did not match any names, which could indicate that the 252 * user mistyped the nth pathspec. 253 */ 254intmatch_pathspec(const char**pathspec,const char*name,int namelen, 255int prefix,char*seen) 256{ 257int i, retval =0; 258 259if(!pathspec) 260return1; 261 262 name += prefix; 263 namelen -= prefix; 264 265for(i =0; pathspec[i] != NULL; i++) { 266int how; 267const char*match = pathspec[i] + prefix; 268if(seen && seen[i] == MATCHED_EXACTLY) 269continue; 270 how =match_one(match, name, namelen); 271if(how) { 272if(retval < how) 273 retval = how; 274if(seen && seen[i] < how) 275 seen[i] = how; 276} 277} 278return retval; 279} 280 281/* 282 * Does 'match' match the given name? 283 * A match is found if 284 * 285 * (1) the 'match' string is leading directory of 'name', or 286 * (2) the 'match' string is a wildcard and matches 'name', or 287 * (3) the 'match' string is exactly the same as 'name'. 288 * 289 * and the return value tells which case it was. 290 * 291 * It returns 0 when there is no match. 292 */ 293static intmatch_pathspec_item(const struct pathspec_item *item,int prefix, 294const char*name,int namelen) 295{ 296/* name/namelen has prefix cut off by caller */ 297const char*match = item->match + prefix; 298int matchlen = item->len - prefix; 299 300/* If the match was just the prefix, we matched */ 301if(!*match) 302return MATCHED_RECURSIVELY; 303 304if(matchlen <= namelen && !strncmp(match, name, matchlen)) { 305if(matchlen == namelen) 306return MATCHED_EXACTLY; 307 308if(match[matchlen-1] =='/'|| name[matchlen] =='/') 309return MATCHED_RECURSIVELY; 310} 311 312if(item->nowildcard_len < item->len && 313!git_fnmatch(match, name, 314 item->flags & PATHSPEC_ONESTAR ? GFNM_ONESTAR :0, 315 item->nowildcard_len - prefix)) 316return MATCHED_FNMATCH; 317 318return0; 319} 320 321/* 322 * Given a name and a list of pathspecs, returns the nature of the 323 * closest (i.e. most specific) match of the name to any of the 324 * pathspecs. 325 * 326 * The caller typically calls this multiple times with the same 327 * pathspec and seen[] array but with different name/namelen 328 * (e.g. entries from the index) and is interested in seeing if and 329 * how each pathspec matches all the names it calls this function 330 * with. A mark is left in the seen[] array for each pathspec element 331 * indicating the closest type of match that element achieved, so if 332 * seen[n] remains zero after multiple invocations, that means the nth 333 * pathspec did not match any names, which could indicate that the 334 * user mistyped the nth pathspec. 335 */ 336intmatch_pathspec_depth(const struct pathspec *ps, 337const char*name,int namelen, 338int prefix,char*seen) 339{ 340int i, retval =0; 341 342if(!ps->nr) { 343if(!ps->recursive || ps->max_depth == -1) 344return MATCHED_RECURSIVELY; 345 346if(within_depth(name, namelen,0, ps->max_depth)) 347return MATCHED_EXACTLY; 348else 349return0; 350} 351 352 name += prefix; 353 namelen -= prefix; 354 355for(i = ps->nr -1; i >=0; i--) { 356int how; 357if(seen && seen[i] == MATCHED_EXACTLY) 358continue; 359 how =match_pathspec_item(ps->items+i, prefix, name, namelen); 360if(ps->recursive && ps->max_depth != -1&& 361 how && how != MATCHED_FNMATCH) { 362int len = ps->items[i].len; 363if(name[len] =='/') 364 len++; 365if(within_depth(name+len, namelen-len,0, ps->max_depth)) 366 how = MATCHED_EXACTLY; 367else 368 how =0; 369} 370if(how) { 371if(retval < how) 372 retval = how; 373if(seen && seen[i] < how) 374 seen[i] = how; 375} 376} 377return retval; 378} 379 380/* 381 * Return the length of the "simple" part of a path match limiter. 382 */ 383static intsimple_length(const char*match) 384{ 385int len = -1; 386 387for(;;) { 388unsigned char c = *match++; 389 len++; 390if(c =='\0'||is_glob_special(c)) 391return len; 392} 393} 394 395static intno_wildcard(const char*string) 396{ 397return string[simple_length(string)] =='\0'; 398} 399 400voidparse_exclude_pattern(const char**pattern, 401int*patternlen, 402int*flags, 403int*nowildcardlen) 404{ 405const char*p = *pattern; 406size_t i, len; 407 408*flags =0; 409if(*p =='!') { 410*flags |= EXC_FLAG_NEGATIVE; 411 p++; 412} 413 len =strlen(p); 414if(len && p[len -1] =='/') { 415 len--; 416*flags |= EXC_FLAG_MUSTBEDIR; 417} 418for(i =0; i < len; i++) { 419if(p[i] =='/') 420break; 421} 422if(i == len) 423*flags |= EXC_FLAG_NODIR; 424*nowildcardlen =simple_length(p); 425/* 426 * we should have excluded the trailing slash from 'p' too, 427 * but that's one more allocation. Instead just make sure 428 * nowildcardlen does not exceed real patternlen 429 */ 430if(*nowildcardlen > len) 431*nowildcardlen = len; 432if(*p =='*'&&no_wildcard(p +1)) 433*flags |= EXC_FLAG_ENDSWITH; 434*pattern = p; 435*patternlen = len; 436} 437 438voidadd_exclude(const char*string,const char*base, 439int baselen,struct exclude_list *el,int srcpos) 440{ 441struct exclude *x; 442int patternlen; 443int flags; 444int nowildcardlen; 445 446parse_exclude_pattern(&string, &patternlen, &flags, &nowildcardlen); 447if(flags & EXC_FLAG_MUSTBEDIR) { 448char*s; 449 x =xmalloc(sizeof(*x) + patternlen +1); 450 s = (char*)(x+1); 451memcpy(s, string, patternlen); 452 s[patternlen] ='\0'; 453 x->pattern = s; 454}else{ 455 x =xmalloc(sizeof(*x)); 456 x->pattern = string; 457} 458 x->patternlen = patternlen; 459 x->nowildcardlen = nowildcardlen; 460 x->base = base; 461 x->baselen = baselen; 462 x->flags = flags; 463 x->srcpos = srcpos; 464ALLOC_GROW(el->excludes, el->nr +1, el->alloc); 465 el->excludes[el->nr++] = x; 466 x->el = el; 467} 468 469static void*read_skip_worktree_file_from_index(const char*path,size_t*size) 470{ 471int pos, len; 472unsigned long sz; 473enum object_type type; 474void*data; 475 476 len =strlen(path); 477 pos =cache_name_pos(path, len); 478if(pos <0) 479return NULL; 480if(!ce_skip_worktree(active_cache[pos])) 481return NULL; 482 data =read_sha1_file(active_cache[pos]->sha1, &type, &sz); 483if(!data || type != OBJ_BLOB) { 484free(data); 485return NULL; 486} 487*size =xsize_t(sz); 488return data; 489} 490 491/* 492 * Frees memory within el which was allocated for exclude patterns and 493 * the file buffer. Does not free el itself. 494 */ 495voidclear_exclude_list(struct exclude_list *el) 496{ 497int i; 498 499for(i =0; i < el->nr; i++) 500free(el->excludes[i]); 501free(el->excludes); 502free(el->filebuf); 503 504 el->nr =0; 505 el->excludes = NULL; 506 el->filebuf = NULL; 507} 508 509intadd_excludes_from_file_to_list(const char*fname, 510const char*base, 511int baselen, 512struct exclude_list *el, 513int check_index) 514{ 515struct stat st; 516int fd, i, lineno =1; 517size_t size =0; 518char*buf, *entry; 519 520 fd =open(fname, O_RDONLY); 521if(fd <0||fstat(fd, &st) <0) { 522if(errno != ENOENT) 523warn_on_inaccessible(fname); 524if(0<= fd) 525close(fd); 526if(!check_index || 527(buf =read_skip_worktree_file_from_index(fname, &size)) == NULL) 528return-1; 529if(size ==0) { 530free(buf); 531return0; 532} 533if(buf[size-1] !='\n') { 534 buf =xrealloc(buf, size+1); 535 buf[size++] ='\n'; 536} 537} 538else{ 539 size =xsize_t(st.st_size); 540if(size ==0) { 541close(fd); 542return0; 543} 544 buf =xmalloc(size+1); 545if(read_in_full(fd, buf, size) != size) { 546free(buf); 547close(fd); 548return-1; 549} 550 buf[size++] ='\n'; 551close(fd); 552} 553 554 el->filebuf = buf; 555 entry = buf; 556for(i =0; i < size; i++) { 557if(buf[i] =='\n') { 558if(entry != buf + i && entry[0] !='#') { 559 buf[i - (i && buf[i-1] =='\r')] =0; 560add_exclude(entry, base, baselen, el, lineno); 561} 562 lineno++; 563 entry = buf + i +1; 564} 565} 566return0; 567} 568 569struct exclude_list *add_exclude_list(struct dir_struct *dir, 570int group_type,const char*src) 571{ 572struct exclude_list *el; 573struct exclude_list_group *group; 574 575 group = &dir->exclude_list_group[group_type]; 576ALLOC_GROW(group->el, group->nr +1, group->alloc); 577 el = &group->el[group->nr++]; 578memset(el,0,sizeof(*el)); 579 el->src = src; 580return el; 581} 582 583/* 584 * Used to set up core.excludesfile and .git/info/exclude lists. 585 */ 586voidadd_excludes_from_file(struct dir_struct *dir,const char*fname) 587{ 588struct exclude_list *el; 589 el =add_exclude_list(dir, EXC_FILE, fname); 590if(add_excludes_from_file_to_list(fname,"",0, el,0) <0) 591die("cannot use%sas an exclude file", fname); 592} 593 594intmatch_basename(const char*basename,int basenamelen, 595const char*pattern,int prefix,int patternlen, 596int flags) 597{ 598if(prefix == patternlen) { 599if(patternlen == basenamelen && 600!strncmp_icase(pattern, basename, basenamelen)) 601return1; 602}else if(flags & EXC_FLAG_ENDSWITH) { 603/* "*literal" matching against "fooliteral" */ 604if(patternlen -1<= basenamelen && 605!strncmp_icase(pattern +1, 606 basename + basenamelen - (patternlen -1), 607 patternlen -1)) 608return1; 609}else{ 610if(fnmatch_icase_mem(pattern, patternlen, 611 basename, basenamelen, 6120) ==0) 613return1; 614} 615return0; 616} 617 618intmatch_pathname(const char*pathname,int pathlen, 619const char*base,int baselen, 620const char*pattern,int prefix,int patternlen, 621int flags) 622{ 623const char*name; 624int namelen; 625 626/* 627 * match with FNM_PATHNAME; the pattern has base implicitly 628 * in front of it. 629 */ 630if(*pattern =='/') { 631 pattern++; 632 patternlen--; 633 prefix--; 634} 635 636/* 637 * baselen does not count the trailing slash. base[] may or 638 * may not end with a trailing slash though. 639 */ 640if(pathlen < baselen +1|| 641(baselen && pathname[baselen] !='/') || 642strncmp_icase(pathname, base, baselen)) 643return0; 644 645 namelen = baselen ? pathlen - baselen -1: pathlen; 646 name = pathname + pathlen - namelen; 647 648if(prefix) { 649/* 650 * if the non-wildcard part is longer than the 651 * remaining pathname, surely it cannot match. 652 */ 653if(prefix > namelen) 654return0; 655 656if(strncmp_icase(pattern, name, prefix)) 657return0; 658 pattern += prefix; 659 patternlen -= prefix; 660 name += prefix; 661 namelen -= prefix; 662 663/* 664 * If the whole pattern did not have a wildcard, 665 * then our prefix match is all we need; we 666 * do not need to call fnmatch at all. 667 */ 668if(!patternlen && !namelen) 669return1; 670} 671 672returnfnmatch_icase_mem(pattern, patternlen, 673 name, namelen, 674 WM_PATHNAME) ==0; 675} 676 677/* 678 * Scan the given exclude list in reverse to see whether pathname 679 * should be ignored. The first match (i.e. the last on the list), if 680 * any, determines the fate. Returns the exclude_list element which 681 * matched, or NULL for undecided. 682 */ 683static struct exclude *last_exclude_matching_from_list(const char*pathname, 684int pathlen, 685const char*basename, 686int*dtype, 687struct exclude_list *el) 688{ 689int i; 690 691if(!el->nr) 692return NULL;/* undefined */ 693 694for(i = el->nr -1;0<= i; i--) { 695struct exclude *x = el->excludes[i]; 696const char*exclude = x->pattern; 697int prefix = x->nowildcardlen; 698 699if(x->flags & EXC_FLAG_MUSTBEDIR) { 700if(*dtype == DT_UNKNOWN) 701*dtype =get_dtype(NULL, pathname, pathlen); 702if(*dtype != DT_DIR) 703continue; 704} 705 706if(x->flags & EXC_FLAG_NODIR) { 707if(match_basename(basename, 708 pathlen - (basename - pathname), 709 exclude, prefix, x->patternlen, 710 x->flags)) 711return x; 712continue; 713} 714 715assert(x->baselen ==0|| x->base[x->baselen -1] =='/'); 716if(match_pathname(pathname, pathlen, 717 x->base, x->baselen ? x->baselen -1:0, 718 exclude, prefix, x->patternlen, x->flags)) 719return x; 720} 721return NULL;/* undecided */ 722} 723 724/* 725 * Scan the list and let the last match determine the fate. 726 * Return 1 for exclude, 0 for include and -1 for undecided. 727 */ 728intis_excluded_from_list(const char*pathname, 729int pathlen,const char*basename,int*dtype, 730struct exclude_list *el) 731{ 732struct exclude *exclude; 733 exclude =last_exclude_matching_from_list(pathname, pathlen, basename, dtype, el); 734if(exclude) 735return exclude->flags & EXC_FLAG_NEGATIVE ?0:1; 736return-1;/* undecided */ 737} 738 739static struct exclude *last_exclude_matching_from_lists(struct dir_struct *dir, 740const char*pathname,int pathlen,const char*basename, 741int*dtype_p) 742{ 743int i, j; 744struct exclude_list_group *group; 745struct exclude *exclude; 746for(i = EXC_CMDL; i <= EXC_FILE; i++) { 747 group = &dir->exclude_list_group[i]; 748for(j = group->nr -1; j >=0; j--) { 749 exclude =last_exclude_matching_from_list( 750 pathname, pathlen, basename, dtype_p, 751&group->el[j]); 752if(exclude) 753return exclude; 754} 755} 756return NULL; 757} 758 759/* 760 * Loads the per-directory exclude list for the substring of base 761 * which has a char length of baselen. 762 */ 763static voidprep_exclude(struct dir_struct *dir,const char*base,int baselen) 764{ 765struct exclude_list_group *group; 766struct exclude_list *el; 767struct exclude_stack *stk = NULL; 768int current; 769 770 group = &dir->exclude_list_group[EXC_DIRS]; 771 772/* Pop the exclude lists from the EXCL_DIRS exclude_list_group 773 * which originate from directories not in the prefix of the 774 * path being checked. */ 775while((stk = dir->exclude_stack) != NULL) { 776if(stk->baselen <= baselen && 777!strncmp(dir->basebuf, base, stk->baselen)) 778break; 779 el = &group->el[dir->exclude_stack->exclude_ix]; 780 dir->exclude_stack = stk->prev; 781 dir->exclude = NULL; 782free((char*)el->src);/* see strdup() below */ 783clear_exclude_list(el); 784free(stk); 785 group->nr--; 786} 787 788/* Skip traversing into sub directories if the parent is excluded */ 789if(dir->exclude) 790return; 791 792/* Read from the parent directories and push them down. */ 793 current = stk ? stk->baselen : -1; 794while(current < baselen) { 795struct exclude_stack *stk =xcalloc(1,sizeof(*stk)); 796const char*cp; 797 798if(current <0) { 799 cp = base; 800 current =0; 801} 802else{ 803 cp =strchr(base + current +1,'/'); 804if(!cp) 805die("oops in prep_exclude"); 806 cp++; 807} 808 stk->prev = dir->exclude_stack; 809 stk->baselen = cp - base; 810 stk->exclude_ix = group->nr; 811 el =add_exclude_list(dir, EXC_DIRS, NULL); 812memcpy(dir->basebuf + current, base + current, 813 stk->baselen - current); 814 815/* Abort if the directory is excluded */ 816if(stk->baselen) { 817int dt = DT_DIR; 818 dir->basebuf[stk->baselen -1] =0; 819 dir->exclude =last_exclude_matching_from_lists(dir, 820 dir->basebuf, stk->baselen -1, 821 dir->basebuf + current, &dt); 822 dir->basebuf[stk->baselen -1] ='/'; 823if(dir->exclude) { 824 dir->basebuf[stk->baselen] =0; 825 dir->exclude_stack = stk; 826return; 827} 828} 829 830/* Try to read per-directory file unless path is too long */ 831if(dir->exclude_per_dir && 832 stk->baselen +strlen(dir->exclude_per_dir) < PATH_MAX) { 833strcpy(dir->basebuf + stk->baselen, 834 dir->exclude_per_dir); 835/* 836 * dir->basebuf gets reused by the traversal, but we 837 * need fname to remain unchanged to ensure the src 838 * member of each struct exclude correctly 839 * back-references its source file. Other invocations 840 * of add_exclude_list provide stable strings, so we 841 * strdup() and free() here in the caller. 842 */ 843 el->src =strdup(dir->basebuf); 844add_excludes_from_file_to_list(dir->basebuf, 845 dir->basebuf, stk->baselen, el,1); 846} 847 dir->exclude_stack = stk; 848 current = stk->baselen; 849} 850 dir->basebuf[baselen] ='\0'; 851} 852 853/* 854 * Loads the exclude lists for the directory containing pathname, then 855 * scans all exclude lists to determine whether pathname is excluded. 856 * Returns the exclude_list element which matched, or NULL for 857 * undecided. 858 */ 859struct exclude *last_exclude_matching(struct dir_struct *dir, 860const char*pathname, 861int*dtype_p) 862{ 863int pathlen =strlen(pathname); 864const char*basename =strrchr(pathname,'/'); 865 basename = (basename) ? basename+1: pathname; 866 867prep_exclude(dir, pathname, basename-pathname); 868 869if(dir->exclude) 870return dir->exclude; 871 872returnlast_exclude_matching_from_lists(dir, pathname, pathlen, 873 basename, dtype_p); 874} 875 876/* 877 * Loads the exclude lists for the directory containing pathname, then 878 * scans all exclude lists to determine whether pathname is excluded. 879 * Returns 1 if true, otherwise 0. 880 */ 881intis_excluded(struct dir_struct *dir,const char*pathname,int*dtype_p) 882{ 883struct exclude *exclude = 884last_exclude_matching(dir, pathname, dtype_p); 885if(exclude) 886return exclude->flags & EXC_FLAG_NEGATIVE ?0:1; 887return0; 888} 889 890static struct dir_entry *dir_entry_new(const char*pathname,int len) 891{ 892struct dir_entry *ent; 893 894 ent =xmalloc(sizeof(*ent) + len +1); 895 ent->len = len; 896memcpy(ent->name, pathname, len); 897 ent->name[len] =0; 898return ent; 899} 900 901static struct dir_entry *dir_add_name(struct dir_struct *dir,const char*pathname,int len) 902{ 903if(cache_name_exists(pathname, len, ignore_case)) 904return NULL; 905 906ALLOC_GROW(dir->entries, dir->nr+1, dir->alloc); 907return dir->entries[dir->nr++] =dir_entry_new(pathname, len); 908} 909 910struct dir_entry *dir_add_ignored(struct dir_struct *dir,const char*pathname,int len) 911{ 912if(!cache_name_is_other(pathname, len)) 913return NULL; 914 915ALLOC_GROW(dir->ignored, dir->ignored_nr+1, dir->ignored_alloc); 916return dir->ignored[dir->ignored_nr++] =dir_entry_new(pathname, len); 917} 918 919enum exist_status { 920 index_nonexistent =0, 921 index_directory, 922 index_gitdir 923}; 924 925/* 926 * Do not use the alphabetically sorted index to look up 927 * the directory name; instead, use the case insensitive 928 * name hash. 929 */ 930static enum exist_status directory_exists_in_index_icase(const char*dirname,int len) 931{ 932struct cache_entry *ce =cache_name_exists(dirname, len +1, ignore_case); 933unsigned char endchar; 934 935if(!ce) 936return index_nonexistent; 937 endchar = ce->name[len]; 938 939/* 940 * The cache_entry structure returned will contain this dirname 941 * and possibly additional path components. 942 */ 943if(endchar =='/') 944return index_directory; 945 946/* 947 * If there are no additional path components, then this cache_entry 948 * represents a submodule. Submodules, despite being directories, 949 * are stored in the cache without a closing slash. 950 */ 951if(!endchar &&S_ISGITLINK(ce->ce_mode)) 952return index_gitdir; 953 954/* This should never be hit, but it exists just in case. */ 955return index_nonexistent; 956} 957 958/* 959 * The index sorts alphabetically by entry name, which 960 * means that a gitlink sorts as '\0' at the end, while 961 * a directory (which is defined not as an entry, but as 962 * the files it contains) will sort with the '/' at the 963 * end. 964 */ 965static enum exist_status directory_exists_in_index(const char*dirname,int len) 966{ 967int pos; 968 969if(ignore_case) 970returndirectory_exists_in_index_icase(dirname, len); 971 972 pos =cache_name_pos(dirname, len); 973if(pos <0) 974 pos = -pos-1; 975while(pos < active_nr) { 976struct cache_entry *ce = active_cache[pos++]; 977unsigned char endchar; 978 979if(strncmp(ce->name, dirname, len)) 980break; 981 endchar = ce->name[len]; 982if(endchar >'/') 983break; 984if(endchar =='/') 985return index_directory; 986if(!endchar &&S_ISGITLINK(ce->ce_mode)) 987return index_gitdir; 988} 989return index_nonexistent; 990} 991 992/* 993 * When we find a directory when traversing the filesystem, we 994 * have three distinct cases: 995 * 996 * - ignore it 997 * - see it as a directory 998 * - recurse into it 999 *1000 * and which one we choose depends on a combination of existing1001 * git index contents and the flags passed into the directory1002 * traversal routine.1003 *1004 * Case 1: If we *already* have entries in the index under that1005 * directory name, we always recurse into the directory to see1006 * all the files.1007 *1008 * Case 2: If we *already* have that directory name as a gitlink,1009 * we always continue to see it as a gitlink, regardless of whether1010 * there is an actual git directory there or not (it might not1011 * be checked out as a subproject!)1012 *1013 * Case 3: if we didn't have it in the index previously, we1014 * have a few sub-cases:1015 *1016 * (a) if "show_other_directories" is true, we show it as1017 * just a directory, unless "hide_empty_directories" is1018 * also true, in which case we need to check if it contains any1019 * untracked and / or ignored files.1020 * (b) if it looks like a git directory, and we don't have1021 * 'no_gitlinks' set we treat it as a gitlink, and show it1022 * as a directory.1023 * (c) otherwise, we recurse into it.1024 */1025static enum path_treatment treat_directory(struct dir_struct *dir,1026const char*dirname,int len,int exclude,1027const struct path_simplify *simplify)1028{1029/* The "len-1" is to strip the final '/' */1030switch(directory_exists_in_index(dirname, len-1)) {1031case index_directory:1032return path_recurse;10331034case index_gitdir:1035if(dir->flags & DIR_SHOW_OTHER_DIRECTORIES)1036return path_none;1037return path_untracked;10381039case index_nonexistent:1040if(dir->flags & DIR_SHOW_OTHER_DIRECTORIES)1041break;1042if(!(dir->flags & DIR_NO_GITLINKS)) {1043unsigned char sha1[20];1044if(resolve_gitlink_ref(dirname,"HEAD", sha1) ==0)1045return path_untracked;1046}1047return path_recurse;1048}10491050/* This is the "show_other_directories" case */10511052if(!(dir->flags & DIR_HIDE_EMPTY_DIRECTORIES))1053return exclude ? path_excluded : path_untracked;10541055returnread_directory_recursive(dir, dirname, len,1, simplify);1056}10571058/*1059 * This is an inexact early pruning of any recursive directory1060 * reading - if the path cannot possibly be in the pathspec,1061 * return true, and we'll skip it early.1062 */1063static intsimplify_away(const char*path,int pathlen,const struct path_simplify *simplify)1064{1065if(simplify) {1066for(;;) {1067const char*match = simplify->path;1068int len = simplify->len;10691070if(!match)1071break;1072if(len > pathlen)1073 len = pathlen;1074if(!memcmp(path, match, len))1075return0;1076 simplify++;1077}1078return1;1079}1080return0;1081}10821083/*1084 * This function tells us whether an excluded path matches a1085 * list of "interesting" pathspecs. That is, whether a path matched1086 * by any of the pathspecs could possibly be ignored by excluding1087 * the specified path. This can happen if:1088 *1089 * 1. the path is mentioned explicitly in the pathspec1090 *1091 * 2. the path is a directory prefix of some element in the1092 * pathspec1093 */1094static intexclude_matches_pathspec(const char*path,int len,1095const struct path_simplify *simplify)1096{1097if(simplify) {1098for(; simplify->path; simplify++) {1099if(len == simplify->len1100&& !memcmp(path, simplify->path, len))1101return1;1102if(len < simplify->len1103&& simplify->path[len] =='/'1104&& !memcmp(path, simplify->path, len))1105return1;1106}1107}1108return0;1109}11101111static intget_index_dtype(const char*path,int len)1112{1113int pos;1114struct cache_entry *ce;11151116 ce =cache_name_exists(path, len,0);1117if(ce) {1118if(!ce_uptodate(ce))1119return DT_UNKNOWN;1120if(S_ISGITLINK(ce->ce_mode))1121return DT_DIR;1122/*1123 * Nobody actually cares about the1124 * difference between DT_LNK and DT_REG1125 */1126return DT_REG;1127}11281129/* Try to look it up as a directory */1130 pos =cache_name_pos(path, len);1131if(pos >=0)1132return DT_UNKNOWN;1133 pos = -pos-1;1134while(pos < active_nr) {1135 ce = active_cache[pos++];1136if(strncmp(ce->name, path, len))1137break;1138if(ce->name[len] >'/')1139break;1140if(ce->name[len] <'/')1141continue;1142if(!ce_uptodate(ce))1143break;/* continue? */1144return DT_DIR;1145}1146return DT_UNKNOWN;1147}11481149static intget_dtype(struct dirent *de,const char*path,int len)1150{1151int dtype = de ?DTYPE(de) : DT_UNKNOWN;1152struct stat st;11531154if(dtype != DT_UNKNOWN)1155return dtype;1156 dtype =get_index_dtype(path, len);1157if(dtype != DT_UNKNOWN)1158return dtype;1159if(lstat(path, &st))1160return dtype;1161if(S_ISREG(st.st_mode))1162return DT_REG;1163if(S_ISDIR(st.st_mode))1164return DT_DIR;1165if(S_ISLNK(st.st_mode))1166return DT_LNK;1167return dtype;1168}11691170static enum path_treatment treat_one_path(struct dir_struct *dir,1171struct strbuf *path,1172const struct path_simplify *simplify,1173int dtype,struct dirent *de)1174{1175int exclude;1176int has_path_in_index = !!cache_name_exists(path->buf, path->len, ignore_case);11771178if(dtype == DT_UNKNOWN)1179 dtype =get_dtype(de, path->buf, path->len);11801181/* Always exclude indexed files */1182if(dtype != DT_DIR && has_path_in_index)1183return path_none;11841185/*1186 * When we are looking at a directory P in the working tree,1187 * there are three cases:1188 *1189 * (1) P exists in the index. Everything inside the directory P in1190 * the working tree needs to go when P is checked out from the1191 * index.1192 *1193 * (2) P does not exist in the index, but there is P/Q in the index.1194 * We know P will stay a directory when we check out the contents1195 * of the index, but we do not know yet if there is a directory1196 * P/Q in the working tree to be killed, so we need to recurse.1197 *1198 * (3) P does not exist in the index, and there is no P/Q in the index1199 * to require P to be a directory, either. Only in this case, we1200 * know that everything inside P will not be killed without1201 * recursing.1202 */1203if((dir->flags & DIR_COLLECT_KILLED_ONLY) &&1204(dtype == DT_DIR) &&1205!has_path_in_index &&1206(directory_exists_in_index(path->buf, path->len) == index_nonexistent))1207return path_none;12081209 exclude =is_excluded(dir, path->buf, &dtype);12101211/*1212 * Excluded? If we don't explicitly want to show1213 * ignored files, ignore it1214 */1215if(exclude && !(dir->flags & (DIR_SHOW_IGNORED|DIR_SHOW_IGNORED_TOO)))1216return path_excluded;12171218switch(dtype) {1219default:1220return path_none;1221case DT_DIR:1222strbuf_addch(path,'/');1223returntreat_directory(dir, path->buf, path->len, exclude,1224 simplify);1225case DT_REG:1226case DT_LNK:1227return exclude ? path_excluded : path_untracked;1228}1229}12301231static enum path_treatment treat_path(struct dir_struct *dir,1232struct dirent *de,1233struct strbuf *path,1234int baselen,1235const struct path_simplify *simplify)1236{1237int dtype;12381239if(is_dot_or_dotdot(de->d_name) || !strcmp(de->d_name,".git"))1240return path_none;1241strbuf_setlen(path, baselen);1242strbuf_addstr(path, de->d_name);1243if(simplify_away(path->buf, path->len, simplify))1244return path_none;12451246 dtype =DTYPE(de);1247returntreat_one_path(dir, path, simplify, dtype, de);1248}12491250/*1251 * Read a directory tree. We currently ignore anything but1252 * directories, regular files and symlinks. That's because git1253 * doesn't handle them at all yet. Maybe that will change some1254 * day.1255 *1256 * Also, we ignore the name ".git" (even if it is not a directory).1257 * That likely will not change.1258 *1259 * Returns the most significant path_treatment value encountered in the scan.1260 */1261static enum path_treatment read_directory_recursive(struct dir_struct *dir,1262const char*base,int baselen,1263int check_only,1264const struct path_simplify *simplify)1265{1266DIR*fdir;1267enum path_treatment state, subdir_state, dir_state = path_none;1268struct dirent *de;1269struct strbuf path = STRBUF_INIT;12701271strbuf_add(&path, base, baselen);12721273 fdir =opendir(path.len ? path.buf :".");1274if(!fdir)1275goto out;12761277while((de =readdir(fdir)) != NULL) {1278/* check how the file or directory should be treated */1279 state =treat_path(dir, de, &path, baselen, simplify);1280if(state > dir_state)1281 dir_state = state;12821283/* recurse into subdir if instructed by treat_path */1284if(state == path_recurse) {1285 subdir_state =read_directory_recursive(dir, path.buf,1286 path.len, check_only, simplify);1287if(subdir_state > dir_state)1288 dir_state = subdir_state;1289}12901291if(check_only) {1292/* abort early if maximum state has been reached */1293if(dir_state == path_untracked)1294break;1295/* skip the dir_add_* part */1296continue;1297}12981299/* add the path to the appropriate result list */1300switch(state) {1301case path_excluded:1302if(dir->flags & DIR_SHOW_IGNORED)1303dir_add_name(dir, path.buf, path.len);1304else if((dir->flags & DIR_SHOW_IGNORED_TOO) ||1305((dir->flags & DIR_COLLECT_IGNORED) &&1306exclude_matches_pathspec(path.buf, path.len,1307 simplify)))1308dir_add_ignored(dir, path.buf, path.len);1309break;13101311case path_untracked:1312if(!(dir->flags & DIR_SHOW_IGNORED))1313dir_add_name(dir, path.buf, path.len);1314break;13151316default:1317break;1318}1319}1320closedir(fdir);1321 out:1322strbuf_release(&path);13231324return dir_state;1325}13261327static intcmp_name(const void*p1,const void*p2)1328{1329const struct dir_entry *e1 = *(const struct dir_entry **)p1;1330const struct dir_entry *e2 = *(const struct dir_entry **)p2;13311332returncache_name_compare(e1->name, e1->len,1333 e2->name, e2->len);1334}13351336static struct path_simplify *create_simplify(const char**pathspec)1337{1338int nr, alloc =0;1339struct path_simplify *simplify = NULL;13401341if(!pathspec)1342return NULL;13431344for(nr =0; ; nr++) {1345const char*match;1346if(nr >= alloc) {1347 alloc =alloc_nr(alloc);1348 simplify =xrealloc(simplify, alloc *sizeof(*simplify));1349}1350 match = *pathspec++;1351if(!match)1352break;1353 simplify[nr].path = match;1354 simplify[nr].len =simple_length(match);1355}1356 simplify[nr].path = NULL;1357 simplify[nr].len =0;1358return simplify;1359}13601361static voidfree_simplify(struct path_simplify *simplify)1362{1363free(simplify);1364}13651366static inttreat_leading_path(struct dir_struct *dir,1367const char*path,int len,1368const struct path_simplify *simplify)1369{1370struct strbuf sb = STRBUF_INIT;1371int baselen, rc =0;1372const char*cp;1373int old_flags = dir->flags;13741375while(len && path[len -1] =='/')1376 len--;1377if(!len)1378return1;1379 baselen =0;1380 dir->flags &= ~DIR_SHOW_OTHER_DIRECTORIES;1381while(1) {1382 cp = path + baselen + !!baselen;1383 cp =memchr(cp,'/', path + len - cp);1384if(!cp)1385 baselen = len;1386else1387 baselen = cp - path;1388strbuf_setlen(&sb,0);1389strbuf_add(&sb, path, baselen);1390if(!is_directory(sb.buf))1391break;1392if(simplify_away(sb.buf, sb.len, simplify))1393break;1394if(treat_one_path(dir, &sb, simplify,1395 DT_DIR, NULL) == path_none)1396break;/* do not recurse into it */1397if(len <= baselen) {1398 rc =1;1399break;/* finished checking */1400}1401}1402strbuf_release(&sb);1403 dir->flags = old_flags;1404return rc;1405}14061407intread_directory(struct dir_struct *dir,const char*path,int len,const char**pathspec)1408{1409struct path_simplify *simplify;14101411if(has_symlink_leading_path(path, len))1412return dir->nr;14131414 simplify =create_simplify(pathspec);1415if(!len ||treat_leading_path(dir, path, len, simplify))1416read_directory_recursive(dir, path, len,0, simplify);1417free_simplify(simplify);1418qsort(dir->entries, dir->nr,sizeof(struct dir_entry *), cmp_name);1419qsort(dir->ignored, dir->ignored_nr,sizeof(struct dir_entry *), cmp_name);1420return dir->nr;1421}14221423intfile_exists(const char*f)1424{1425struct stat sb;1426returnlstat(f, &sb) ==0;1427}14281429/*1430 * Given two normalized paths (a trailing slash is ok), if subdir is1431 * outside dir, return -1. Otherwise return the offset in subdir that1432 * can be used as relative path to dir.1433 */1434intdir_inside_of(const char*subdir,const char*dir)1435{1436int offset =0;14371438assert(dir && subdir && *dir && *subdir);14391440while(*dir && *subdir && *dir == *subdir) {1441 dir++;1442 subdir++;1443 offset++;1444}14451446/* hel[p]/me vs hel[l]/yeah */1447if(*dir && *subdir)1448return-1;14491450if(!*subdir)1451return!*dir ? offset : -1;/* same dir */14521453/* foo/[b]ar vs foo/[] */1454if(is_dir_sep(dir[-1]))1455returnis_dir_sep(subdir[-1]) ? offset : -1;14561457/* foo[/]bar vs foo[] */1458returnis_dir_sep(*subdir) ? offset +1: -1;1459}14601461intis_inside_dir(const char*dir)1462{1463char cwd[PATH_MAX];1464if(!dir)1465return0;1466if(!getcwd(cwd,sizeof(cwd)))1467die_errno("can't find the current directory");1468returndir_inside_of(cwd, dir) >=0;1469}14701471intis_empty_dir(const char*path)1472{1473DIR*dir =opendir(path);1474struct dirent *e;1475int ret =1;14761477if(!dir)1478return0;14791480while((e =readdir(dir)) != NULL)1481if(!is_dot_or_dotdot(e->d_name)) {1482 ret =0;1483break;1484}14851486closedir(dir);1487return ret;1488}14891490static intremove_dir_recurse(struct strbuf *path,int flag,int*kept_up)1491{1492DIR*dir;1493struct dirent *e;1494int ret =0, original_len = path->len, len, kept_down =0;1495int only_empty = (flag & REMOVE_DIR_EMPTY_ONLY);1496int keep_toplevel = (flag & REMOVE_DIR_KEEP_TOPLEVEL);1497unsigned char submodule_head[20];14981499if((flag & REMOVE_DIR_KEEP_NESTED_GIT) &&1500!resolve_gitlink_ref(path->buf,"HEAD", submodule_head)) {1501/* Do not descend and nuke a nested git work tree. */1502if(kept_up)1503*kept_up =1;1504return0;1505}15061507 flag &= ~REMOVE_DIR_KEEP_TOPLEVEL;1508 dir =opendir(path->buf);1509if(!dir) {1510/* an empty dir could be removed even if it is unreadble */1511if(!keep_toplevel)1512returnrmdir(path->buf);1513else1514return-1;1515}1516if(path->buf[original_len -1] !='/')1517strbuf_addch(path,'/');15181519 len = path->len;1520while((e =readdir(dir)) != NULL) {1521struct stat st;1522if(is_dot_or_dotdot(e->d_name))1523continue;15241525strbuf_setlen(path, len);1526strbuf_addstr(path, e->d_name);1527if(lstat(path->buf, &st))1528;/* fall thru */1529else if(S_ISDIR(st.st_mode)) {1530if(!remove_dir_recurse(path, flag, &kept_down))1531continue;/* happy */1532}else if(!only_empty && !unlink(path->buf))1533continue;/* happy, too */15341535/* path too long, stat fails, or non-directory still exists */1536 ret = -1;1537break;1538}1539closedir(dir);15401541strbuf_setlen(path, original_len);1542if(!ret && !keep_toplevel && !kept_down)1543 ret =rmdir(path->buf);1544else if(kept_up)1545/*1546 * report the uplevel that it is not an error that we1547 * did not rmdir() our directory.1548 */1549*kept_up = !ret;1550return ret;1551}15521553intremove_dir_recursively(struct strbuf *path,int flag)1554{1555returnremove_dir_recurse(path, flag, NULL);1556}15571558voidsetup_standard_excludes(struct dir_struct *dir)1559{1560const char*path;1561char*xdg_path;15621563 dir->exclude_per_dir =".gitignore";1564 path =git_path("info/exclude");1565if(!excludes_file) {1566home_config_paths(NULL, &xdg_path,"ignore");1567 excludes_file = xdg_path;1568}1569if(!access_or_warn(path, R_OK))1570add_excludes_from_file(dir, path);1571if(excludes_file && !access_or_warn(excludes_file, R_OK))1572add_excludes_from_file(dir, excludes_file);1573}15741575intremove_path(const char*name)1576{1577char*slash;15781579if(unlink(name) && errno != ENOENT && errno != ENOTDIR)1580return-1;15811582 slash =strrchr(name,'/');1583if(slash) {1584char*dirs =xstrdup(name);1585 slash = dirs + (slash - name);1586do{1587*slash ='\0';1588}while(rmdir(dirs) ==0&& (slash =strrchr(dirs,'/')));1589free(dirs);1590}1591return0;1592}15931594static intpathspec_item_cmp(const void*a_,const void*b_)1595{1596struct pathspec_item *a, *b;15971598 a = (struct pathspec_item *)a_;1599 b = (struct pathspec_item *)b_;1600returnstrcmp(a->match, b->match);1601}16021603intinit_pathspec(struct pathspec *pathspec,const char**paths)1604{1605const char**p = paths;1606int i;16071608memset(pathspec,0,sizeof(*pathspec));1609if(!p)1610return0;1611while(*p)1612 p++;1613 pathspec->raw = paths;1614 pathspec->nr = p - paths;1615if(!pathspec->nr)1616return0;16171618 pathspec->items =xmalloc(sizeof(struct pathspec_item)*pathspec->nr);1619for(i =0; i < pathspec->nr; i++) {1620struct pathspec_item *item = pathspec->items+i;1621const char*path = paths[i];16221623 item->match = path;1624 item->len =strlen(path);1625 item->flags =0;1626if(limit_pathspec_to_literal()) {1627 item->nowildcard_len = item->len;1628}else{1629 item->nowildcard_len =simple_length(path);1630if(item->nowildcard_len < item->len) {1631 pathspec->has_wildcard =1;1632if(path[item->nowildcard_len] =='*'&&1633no_wildcard(path + item->nowildcard_len +1))1634 item->flags |= PATHSPEC_ONESTAR;1635}1636}1637}16381639qsort(pathspec->items, pathspec->nr,1640sizeof(struct pathspec_item), pathspec_item_cmp);16411642return0;1643}16441645voidfree_pathspec(struct pathspec *pathspec)1646{1647free(pathspec->items);1648 pathspec->items = NULL;1649}16501651intlimit_pathspec_to_literal(void)1652{1653static int flag = -1;1654if(flag <0)1655 flag =git_env_bool(GIT_LITERAL_PATHSPECS_ENVIRONMENT,0);1656return flag;1657}16581659/*1660 * Frees memory within dir which was allocated for exclude lists and1661 * the exclude_stack. Does not free dir itself.1662 */1663voidclear_directory(struct dir_struct *dir)1664{1665int i, j;1666struct exclude_list_group *group;1667struct exclude_list *el;1668struct exclude_stack *stk;16691670for(i = EXC_CMDL; i <= EXC_FILE; i++) {1671 group = &dir->exclude_list_group[i];1672for(j =0; j < group->nr; j++) {1673 el = &group->el[j];1674if(i == EXC_DIRS)1675free((char*)el->src);1676clear_exclude_list(el);1677}1678free(group->el);1679}16801681 stk = dir->exclude_stack;1682while(stk) {1683struct exclude_stack *prev = stk->prev;1684free(stk);1685 stk = prev;1686}1687}