Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 1 | #ifndef DIR_H |
| 2 | #define DIR_H |
| 3 | |
brian m. carlson | 70c369c | 2018-05-02 00:25:48 +0000 | [diff] [blame] | 4 | #include "cache.h" |
Derrick Stolee | 96cc8ab | 2019-11-21 22:04:41 +0000 | [diff] [blame] | 5 | #include "hashmap.h" |
Junio C Hamano | eb41775 | 2012-06-01 11:28:00 -0700 | [diff] [blame] | 6 | #include "strbuf.h" |
| 7 | |
Heba Waly | 266f03e | 2019-11-17 21:04:41 +0000 | [diff] [blame] | 8 | /** |
| 9 | * The directory listing API is used to enumerate paths in the work tree, |
| 10 | * optionally taking `.git/info/exclude` and `.gitignore` files per directory |
| 11 | * into account. |
| 12 | */ |
| 13 | |
| 14 | /** |
| 15 | * Calling sequence |
| 16 | * ---------------- |
| 17 | * |
| 18 | * Note: The index may be checked for .gitignore files that are |
| 19 | * CE_SKIP_WORKTREE marked. If you want to exclude files, make sure you have |
| 20 | * loaded the index first. |
| 21 | * |
Elijah Newren | eceba53 | 2020-08-18 22:58:26 +0000 | [diff] [blame] | 22 | * - Prepare `struct dir_struct dir` using `dir_init()` function. |
Heba Waly | 266f03e | 2019-11-17 21:04:41 +0000 | [diff] [blame] | 23 | * |
| 24 | * - To add single exclude pattern, call `add_pattern_list()` and then |
| 25 | * `add_pattern()`. |
| 26 | * |
| 27 | * - To add patterns from a file (e.g. `.git/info/exclude`), call |
Elijah Newren | eceba53 | 2020-08-18 22:58:26 +0000 | [diff] [blame] | 28 | * `add_patterns_from_file()` , and/or set `dir.exclude_per_dir`. |
Heba Waly | 266f03e | 2019-11-17 21:04:41 +0000 | [diff] [blame] | 29 | * |
Elijah Newren | eceba53 | 2020-08-18 22:58:26 +0000 | [diff] [blame] | 30 | * - A short-hand function `setup_standard_excludes()` can be used to set |
| 31 | * up the standard set of exclude settings, instead of manually calling |
| 32 | * the add_pattern*() family of functions. |
Heba Waly | 266f03e | 2019-11-17 21:04:41 +0000 | [diff] [blame] | 33 | * |
Elijah Newren | eceba53 | 2020-08-18 22:58:26 +0000 | [diff] [blame] | 34 | * - Call `fill_directory()`. |
Heba Waly | 266f03e | 2019-11-17 21:04:41 +0000 | [diff] [blame] | 35 | * |
Elijah Newren | eceba53 | 2020-08-18 22:58:26 +0000 | [diff] [blame] | 36 | * - Use `dir.entries[]` and `dir.ignored[]`. |
Heba Waly | 266f03e | 2019-11-17 21:04:41 +0000 | [diff] [blame] | 37 | * |
Elijah Newren | eceba53 | 2020-08-18 22:58:26 +0000 | [diff] [blame] | 38 | * - Call `dir_clear()` when the contained elements are no longer in use. |
Heba Waly | 266f03e | 2019-11-17 21:04:41 +0000 | [diff] [blame] | 39 | * |
| 40 | */ |
| 41 | |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 42 | struct dir_entry { |
Jeff King | e96980e | 2007-06-12 23:42:14 +0200 | [diff] [blame] | 43 | unsigned int len; |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 44 | char name[FLEX_ARRAY]; /* more */ |
| 45 | }; |
| 46 | |
Derrick Stolee | 4ff89ee | 2019-09-03 11:04:56 -0700 | [diff] [blame] | 47 | #define PATTERN_FLAG_NODIR 1 |
| 48 | #define PATTERN_FLAG_ENDSWITH 4 |
| 49 | #define PATTERN_FLAG_MUSTBEDIR 8 |
| 50 | #define PATTERN_FLAG_NEGATIVE 16 |
Lars Knoll | 68492fc | 2007-10-28 21:27:13 +0100 | [diff] [blame] | 51 | |
Derrick Stolee | ab8db61 | 2019-09-03 11:04:55 -0700 | [diff] [blame] | 52 | struct path_pattern { |
Nguyễn Thái Ngọc Duy | 709359c | 2014-07-14 11:48:03 +0200 | [diff] [blame] | 53 | /* |
Derrick Stolee | 65edd96 | 2019-09-03 11:04:57 -0700 | [diff] [blame] | 54 | * This allows callers of last_matching_pattern() etc. |
Nguyễn Thái Ngọc Duy | 709359c | 2014-07-14 11:48:03 +0200 | [diff] [blame] | 55 | * to determine the origin of the matching pattern. |
| 56 | */ |
Derrick Stolee | caa3d55 | 2019-09-03 11:04:56 -0700 | [diff] [blame] | 57 | struct pattern_list *pl; |
Nguyễn Thái Ngọc Duy | 709359c | 2014-07-14 11:48:03 +0200 | [diff] [blame] | 58 | |
| 59 | const char *pattern; |
| 60 | int patternlen; |
| 61 | int nowildcardlen; |
| 62 | const char *base; |
| 63 | int baselen; |
Derrick Stolee | 4ff89ee | 2019-09-03 11:04:56 -0700 | [diff] [blame] | 64 | unsigned flags; /* PATTERN_FLAG_* */ |
Nguyễn Thái Ngọc Duy | 709359c | 2014-07-14 11:48:03 +0200 | [diff] [blame] | 65 | |
| 66 | /* |
| 67 | * Counting starts from 1 for line numbers in ignore files, |
| 68 | * and from -1 decrementing for patterns from CLI args. |
| 69 | */ |
| 70 | int srcpos; |
| 71 | }; |
| 72 | |
Derrick Stolee | 96cc8ab | 2019-11-21 22:04:41 +0000 | [diff] [blame] | 73 | /* used for hashmaps for cone patterns */ |
| 74 | struct pattern_entry { |
| 75 | struct hashmap_entry ent; |
| 76 | char *pattern; |
| 77 | size_t patternlen; |
| 78 | }; |
| 79 | |
Adam Spiers | 95a6834 | 2012-12-27 02:32:21 +0000 | [diff] [blame] | 80 | /* |
Adam Spiers | c082df2 | 2013-01-06 16:58:03 +0000 | [diff] [blame] | 81 | * Each excludes file will be parsed into a fresh exclude_list which |
| 82 | * is appended to the relevant exclude_list_group (either EXC_DIRS or |
| 83 | * EXC_FILE). An exclude_list within the EXC_CMDL exclude_list_group |
| 84 | * can also be used to represent the list of --exclude values passed |
| 85 | * via CLI args. |
Adam Spiers | 95a6834 | 2012-12-27 02:32:21 +0000 | [diff] [blame] | 86 | */ |
Derrick Stolee | caa3d55 | 2019-09-03 11:04:56 -0700 | [diff] [blame] | 87 | struct pattern_list { |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 88 | int nr; |
| 89 | int alloc; |
Adam Spiers | c04318e | 2013-01-06 16:58:04 +0000 | [diff] [blame] | 90 | |
Adam Spiers | c082df2 | 2013-01-06 16:58:03 +0000 | [diff] [blame] | 91 | /* remember pointer to exclude file contents so we can free() */ |
| 92 | char *filebuf; |
| 93 | |
Adam Spiers | c04318e | 2013-01-06 16:58:04 +0000 | [diff] [blame] | 94 | /* origin of list, e.g. path to filename, or descriptive string */ |
| 95 | const char *src; |
| 96 | |
Derrick Stolee | ab8db61 | 2019-09-03 11:04:55 -0700 | [diff] [blame] | 97 | struct path_pattern **patterns; |
Derrick Stolee | 96cc8ab | 2019-11-21 22:04:41 +0000 | [diff] [blame] | 98 | |
| 99 | /* |
| 100 | * While scanning the excludes, we attempt to match the patterns |
| 101 | * with a more restricted set that allows us to use hashsets for |
| 102 | * matching logic, which is faster than the linear lookup in the |
| 103 | * excludes array above. If non-zero, that check succeeded. |
| 104 | */ |
| 105 | unsigned use_cone_patterns; |
| 106 | unsigned full_cone; |
| 107 | |
| 108 | /* |
| 109 | * Stores paths where everything starting with those paths |
| 110 | * is included. |
| 111 | */ |
| 112 | struct hashmap recursive_hashmap; |
| 113 | |
| 114 | /* |
| 115 | * Used to check single-level parents of blobs. |
| 116 | */ |
| 117 | struct hashmap parent_hashmap; |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 118 | }; |
| 119 | |
Adam Spiers | 95a6834 | 2012-12-27 02:32:21 +0000 | [diff] [blame] | 120 | /* |
| 121 | * The contents of the per-directory exclude files are lazily read on |
| 122 | * demand and then cached in memory, one per exclude_stack struct, in |
| 123 | * order to avoid opening and parsing each one every time that |
| 124 | * directory is traversed. |
| 125 | */ |
Junio C Hamano | 63d285c | 2007-11-29 02:17:44 -0800 | [diff] [blame] | 126 | struct exclude_stack { |
Adam Spiers | 95a6834 | 2012-12-27 02:32:21 +0000 | [diff] [blame] | 127 | struct exclude_stack *prev; /* the struct exclude_stack for the parent directory */ |
Junio C Hamano | 63d285c | 2007-11-29 02:17:44 -0800 | [diff] [blame] | 128 | int baselen; |
Adam Spiers | c082df2 | 2013-01-06 16:58:03 +0000 | [diff] [blame] | 129 | int exclude_ix; /* index of exclude_list within EXC_DIRS exclude_list_group */ |
Nguyễn Thái Ngọc Duy | 0dcb8d7 | 2015-03-08 17:12:25 +0700 | [diff] [blame] | 130 | struct untracked_cache_dir *ucd; |
Adam Spiers | c082df2 | 2013-01-06 16:58:03 +0000 | [diff] [blame] | 131 | }; |
| 132 | |
| 133 | struct exclude_list_group { |
| 134 | int nr, alloc; |
Derrick Stolee | caa3d55 | 2019-09-03 11:04:56 -0700 | [diff] [blame] | 135 | struct pattern_list *pl; |
Junio C Hamano | 63d285c | 2007-11-29 02:17:44 -0800 | [diff] [blame] | 136 | }; |
| 137 | |
Patryk Obara | 4b33e60 | 2018-01-28 01:13:12 +0100 | [diff] [blame] | 138 | struct oid_stat { |
Nguyễn Thái Ngọc Duy | 55fe6f5 | 2015-03-08 17:12:24 +0700 | [diff] [blame] | 139 | struct stat_data stat; |
Patryk Obara | 4b33e60 | 2018-01-28 01:13:12 +0100 | [diff] [blame] | 140 | struct object_id oid; |
Nguyễn Thái Ngọc Duy | 55fe6f5 | 2015-03-08 17:12:24 +0700 | [diff] [blame] | 141 | int valid; |
| 142 | }; |
| 143 | |
Nguyễn Thái Ngọc Duy | 0dcb8d7 | 2015-03-08 17:12:25 +0700 | [diff] [blame] | 144 | /* |
| 145 | * Untracked cache |
| 146 | * |
| 147 | * The following inputs are sufficient to determine what files in a |
| 148 | * directory are excluded: |
| 149 | * |
| 150 | * - The list of files and directories of the directory in question |
| 151 | * - The $GIT_DIR/index |
| 152 | * - dir_struct flags |
| 153 | * - The content of $GIT_DIR/info/exclude |
| 154 | * - The content of core.excludesfile |
| 155 | * - The content (or the lack) of .gitignore of all parent directories |
| 156 | * from $GIT_WORK_TREE |
| 157 | * - The check_only flag in read_directory_recursive (for |
| 158 | * DIR_HIDE_EMPTY_DIRECTORIES) |
| 159 | * |
| 160 | * The first input can be checked using directory mtime. In many |
| 161 | * filesystems, directory mtime (stat_data field) is updated when its |
| 162 | * files or direct subdirs are added or removed. |
| 163 | * |
| 164 | * The second one can be hooked from cache_tree_invalidate_path(). |
| 165 | * Whenever a file (or a submodule) is added or removed from a |
| 166 | * directory, we invalidate that directory. |
| 167 | * |
| 168 | * The remaining inputs are easy, their SHA-1 could be used to verify |
| 169 | * their contents (exclude_sha1[], info_exclude_sha1[] and |
| 170 | * excludes_file_sha1[]) |
| 171 | */ |
| 172 | struct untracked_cache_dir { |
| 173 | struct untracked_cache_dir **dirs; |
| 174 | char **untracked; |
| 175 | struct stat_data stat_data; |
| 176 | unsigned int untracked_alloc, dirs_nr, dirs_alloc; |
| 177 | unsigned int untracked_nr; |
| 178 | unsigned int check_only : 1; |
Nguyễn Thái Ngọc Duy | 26cb018 | 2015-03-08 17:12:30 +0700 | [diff] [blame] | 179 | /* all data except 'dirs' in this struct are good */ |
Nguyễn Thái Ngọc Duy | ccad261 | 2015-03-08 17:12:26 +0700 | [diff] [blame] | 180 | unsigned int valid : 1; |
Nguyễn Thái Ngọc Duy | 26cb018 | 2015-03-08 17:12:30 +0700 | [diff] [blame] | 181 | unsigned int recurse : 1; |
brian m. carlson | 70c369c | 2018-05-02 00:25:48 +0000 | [diff] [blame] | 182 | /* null object ID means this directory does not have .gitignore */ |
| 183 | struct object_id exclude_oid; |
Nguyễn Thái Ngọc Duy | 0dcb8d7 | 2015-03-08 17:12:25 +0700 | [diff] [blame] | 184 | char name[FLEX_ARRAY]; |
| 185 | }; |
| 186 | |
| 187 | struct untracked_cache { |
Patryk Obara | 4b33e60 | 2018-01-28 01:13:12 +0100 | [diff] [blame] | 188 | struct oid_stat ss_info_exclude; |
| 189 | struct oid_stat ss_excludes_file; |
Nguyễn Thái Ngọc Duy | 0dcb8d7 | 2015-03-08 17:12:25 +0700 | [diff] [blame] | 190 | const char *exclude_per_dir; |
Nguyễn Thái Ngọc Duy | 1e8fef6 | 2015-03-08 17:12:46 +0700 | [diff] [blame] | 191 | struct strbuf ident; |
Nguyễn Thái Ngọc Duy | 0dcb8d7 | 2015-03-08 17:12:25 +0700 | [diff] [blame] | 192 | /* |
| 193 | * dir_struct#flags must match dir_flags or the untracked |
| 194 | * cache is ignored. |
| 195 | */ |
| 196 | unsigned dir_flags; |
| 197 | struct untracked_cache_dir *root; |
| 198 | /* Statistics */ |
| 199 | int dir_created; |
Nguyễn Thái Ngọc Duy | ccad261 | 2015-03-08 17:12:26 +0700 | [diff] [blame] | 200 | int gitignore_invalidated; |
Nguyễn Thái Ngọc Duy | 91a2288 | 2015-03-08 17:12:29 +0700 | [diff] [blame] | 201 | int dir_invalidated; |
| 202 | int dir_opened; |
Ben Peart | 883e248 | 2017-09-22 12:35:40 -0400 | [diff] [blame] | 203 | /* fsmonitor invalidation data */ |
| 204 | unsigned int use_fsmonitor : 1; |
Nguyễn Thái Ngọc Duy | 0dcb8d7 | 2015-03-08 17:12:25 +0700 | [diff] [blame] | 205 | }; |
| 206 | |
Heba Waly | 266f03e | 2019-11-17 21:04:41 +0000 | [diff] [blame] | 207 | /** |
| 208 | * structure is used to pass directory traversal options to the library and to |
| 209 | * record the paths discovered. A single `struct dir_struct` is used regardless |
| 210 | * of whether or not the traversal recursively descends into subdirectories. |
| 211 | */ |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 212 | struct dir_struct { |
Heba Waly | 266f03e | 2019-11-17 21:04:41 +0000 | [diff] [blame] | 213 | |
| 214 | /* The number of members in `entries[]` array. */ |
| 215 | int nr; |
| 216 | |
| 217 | /* Internal use; keeps track of allocation of `entries[]` array.*/ |
| 218 | int alloc; |
| 219 | |
| 220 | /* The number of members in `ignored[]` array. */ |
| 221 | int ignored_nr; |
| 222 | |
| 223 | int ignored_alloc; |
| 224 | |
| 225 | /* bit-field of options */ |
Johannes Schindelin | 7c4c97c | 2009-02-16 13:20:25 +0100 | [diff] [blame] | 226 | enum { |
Heba Waly | 266f03e | 2019-11-17 21:04:41 +0000 | [diff] [blame] | 227 | |
| 228 | /** |
| 229 | * Return just ignored files in `entries[]`, not untracked files. |
| 230 | * This flag is mutually exclusive with `DIR_SHOW_IGNORED_TOO`. |
| 231 | */ |
Johannes Schindelin | 7c4c97c | 2009-02-16 13:20:25 +0100 | [diff] [blame] | 232 | DIR_SHOW_IGNORED = 1<<0, |
Heba Waly | 266f03e | 2019-11-17 21:04:41 +0000 | [diff] [blame] | 233 | |
| 234 | /* Include a directory that is not tracked. */ |
Johannes Schindelin | 7c4c97c | 2009-02-16 13:20:25 +0100 | [diff] [blame] | 235 | DIR_SHOW_OTHER_DIRECTORIES = 1<<1, |
Heba Waly | 266f03e | 2019-11-17 21:04:41 +0000 | [diff] [blame] | 236 | |
| 237 | /* Do not include a directory that is not tracked and is empty. */ |
Johannes Schindelin | 7c4c97c | 2009-02-16 13:20:25 +0100 | [diff] [blame] | 238 | DIR_HIDE_EMPTY_DIRECTORIES = 1<<2, |
Heba Waly | 266f03e | 2019-11-17 21:04:41 +0000 | [diff] [blame] | 239 | |
| 240 | /** |
| 241 | * If set, recurse into a directory that looks like a Git directory. |
| 242 | * Otherwise it is shown as a directory. |
| 243 | */ |
Johannes Schindelin | 7c4c97c | 2009-02-16 13:20:25 +0100 | [diff] [blame] | 244 | DIR_NO_GITLINKS = 1<<3, |
Heba Waly | 266f03e | 2019-11-17 21:04:41 +0000 | [diff] [blame] | 245 | |
| 246 | /** |
| 247 | * Special mode for git-add. Return ignored files in `ignored[]` and |
| 248 | * untracked files in `entries[]`. Only returns ignored files that match |
| 249 | * pathspec exactly (no wildcards). Does not recurse into ignored |
| 250 | * directories. |
| 251 | */ |
Karsten Blees | 0aaf62b | 2013-04-15 21:15:03 +0200 | [diff] [blame] | 252 | DIR_COLLECT_IGNORED = 1<<4, |
Heba Waly | 266f03e | 2019-11-17 21:04:41 +0000 | [diff] [blame] | 253 | |
| 254 | /** |
| 255 | * Similar to `DIR_SHOW_IGNORED`, but return ignored files in |
| 256 | * `ignored[]` in addition to untracked files in `entries[]`. |
| 257 | * This flag is mutually exclusive with `DIR_SHOW_IGNORED`. |
| 258 | */ |
Junio C Hamano | 2eac2a4 | 2013-08-15 12:13:46 -0700 | [diff] [blame] | 259 | DIR_SHOW_IGNORED_TOO = 1<<5, |
Heba Waly | 266f03e | 2019-11-17 21:04:41 +0000 | [diff] [blame] | 260 | |
Samuel Lijin | fb89888 | 2017-05-18 04:21:52 -0400 | [diff] [blame] | 261 | DIR_COLLECT_KILLED_ONLY = 1<<6, |
Heba Waly | 266f03e | 2019-11-17 21:04:41 +0000 | [diff] [blame] | 262 | |
| 263 | /** |
| 264 | * Only has meaning if `DIR_SHOW_IGNORED_TOO` is also set; if this is |
| 265 | * set, the untracked contents of untracked directories are also |
| 266 | * returned in `entries[]`. |
| 267 | */ |
Jameson Miller | eec0f7f | 2017-10-30 13:21:37 -0400 | [diff] [blame] | 268 | DIR_KEEP_UNTRACKED_CONTENTS = 1<<7, |
Heba Waly | 266f03e | 2019-11-17 21:04:41 +0000 | [diff] [blame] | 269 | |
| 270 | /** |
| 271 | * Only has meaning if `DIR_SHOW_IGNORED_TOO` is also set; if this is |
| 272 | * set, returns ignored files and directories that match an exclude |
| 273 | * pattern. If a directory matches an exclude pattern, then the |
| 274 | * directory is returned and the contained paths are not. A directory |
| 275 | * that does not match an exclude pattern will not be returned even if |
| 276 | * all of its contents are ignored. In this case, the contents are |
| 277 | * returned as individual entries. |
| 278 | * |
| 279 | * If this is set, files and directories that explicitly match an ignore |
| 280 | * pattern are reported. Implicitly ignored directories (directories that |
| 281 | * do not match an ignore pattern, but whose contents are all ignored) |
| 282 | * are not reported, instead all of the contents are reported. |
| 283 | */ |
Elijah Newren | 09487f2 | 2019-09-17 09:35:02 -0700 | [diff] [blame] | 284 | DIR_SHOW_IGNORED_TOO_MODE_MATCHING = 1<<8, |
Heba Waly | 266f03e | 2019-11-17 21:04:41 +0000 | [diff] [blame] | 285 | |
Elijah Newren | 09487f2 | 2019-09-17 09:35:02 -0700 | [diff] [blame] | 286 | DIR_SKIP_NESTED_GIT = 1<<9 |
Johannes Schindelin | 7c4c97c | 2009-02-16 13:20:25 +0100 | [diff] [blame] | 287 | } flags; |
Heba Waly | 266f03e | 2019-11-17 21:04:41 +0000 | [diff] [blame] | 288 | |
| 289 | /* An array of `struct dir_entry`, each element of which describes a path. */ |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 290 | struct dir_entry **entries; |
Heba Waly | 266f03e | 2019-11-17 21:04:41 +0000 | [diff] [blame] | 291 | |
| 292 | /** |
| 293 | * used for ignored paths with the `DIR_SHOW_IGNORED_TOO` and |
| 294 | * `DIR_COLLECT_IGNORED` flags. |
| 295 | */ |
Jeff King | 2abd31b | 2007-06-11 09:39:50 -0400 | [diff] [blame] | 296 | struct dir_entry **ignored; |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 297 | |
Heba Waly | 266f03e | 2019-11-17 21:04:41 +0000 | [diff] [blame] | 298 | /** |
| 299 | * The name of the file to be read in each directory for excluded files |
| 300 | * (typically `.gitignore`). |
| 301 | */ |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 302 | const char *exclude_per_dir; |
Adam Spiers | c082df2 | 2013-01-06 16:58:03 +0000 | [diff] [blame] | 303 | |
Junio C Hamano | 63d285c | 2007-11-29 02:17:44 -0800 | [diff] [blame] | 304 | /* |
Adam Spiers | c082df2 | 2013-01-06 16:58:03 +0000 | [diff] [blame] | 305 | * We maintain three groups of exclude pattern lists: |
| 306 | * |
Junio C Hamano | 63d285c | 2007-11-29 02:17:44 -0800 | [diff] [blame] | 307 | * EXC_CMDL lists patterns explicitly given on the command line. |
| 308 | * EXC_DIRS lists patterns obtained from per-directory ignore files. |
Adam Spiers | c082df2 | 2013-01-06 16:58:03 +0000 | [diff] [blame] | 309 | * EXC_FILE lists patterns from fallback ignore files, e.g. |
| 310 | * - .git/info/exclude |
| 311 | * - core.excludesfile |
| 312 | * |
| 313 | * Each group contains multiple exclude lists, a single list |
| 314 | * per source. |
Junio C Hamano | 63d285c | 2007-11-29 02:17:44 -0800 | [diff] [blame] | 315 | */ |
| 316 | #define EXC_CMDL 0 |
| 317 | #define EXC_DIRS 1 |
| 318 | #define EXC_FILE 2 |
Adam Spiers | c082df2 | 2013-01-06 16:58:03 +0000 | [diff] [blame] | 319 | struct exclude_list_group exclude_list_group[3]; |
Junio C Hamano | 63d285c | 2007-11-29 02:17:44 -0800 | [diff] [blame] | 320 | |
Adam Spiers | 95a6834 | 2012-12-27 02:32:21 +0000 | [diff] [blame] | 321 | /* |
| 322 | * Temporary variables which are used during loading of the |
| 323 | * per-directory exclude lists. |
| 324 | * |
| 325 | * exclude_stack points to the top of the exclude_stack, and |
| 326 | * basebuf contains the full path to the current |
Karsten Blees | 95c6f27 | 2013-04-15 21:12:14 +0200 | [diff] [blame] | 327 | * (sub)directory in the traversal. Exclude points to the |
| 328 | * matching exclude struct if the directory is excluded. |
Adam Spiers | 95a6834 | 2012-12-27 02:32:21 +0000 | [diff] [blame] | 329 | */ |
Junio C Hamano | 63d285c | 2007-11-29 02:17:44 -0800 | [diff] [blame] | 330 | struct exclude_stack *exclude_stack; |
Derrick Stolee | ab8db61 | 2019-09-03 11:04:55 -0700 | [diff] [blame] | 331 | struct path_pattern *pattern; |
Nguyễn Thái Ngọc Duy | aceb942 | 2014-07-14 11:50:22 +0200 | [diff] [blame] | 332 | struct strbuf basebuf; |
Nguyễn Thái Ngọc Duy | 0dcb8d7 | 2015-03-08 17:12:25 +0700 | [diff] [blame] | 333 | |
| 334 | /* Enable untracked file cache if set */ |
| 335 | struct untracked_cache *untracked; |
Patryk Obara | 4b33e60 | 2018-01-28 01:13:12 +0100 | [diff] [blame] | 336 | struct oid_stat ss_info_exclude; |
| 337 | struct oid_stat ss_excludes_file; |
Nguyễn Thái Ngọc Duy | ccad261 | 2015-03-08 17:12:26 +0700 | [diff] [blame] | 338 | unsigned unmanaged_exclude_files; |
Elijah Newren | 7fe1ffdaf | 2021-05-12 17:28:15 +0000 | [diff] [blame] | 339 | |
| 340 | /* Stats about the traversal */ |
| 341 | unsigned visited_paths; |
| 342 | unsigned visited_directories; |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 343 | }; |
| 344 | |
Ævar Arnfjörð Bjarmason | ce93a4c | 2021-07-01 12:51:27 +0200 | [diff] [blame] | 345 | #define DIR_INIT { 0 } |
| 346 | |
Elijah Newren | b548f0f | 2021-05-12 17:28:22 +0000 | [diff] [blame] | 347 | struct dirent *readdir_skip_dot_and_dotdot(DIR *dirp); |
| 348 | |
Prathamesh Chavan | e0556a9 | 2017-06-08 23:38:12 +0530 | [diff] [blame] | 349 | /*Count the number of slashes for string s*/ |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 350 | int count_slashes(const char *s); |
Prathamesh Chavan | e0556a9 | 2017-06-08 23:38:12 +0530 | [diff] [blame] | 351 | |
Adam Spiers | 52ed189 | 2013-01-06 16:58:06 +0000 | [diff] [blame] | 352 | /* |
| 353 | * The ordering of these constants is significant, with |
| 354 | * higher-numbered match types signifying "closer" (i.e. more |
| 355 | * specific) matches which will override lower-numbered match types |
| 356 | * when populating the seen[] array. |
| 357 | */ |
Junio C Hamano | e813d50 | 2006-12-25 03:09:52 -0800 | [diff] [blame] | 358 | #define MATCHED_RECURSIVELY 1 |
Elijah Newren | 89a1f4a | 2019-09-17 09:34:58 -0700 | [diff] [blame] | 359 | #define MATCHED_RECURSIVELY_LEADING_PATHSPEC 2 |
| 360 | #define MATCHED_FNMATCH 3 |
| 361 | #define MATCHED_EXACTLY 4 |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 362 | int simple_length(const char *match); |
| 363 | int no_wildcard(const char *string); |
| 364 | char *common_prefix(const struct pathspec *pathspec); |
Derrick Stolee | 847a9e5 | 2021-04-01 01:49:39 +0000 | [diff] [blame] | 365 | int match_pathspec(struct index_state *istate, |
Denton Liu | ad6dad0 | 2019-04-29 04:28:23 -0400 | [diff] [blame] | 366 | const struct pathspec *pathspec, |
| 367 | const char *name, int namelen, |
| 368 | int prefix, char *seen, int is_dir); |
Junio C Hamano | 4aeeef3 | 2019-05-13 23:50:32 +0900 | [diff] [blame] | 369 | int report_path_error(const char *ps_matched, const struct pathspec *pathspec); |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 370 | int within_depth(const char *name, int namelen, int depth, int max_depth); |
Linus Torvalds | 3c6a370 | 2006-05-19 16:07:51 -0700 | [diff] [blame] | 371 | |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 372 | int fill_directory(struct dir_struct *dir, |
Denton Liu | ad6dad0 | 2019-04-29 04:28:23 -0400 | [diff] [blame] | 373 | struct index_state *istate, |
| 374 | const struct pathspec *pathspec); |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 375 | int read_directory(struct dir_struct *, struct index_state *istate, |
Denton Liu | ad6dad0 | 2019-04-29 04:28:23 -0400 | [diff] [blame] | 376 | const char *path, int len, |
| 377 | const struct pathspec *pathspec); |
Junio C Hamano | f8a9d42 | 2006-12-04 16:00:46 -0800 | [diff] [blame] | 378 | |
Derrick Stolee | 468ce99 | 2019-09-03 11:04:58 -0700 | [diff] [blame] | 379 | enum pattern_match_result { |
| 380 | UNDECIDED = -1, |
| 381 | NOT_MATCHED = 0, |
| 382 | MATCHED = 1, |
Derrick Stolee | eb42fec | 2019-11-21 22:04:43 +0000 | [diff] [blame] | 383 | MATCHED_RECURSIVE = 2, |
Derrick Stolee | 468ce99 | 2019-09-03 11:04:58 -0700 | [diff] [blame] | 384 | }; |
| 385 | |
| 386 | /* |
| 387 | * Scan the list of patterns to determine if the ordered list |
| 388 | * of patterns matches on 'pathname'. |
| 389 | * |
| 390 | * Return 1 for a match, 0 for not matched and -1 for undecided. |
| 391 | */ |
| 392 | enum pattern_match_result path_matches_pattern_list(const char *pathname, |
| 393 | int pathlen, |
| 394 | const char *basename, int *dtype, |
| 395 | struct pattern_list *pl, |
| 396 | struct index_state *istate); |
Derrick Stolee | 02155c8 | 2021-09-08 01:42:30 +0000 | [diff] [blame] | 397 | |
| 398 | int init_sparse_checkout_patterns(struct index_state *state); |
| 399 | |
| 400 | int path_in_sparse_checkout(const char *path, |
| 401 | struct index_state *istate); |
| 402 | int path_in_cone_mode_sparse_checkout(const char *path, |
| 403 | struct index_state *istate); |
| 404 | |
Brandon Williams | 9e58bec | 2017-05-05 12:53:25 -0700 | [diff] [blame] | 405 | struct dir_entry *dir_add_ignored(struct dir_struct *dir, |
| 406 | struct index_state *istate, |
| 407 | const char *pathname, int len); |
Junio C Hamano | eb41775 | 2012-06-01 11:28:00 -0700 | [diff] [blame] | 408 | |
| 409 | /* |
Nguyễn Thái Ngọc Duy | 82dce99 | 2012-10-15 13:24:39 +0700 | [diff] [blame] | 410 | * these implement the matching logic for dir.c:excluded_from_list and |
| 411 | * attr.c:path_matches() |
| 412 | */ |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 413 | int match_basename(const char *, int, |
Denton Liu | ad6dad0 | 2019-04-29 04:28:23 -0400 | [diff] [blame] | 414 | const char *, int, int, unsigned); |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 415 | int match_pathname(const char *, int, |
Denton Liu | ad6dad0 | 2019-04-29 04:28:23 -0400 | [diff] [blame] | 416 | const char *, int, |
| 417 | const char *, int, int, unsigned); |
Nguyễn Thái Ngọc Duy | 82dce99 | 2012-10-15 13:24:39 +0700 | [diff] [blame] | 418 | |
Derrick Stolee | 65edd96 | 2019-09-03 11:04:57 -0700 | [diff] [blame] | 419 | struct path_pattern *last_matching_pattern(struct dir_struct *dir, |
| 420 | struct index_state *istate, |
| 421 | const char *name, int *dtype); |
Junio C Hamano | 782cd4c | 2012-06-05 21:17:52 -0700 | [diff] [blame] | 422 | |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 423 | int is_excluded(struct dir_struct *dir, |
Denton Liu | ad6dad0 | 2019-04-29 04:28:23 -0400 | [diff] [blame] | 424 | struct index_state *istate, |
| 425 | const char *name, int *dtype); |
Junio C Hamano | eb41775 | 2012-06-01 11:28:00 -0700 | [diff] [blame] | 426 | |
Derrick Stolee | af09ce2 | 2019-11-21 22:04:42 +0000 | [diff] [blame] | 427 | int pl_hashmap_cmp(const void *unused_cmp_data, |
| 428 | const struct hashmap_entry *a, |
| 429 | const struct hashmap_entry *b, |
| 430 | const void *key); |
Derrick Stolee | 96cc8ab | 2019-11-21 22:04:41 +0000 | [diff] [blame] | 431 | int hashmap_contains_parent(struct hashmap *map, |
| 432 | const char *path, |
| 433 | struct strbuf *buffer); |
Derrick Stolee | 65edd96 | 2019-09-03 11:04:57 -0700 | [diff] [blame] | 434 | struct pattern_list *add_pattern_list(struct dir_struct *dir, |
Denton Liu | ad6dad0 | 2019-04-29 04:28:23 -0400 | [diff] [blame] | 435 | int group_type, const char *src); |
Derrick Stolee | 65edd96 | 2019-09-03 11:04:57 -0700 | [diff] [blame] | 436 | int add_patterns_from_file_to_list(const char *fname, const char *base, int baselen, |
Jeff King | 1679d60 | 2021-02-16 09:44:28 -0500 | [diff] [blame] | 437 | struct pattern_list *pl, struct index_state *istate, |
| 438 | unsigned flags); |
Derrick Stolee | 65edd96 | 2019-09-03 11:04:57 -0700 | [diff] [blame] | 439 | void add_patterns_from_file(struct dir_struct *, const char *fname); |
| 440 | int add_patterns_from_blob_to_list(struct object_id *oid, |
Denton Liu | ad6dad0 | 2019-04-29 04:28:23 -0400 | [diff] [blame] | 441 | const char *base, int baselen, |
Derrick Stolee | caa3d55 | 2019-09-03 11:04:56 -0700 | [diff] [blame] | 442 | struct pattern_list *pl); |
Derrick Stolee | 65edd96 | 2019-09-03 11:04:57 -0700 | [diff] [blame] | 443 | void parse_path_pattern(const char **string, int *patternlen, unsigned *flags, int *nowildcardlen); |
| 444 | void add_pattern(const char *string, const char *base, |
Derrick Stolee | caa3d55 | 2019-09-03 11:04:56 -0700 | [diff] [blame] | 445 | int baselen, struct pattern_list *pl, int srcpos); |
Derrick Stolee | 65edd96 | 2019-09-03 11:04:57 -0700 | [diff] [blame] | 446 | void clear_pattern_list(struct pattern_list *pl); |
Elijah Newren | eceba53 | 2020-08-18 22:58:26 +0000 | [diff] [blame] | 447 | void dir_clear(struct dir_struct *dir); |
Nguyễn Thái Ngọc Duy | 0488481 | 2019-04-16 16:33:34 +0700 | [diff] [blame] | 448 | |
| 449 | int repo_file_exists(struct repository *repo, const char *path); |
| 450 | int file_exists(const char *); |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 451 | |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 452 | int is_inside_dir(const char *dir); |
| 453 | int dir_inside_of(const char *subdir, const char *dir); |
Johannes Schindelin | e663674 | 2007-08-01 01:29:17 +0100 | [diff] [blame] | 454 | |
Alexander Potashev | 8ca12c0 | 2009-01-10 15:07:50 +0300 | [diff] [blame] | 455 | static inline int is_dot_or_dotdot(const char *name) |
| 456 | { |
| 457 | return (name[0] == '.' && |
| 458 | (name[1] == '\0' || |
| 459 | (name[1] == '.' && name[2] == '\0'))); |
| 460 | } |
| 461 | |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 462 | int is_empty_dir(const char *dir); |
Alexander Potashev | 55892d2 | 2009-01-11 15:19:12 +0300 | [diff] [blame] | 463 | |
Atharva Raykar | ed86301 | 2021-08-10 17:16:36 +0530 | [diff] [blame] | 464 | /* |
| 465 | * Retrieve the "humanish" basename of the given Git URL. |
| 466 | * |
| 467 | * For example: |
| 468 | * /path/to/repo.git => "repo" |
| 469 | * host.xz:foo/.git => "foo" |
| 470 | * http://example.com/user/bar.baz => "bar.baz" |
| 471 | */ |
| 472 | char *git_url_basename(const char *repo, int is_bundle, int is_bare); |
| 473 | void strip_dir_trailing_slashes(char *dir); |
| 474 | |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 475 | void setup_standard_excludes(struct dir_struct *dir); |
Junio C Hamano | a0f4afb | 2009-06-30 15:33:45 -0700 | [diff] [blame] | 476 | |
Derrick Stolee | dd23022 | 2021-01-23 19:58:17 +0000 | [diff] [blame] | 477 | char *get_sparse_checkout_filename(void); |
| 478 | int get_sparse_checkout_patterns(struct pattern_list *pl); |
Michael Haggerty | 728af28 | 2016-04-24 07:07:59 +0200 | [diff] [blame] | 479 | |
| 480 | /* Constants for remove_dir_recursively: */ |
| 481 | |
| 482 | /* |
| 483 | * If a non-directory is found within path, stop and return an error. |
| 484 | * (In this case some empty directories might already have been |
| 485 | * removed.) |
| 486 | */ |
Junio C Hamano | a0f4afb | 2009-06-30 15:33:45 -0700 | [diff] [blame] | 487 | #define REMOVE_DIR_EMPTY_ONLY 01 |
Michael Haggerty | 728af28 | 2016-04-24 07:07:59 +0200 | [diff] [blame] | 488 | |
| 489 | /* |
| 490 | * If any Git work trees are found within path, skip them without |
| 491 | * considering it an error. |
| 492 | */ |
Junio C Hamano | a0f4afb | 2009-06-30 15:33:45 -0700 | [diff] [blame] | 493 | #define REMOVE_DIR_KEEP_NESTED_GIT 02 |
Michael Haggerty | 728af28 | 2016-04-24 07:07:59 +0200 | [diff] [blame] | 494 | |
| 495 | /* Remove the contents of path, but leave path itself. */ |
Junio C Hamano | c844a80 | 2012-03-15 15:58:54 +0100 | [diff] [blame] | 496 | #define REMOVE_DIR_KEEP_TOPLEVEL 04 |
Michael Haggerty | 728af28 | 2016-04-24 07:07:59 +0200 | [diff] [blame] | 497 | |
Elijah Newren | 580a5d7 | 2021-12-09 05:08:34 +0000 | [diff] [blame] | 498 | /* Remove the_original_cwd too */ |
| 499 | #define REMOVE_DIR_PURGE_ORIGINAL_CWD 0x08 |
| 500 | |
Michael Haggerty | 728af28 | 2016-04-24 07:07:59 +0200 | [diff] [blame] | 501 | /* |
| 502 | * Remove path and its contents, recursively. flags is a combination |
| 503 | * of the above REMOVE_DIR_* constants. Return 0 on success. |
| 504 | * |
| 505 | * This function uses path as temporary scratch space, but restores it |
| 506 | * before returning. |
| 507 | */ |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 508 | int remove_dir_recursively(struct strbuf *path, int flag); |
Johannes Schindelin | 7155b72 | 2007-09-28 16:28:54 +0100 | [diff] [blame] | 509 | |
Elijah Newren | 63bbe8b | 2021-12-09 05:08:33 +0000 | [diff] [blame] | 510 | /* |
| 511 | * Tries to remove the path, along with leading empty directories so long as |
| 512 | * those empty directories are not startup_info->original_cwd. Ignores |
| 513 | * ENOENT. |
| 514 | */ |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 515 | int remove_path(const char *path); |
Alex Riesen | 4a92d1b | 2008-09-27 00:56:46 +0200 | [diff] [blame] | 516 | |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 517 | int fspathcmp(const char *a, const char *b); |
Eric Wong | cf2dc1c | 2021-07-07 23:10:15 +0000 | [diff] [blame] | 518 | int fspatheq(const char *a, const char *b); |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 519 | int fspathncmp(const char *a, const char *b, size_t count); |
Eric Wong | cf2dc1c | 2021-07-07 23:10:15 +0000 | [diff] [blame] | 520 | unsigned int fspathhash(const char *str); |
Joshua Jensen | 8cf2a84 | 2010-10-03 09:56:41 +0000 | [diff] [blame] | 521 | |
Nguyễn Thái Ngọc Duy | 5d74762 | 2012-11-24 11:33:49 +0700 | [diff] [blame] | 522 | /* |
| 523 | * The prefix part of pattern must not contains wildcards. |
| 524 | */ |
Nguyễn Thái Ngọc Duy | bd30c2e | 2013-07-14 15:36:08 +0700 | [diff] [blame] | 525 | struct pathspec_item; |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 526 | int git_fnmatch(const struct pathspec_item *item, |
Denton Liu | ad6dad0 | 2019-04-29 04:28:23 -0400 | [diff] [blame] | 527 | const char *pattern, const char *string, |
| 528 | int prefix); |
Nguyễn Thái Ngọc Duy | 5d74762 | 2012-11-24 11:33:49 +0700 | [diff] [blame] | 529 | |
Derrick Stolee | 847a9e5 | 2021-04-01 01:49:39 +0000 | [diff] [blame] | 530 | int submodule_path_match(struct index_state *istate, |
Denton Liu | ad6dad0 | 2019-04-29 04:28:23 -0400 | [diff] [blame] | 531 | const struct pathspec *ps, |
| 532 | const char *submodule_name, |
| 533 | char *seen); |
Brandon Williams | 75a6315 | 2016-10-07 11:18:51 -0700 | [diff] [blame] | 534 | |
Derrick Stolee | 847a9e5 | 2021-04-01 01:49:39 +0000 | [diff] [blame] | 535 | static inline int ce_path_match(struct index_state *istate, |
Nguyễn Thái Ngọc Duy | 6d2df28 | 2018-08-13 18:14:22 +0200 | [diff] [blame] | 536 | const struct cache_entry *ce, |
Nguyễn Thái Ngọc Duy | 429bb40 | 2014-01-24 20:40:28 +0700 | [diff] [blame] | 537 | const struct pathspec *pathspec, |
| 538 | char *seen) |
| 539 | { |
Nguyễn Thái Ngọc Duy | 6d2df28 | 2018-08-13 18:14:22 +0200 | [diff] [blame] | 540 | return match_pathspec(istate, pathspec, ce->name, ce_namelen(ce), 0, seen, |
Nguyễn Thái Ngọc Duy | ae8d082 | 2014-01-24 20:40:33 +0700 | [diff] [blame] | 541 | S_ISDIR(ce->ce_mode) || S_ISGITLINK(ce->ce_mode)); |
Nguyễn Thái Ngọc Duy | 429bb40 | 2014-01-24 20:40:28 +0700 | [diff] [blame] | 542 | } |
| 543 | |
Derrick Stolee | 847a9e5 | 2021-04-01 01:49:39 +0000 | [diff] [blame] | 544 | static inline int dir_path_match(struct index_state *istate, |
Nguyễn Thái Ngọc Duy | 6d2df28 | 2018-08-13 18:14:22 +0200 | [diff] [blame] | 545 | const struct dir_entry *ent, |
Nguyễn Thái Ngọc Duy | ebb3289 | 2014-01-24 20:40:29 +0700 | [diff] [blame] | 546 | const struct pathspec *pathspec, |
| 547 | int prefix, char *seen) |
| 548 | { |
Nguyễn Thái Ngọc Duy | ae8d082 | 2014-01-24 20:40:33 +0700 | [diff] [blame] | 549 | int has_trailing_dir = ent->len && ent->name[ent->len - 1] == '/'; |
| 550 | int len = has_trailing_dir ? ent->len - 1 : ent->len; |
Nguyễn Thái Ngọc Duy | 6d2df28 | 2018-08-13 18:14:22 +0200 | [diff] [blame] | 551 | return match_pathspec(istate, pathspec, ent->name, len, prefix, seen, |
Nguyễn Thái Ngọc Duy | ae8d082 | 2014-01-24 20:40:33 +0700 | [diff] [blame] | 552 | has_trailing_dir); |
Nguyễn Thái Ngọc Duy | ebb3289 | 2014-01-24 20:40:29 +0700 | [diff] [blame] | 553 | } |
| 554 | |
Samuel Lijin | bbf504a | 2017-05-18 04:21:53 -0400 | [diff] [blame] | 555 | int cmp_dir_entry(const void *p1, const void *p2); |
| 556 | int check_dir_entry_contains(const struct dir_entry *out, const struct dir_entry *in); |
| 557 | |
Nguyễn Thái Ngọc Duy | 0cacebf | 2018-02-07 16:21:40 +0700 | [diff] [blame] | 558 | void untracked_cache_invalidate_path(struct index_state *, const char *, int safe_path); |
Nguyễn Thái Ngọc Duy | e931371 | 2015-03-08 17:12:35 +0700 | [diff] [blame] | 559 | void untracked_cache_remove_from_index(struct index_state *, const char *); |
| 560 | void untracked_cache_add_to_index(struct index_state *, const char *); |
| 561 | |
Nguyễn Thái Ngọc Duy | f9e6c64 | 2015-03-08 17:12:34 +0700 | [diff] [blame] | 562 | void free_untracked_cache(struct untracked_cache *); |
| 563 | struct untracked_cache *read_untracked_extension(const void *data, unsigned long sz); |
Nguyễn Thái Ngọc Duy | 83c094a | 2015-03-08 17:12:33 +0700 | [diff] [blame] | 564 | void write_untracked_extension(struct strbuf *out, struct untracked_cache *untracked); |
Christian Couder | 4a4ca47 | 2016-01-24 16:28:19 +0100 | [diff] [blame] | 565 | void add_untracked_cache(struct index_state *istate); |
Christian Couder | 07b29bf | 2016-01-24 16:28:20 +0100 | [diff] [blame] | 566 | void remove_untracked_cache(struct index_state *istate); |
Stefan Beller | da62f78 | 2018-03-28 15:35:31 -0700 | [diff] [blame] | 567 | |
| 568 | /* |
| 569 | * Connect a worktree to a git directory by creating (or overwriting) a |
| 570 | * '.git' file containing the location of the git directory. In the git |
| 571 | * directory set the core.worktree setting to indicate where the worktree is. |
| 572 | * When `recurse_into_nested` is set, recurse into any nested submodules, |
| 573 | * connecting them as well. |
| 574 | */ |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 575 | void connect_work_tree_and_git_dir(const char *work_tree, |
Denton Liu | ad6dad0 | 2019-04-29 04:28:23 -0400 | [diff] [blame] | 576 | const char *git_dir, |
| 577 | int recurse_into_nested); |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 578 | void relocate_gitdir(const char *path, |
Denton Liu | ad6dad0 | 2019-04-29 04:28:23 -0400 | [diff] [blame] | 579 | const char *old_git_dir, |
| 580 | const char *new_git_dir); |
Linus Torvalds | 453ec4b | 2006-05-16 19:02:14 -0700 | [diff] [blame] | 581 | #endif |