Changeset 782 for git/branches/dmik/dir.h
- Timestamp:
- Jun 23, 2014, 9:45:51 PM (11 years ago)
- Location:
- git/branches/dmik
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
git/branches/dmik ¶
- Property svn:mergeinfo changed
/git/vendor/2.0.0 (added) merged: 777 /git/vendor/current merged: 772,774,776
- Property svn:mergeinfo changed
-
TabularUnified git/branches/dmik/dir.h ¶
r626 r782 1 1 #ifndef DIR_H 2 2 #define DIR_H 3 4 /* See Documentation/technical/api-directory-listing.txt */ 5 6 #include "strbuf.h" 3 7 4 8 struct dir_entry { … … 8 12 9 13 #define EXC_FLAG_NODIR 1 10 #define EXC_FLAG_NOWILDCARD 211 14 #define EXC_FLAG_ENDSWITH 4 12 15 #define EXC_FLAG_MUSTBEDIR 8 13 16 #define EXC_FLAG_NEGATIVE 16 17 18 /* 19 * Each excludes file will be parsed into a fresh exclude_list which 20 * is appended to the relevant exclude_list_group (either EXC_DIRS or 21 * EXC_FILE). An exclude_list within the EXC_CMDL exclude_list_group 22 * can also be used to represent the list of --exclude values passed 23 * via CLI args. 24 */ 14 25 struct exclude_list { 15 26 int nr; 16 27 int alloc; 28 29 /* remember pointer to exclude file contents so we can free() */ 30 char *filebuf; 31 32 /* origin of list, e.g. path to filename, or descriptive string */ 33 const char *src; 34 17 35 struct exclude { 36 /* 37 * This allows callers of last_exclude_matching() etc. 38 * to determine the origin of the matching pattern. 39 */ 40 struct exclude_list *el; 41 18 42 const char *pattern; 19 43 int patternlen; 44 int nowildcardlen; 20 45 const char *base; 21 46 int baselen; 22 int to_exclude;23 47 int flags; 48 49 /* 50 * Counting starts from 1 for line numbers in ignore files, 51 * and from -1 decrementing for patterns from CLI args. 52 */ 53 int srcpos; 24 54 } **excludes; 25 55 }; 26 56 57 /* 58 * The contents of the per-directory exclude files are lazily read on 59 * demand and then cached in memory, one per exclude_stack struct, in 60 * order to avoid opening and parsing each one every time that 61 * directory is traversed. 62 */ 27 63 struct exclude_stack { 28 struct exclude_stack *prev; 29 char *filebuf; 64 struct exclude_stack *prev; /* the struct exclude_stack for the parent directory */ 30 65 int baselen; 31 int exclude_ix; 66 int exclude_ix; /* index of exclude_list within EXC_DIRS exclude_list_group */ 67 }; 68 69 struct exclude_list_group { 70 int nr, alloc; 71 struct exclude_list *el; 32 72 }; 33 73 … … 40 80 DIR_HIDE_EMPTY_DIRECTORIES = 1<<2, 41 81 DIR_NO_GITLINKS = 1<<3, 42 DIR_COLLECT_IGNORED = 1<<4 82 DIR_COLLECT_IGNORED = 1<<4, 83 DIR_SHOW_IGNORED_TOO = 1<<5, 84 DIR_COLLECT_KILLED_ONLY = 1<<6 43 85 } flags; 44 86 struct dir_entry **entries; … … 47 89 /* Exclude info */ 48 90 const char *exclude_per_dir; 49 struct exclude_list exclude_list[3]; 91 50 92 /* 51 * We maintain three exclude pattern lists: 93 * We maintain three groups of exclude pattern lists: 94 * 52 95 * EXC_CMDL lists patterns explicitly given on the command line. 53 96 * EXC_DIRS lists patterns obtained from per-directory ignore files. 54 * EXC_FILE lists patterns from fallback ignore files. 97 * EXC_FILE lists patterns from fallback ignore files, e.g. 98 * - .git/info/exclude 99 * - core.excludesfile 100 * 101 * Each group contains multiple exclude lists, a single list 102 * per source. 55 103 */ 56 104 #define EXC_CMDL 0 57 105 #define EXC_DIRS 1 58 106 #define EXC_FILE 2 59 107 struct exclude_list_group exclude_list_group[3]; 108 109 /* 110 * Temporary variables which are used during loading of the 111 * per-directory exclude lists. 112 * 113 * exclude_stack points to the top of the exclude_stack, and 114 * basebuf contains the full path to the current 115 * (sub)directory in the traversal. Exclude points to the 116 * matching exclude struct if the directory is excluded. 117 */ 60 118 struct exclude_stack *exclude_stack; 119 struct exclude *exclude; 61 120 char basebuf[PATH_MAX]; 62 121 }; 63 122 123 /* 124 * The ordering of these constants is significant, with 125 * higher-numbered match types signifying "closer" (i.e. more 126 * specific) matches which will override lower-numbered match types 127 * when populating the seen[] array. 128 */ 64 129 #define MATCHED_RECURSIVELY 1 65 130 #define MATCHED_FNMATCH 2 66 131 #define MATCHED_EXACTLY 3 67 extern char *common_prefix(const char **pathspec); 68 extern int match_pathspec(const char **pathspec, const char *name, int namelen, int prefix, char *seen); 69 extern int match_pathspec_depth(const struct pathspec *pathspec, 70 const char *name, int namelen, 71 int prefix, char *seen); 132 extern int simple_length(const char *match); 133 extern int no_wildcard(const char *string); 134 extern char *common_prefix(const struct pathspec *pathspec); 135 extern int match_pathspec(const struct pathspec *pathspec, 136 const char *name, int namelen, 137 int prefix, char *seen, int is_dir); 72 138 extern int within_depth(const char *name, int namelen, int depth, int max_depth); 73 139 74 extern int fill_directory(struct dir_struct *dir, const char **pathspec); 75 extern int read_directory(struct dir_struct *, const char *path, int len, const char **pathspec); 76 77 extern int excluded_from_list(const char *pathname, int pathlen, const char *basename, 78 int *dtype, struct exclude_list *el); 79 extern int excluded(struct dir_struct *, const char *, int *); 140 extern int fill_directory(struct dir_struct *dir, const struct pathspec *pathspec); 141 extern int read_directory(struct dir_struct *, const char *path, int len, const struct pathspec *pathspec); 142 143 extern int is_excluded_from_list(const char *pathname, int pathlen, const char *basename, 144 int *dtype, struct exclude_list *el); 80 145 struct dir_entry *dir_add_ignored(struct dir_struct *dir, const char *pathname, int len); 146 147 /* 148 * these implement the matching logic for dir.c:excluded_from_list and 149 * attr.c:path_matches() 150 */ 151 extern int match_basename(const char *, int, 152 const char *, int, int, int); 153 extern int match_pathname(const char *, int, 154 const char *, int, 155 const char *, int, int, int); 156 157 extern struct exclude *last_exclude_matching(struct dir_struct *dir, 158 const char *name, int *dtype); 159 160 extern int is_excluded(struct dir_struct *dir, const char *name, int *dtype); 161 162 extern struct exclude_list *add_exclude_list(struct dir_struct *dir, 163 int group_type, const char *src); 81 164 extern int add_excludes_from_file_to_list(const char *fname, const char *base, int baselen, 82 char **buf_p, struct exclude_list *which, int check_index);165 struct exclude_list *el, int check_index); 83 166 extern void add_excludes_from_file(struct dir_struct *, const char *fname); 167 extern void parse_exclude_pattern(const char **string, int *patternlen, int *flags, int *nowildcardlen); 84 168 extern void add_exclude(const char *string, const char *base, 85 int baselen, struct exclude_list *which); 86 extern void free_excludes(struct exclude_list *el); 169 int baselen, struct exclude_list *el, int srcpos); 170 extern void clear_exclude_list(struct exclude_list *el); 171 extern void clear_directory(struct dir_struct *dir); 87 172 extern int file_exists(const char *); 88 173 … … 103 188 #define REMOVE_DIR_EMPTY_ONLY 01 104 189 #define REMOVE_DIR_KEEP_NESTED_GIT 02 190 #define REMOVE_DIR_KEEP_TOPLEVEL 04 105 191 extern int remove_dir_recursively(struct strbuf *path, int flag); 106 192 … … 112 198 extern int fnmatch_icase(const char *pattern, const char *string, int flags); 113 199 200 /* 201 * The prefix part of pattern must not contains wildcards. 202 */ 203 struct pathspec_item; 204 extern int git_fnmatch(const struct pathspec_item *item, 205 const char *pattern, const char *string, 206 int prefix); 207 208 static inline int ce_path_match(const struct cache_entry *ce, 209 const struct pathspec *pathspec, 210 char *seen) 211 { 212 return match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, seen, 213 S_ISDIR(ce->ce_mode) || S_ISGITLINK(ce->ce_mode)); 214 } 215 216 static inline int dir_path_match(const struct dir_entry *ent, 217 const struct pathspec *pathspec, 218 int prefix, char *seen) 219 { 220 int has_trailing_dir = ent->len && ent->name[ent->len - 1] == '/'; 221 int len = has_trailing_dir ? ent->len - 1 : ent->len; 222 return match_pathspec(pathspec, ent->name, len, prefix, seen, 223 has_trailing_dir); 224 } 225 114 226 #endif
Note:
See TracChangeset
for help on using the changeset viewer.