]> git.ipfire.org Git - thirdparty/git.git/blame - dir.h
Git 2.45-rc0
[thirdparty/git.git] / dir.h
CommitLineData
453ec4bd
LT
1#ifndef DIR_H
2#define DIR_H
3
b9a7ac2c 4#include "hash-ll.h"
96cc8ab5 5#include "hashmap.h"
ac48adf4
EN
6#include "pathspec.h"
7#include "statinfo.h"
eb41775e
JH
8#include "strbuf.h"
9
67e7305e
JH
10struct repository;
11
266f03ec
HW
12/**
13 * The directory listing API is used to enumerate paths in the work tree,
14 * optionally taking `.git/info/exclude` and `.gitignore` files per directory
15 * into account.
16 */
17
18/**
19 * Calling sequence
20 * ----------------
21 *
22 * Note: The index may be checked for .gitignore files that are
23 * CE_SKIP_WORKTREE marked. If you want to exclude files, make sure you have
24 * loaded the index first.
25 *
eceba532 26 * - Prepare `struct dir_struct dir` using `dir_init()` function.
266f03ec
HW
27 *
28 * - To add single exclude pattern, call `add_pattern_list()` and then
29 * `add_pattern()`.
30 *
31 * - To add patterns from a file (e.g. `.git/info/exclude`), call
eceba532 32 * `add_patterns_from_file()` , and/or set `dir.exclude_per_dir`.
266f03ec 33 *
eceba532
EN
34 * - A short-hand function `setup_standard_excludes()` can be used to set
35 * up the standard set of exclude settings, instead of manually calling
36 * the add_pattern*() family of functions.
266f03ec 37 *
eceba532 38 * - Call `fill_directory()`.
266f03ec 39 *
eceba532 40 * - Use `dir.entries[]` and `dir.ignored[]`.
266f03ec 41 *
eceba532 42 * - Call `dir_clear()` when the contained elements are no longer in use.
266f03ec
HW
43 *
44 */
45
f9401850
CW
46struct repository;
47
453ec4bd 48struct dir_entry {
e96980ef 49 unsigned int len;
453ec4bd
LT
50 char name[FLEX_ARRAY]; /* more */
51};
52
4ff89ee5
DS
53#define PATTERN_FLAG_NODIR 1
54#define PATTERN_FLAG_ENDSWITH 4
55#define PATTERN_FLAG_MUSTBEDIR 8
56#define PATTERN_FLAG_NEGATIVE 16
68492fc7 57
ab8db613 58struct path_pattern {
709359c8 59 /*
65edd96a 60 * This allows callers of last_matching_pattern() etc.
709359c8
NTND
61 * to determine the origin of the matching pattern.
62 */
caa3d554 63 struct pattern_list *pl;
709359c8
NTND
64
65 const char *pattern;
66 int patternlen;
67 int nowildcardlen;
68 const char *base;
69 int baselen;
4ff89ee5 70 unsigned flags; /* PATTERN_FLAG_* */
709359c8
NTND
71
72 /*
73 * Counting starts from 1 for line numbers in ignore files,
74 * and from -1 decrementing for patterns from CLI args.
75 */
76 int srcpos;
77};
78
96cc8ab5
DS
79/* used for hashmaps for cone patterns */
80struct pattern_entry {
81 struct hashmap_entry ent;
82 char *pattern;
83 size_t patternlen;
84};
85
95a68344 86/*
c082df24
AS
87 * Each excludes file will be parsed into a fresh exclude_list which
88 * is appended to the relevant exclude_list_group (either EXC_DIRS or
89 * EXC_FILE). An exclude_list within the EXC_CMDL exclude_list_group
90 * can also be used to represent the list of --exclude values passed
91 * via CLI args.
95a68344 92 */
caa3d554 93struct pattern_list {
453ec4bd
LT
94 int nr;
95 int alloc;
c04318e4 96
c082df24
AS
97 /* remember pointer to exclude file contents so we can free() */
98 char *filebuf;
99
c04318e4
AS
100 /* origin of list, e.g. path to filename, or descriptive string */
101 const char *src;
102
ab8db613 103 struct path_pattern **patterns;
96cc8ab5
DS
104
105 /*
106 * While scanning the excludes, we attempt to match the patterns
107 * with a more restricted set that allows us to use hashsets for
108 * matching logic, which is faster than the linear lookup in the
109 * excludes array above. If non-zero, that check succeeded.
110 */
111 unsigned use_cone_patterns;
112 unsigned full_cone;
113
114 /*
115 * Stores paths where everything starting with those paths
116 * is included.
117 */
118 struct hashmap recursive_hashmap;
119
120 /*
121 * Used to check single-level parents of blobs.
122 */
123 struct hashmap parent_hashmap;
453ec4bd
LT
124};
125
95a68344
AS
126/*
127 * The contents of the per-directory exclude files are lazily read on
128 * demand and then cached in memory, one per exclude_stack struct, in
129 * order to avoid opening and parsing each one every time that
130 * directory is traversed.
131 */
63d285c8 132struct exclude_stack {
95a68344 133 struct exclude_stack *prev; /* the struct exclude_stack for the parent directory */
63d285c8 134 int baselen;
c082df24 135 int exclude_ix; /* index of exclude_list within EXC_DIRS exclude_list_group */
0dcb8d7f 136 struct untracked_cache_dir *ucd;
c082df24
AS
137};
138
139struct exclude_list_group {
140 int nr, alloc;
caa3d554 141 struct pattern_list *pl;
63d285c8
JH
142};
143
4b33e602 144struct oid_stat {
55fe6f51 145 struct stat_data stat;
4b33e602 146 struct object_id oid;
55fe6f51
NTND
147 int valid;
148};
149
0dcb8d7f
NTND
150/*
151 * Untracked cache
152 *
153 * The following inputs are sufficient to determine what files in a
154 * directory are excluded:
155 *
156 * - The list of files and directories of the directory in question
157 * - The $GIT_DIR/index
158 * - dir_struct flags
159 * - The content of $GIT_DIR/info/exclude
160 * - The content of core.excludesfile
161 * - The content (or the lack) of .gitignore of all parent directories
162 * from $GIT_WORK_TREE
163 * - The check_only flag in read_directory_recursive (for
164 * DIR_HIDE_EMPTY_DIRECTORIES)
165 *
166 * The first input can be checked using directory mtime. In many
167 * filesystems, directory mtime (stat_data field) is updated when its
168 * files or direct subdirs are added or removed.
169 *
170 * The second one can be hooked from cache_tree_invalidate_path().
171 * Whenever a file (or a submodule) is added or removed from a
172 * directory, we invalidate that directory.
173 *
174 * The remaining inputs are easy, their SHA-1 could be used to verify
175 * their contents (exclude_sha1[], info_exclude_sha1[] and
176 * excludes_file_sha1[])
177 */
178struct untracked_cache_dir {
179 struct untracked_cache_dir **dirs;
180 char **untracked;
181 struct stat_data stat_data;
182 unsigned int untracked_alloc, dirs_nr, dirs_alloc;
183 unsigned int untracked_nr;
184 unsigned int check_only : 1;
26cb0182 185 /* all data except 'dirs' in this struct are good */
ccad261f 186 unsigned int valid : 1;
26cb0182 187 unsigned int recurse : 1;
70c369cd 188 /* null object ID means this directory does not have .gitignore */
189 struct object_id exclude_oid;
0dcb8d7f
NTND
190 char name[FLEX_ARRAY];
191};
192
193struct untracked_cache {
4b33e602
PO
194 struct oid_stat ss_info_exclude;
195 struct oid_stat ss_excludes_file;
0dcb8d7f 196 const char *exclude_per_dir;
083fd1a2 197 char *exclude_per_dir_to_free;
1e8fef60 198 struct strbuf ident;
0dcb8d7f
NTND
199 /*
200 * dir_struct#flags must match dir_flags or the untracked
201 * cache is ignored.
202 */
203 unsigned dir_flags;
204 struct untracked_cache_dir *root;
205 /* Statistics */
206 int dir_created;
ccad261f 207 int gitignore_invalidated;
91a2288b
NTND
208 int dir_invalidated;
209 int dir_opened;
883e248b
BP
210 /* fsmonitor invalidation data */
211 unsigned int use_fsmonitor : 1;
0dcb8d7f
NTND
212};
213
266f03ec
HW
214/**
215 * structure is used to pass directory traversal options to the library and to
216 * record the paths discovered. A single `struct dir_struct` is used regardless
217 * of whether or not the traversal recursively descends into subdirectories.
218 */
453ec4bd 219struct dir_struct {
266f03ec 220
266f03ec 221 /* bit-field of options */
7c4c97c0 222 enum {
266f03ec
HW
223
224 /**
225 * Return just ignored files in `entries[]`, not untracked files.
226 * This flag is mutually exclusive with `DIR_SHOW_IGNORED_TOO`.
227 */
7c4c97c0 228 DIR_SHOW_IGNORED = 1<<0,
266f03ec
HW
229
230 /* Include a directory that is not tracked. */
7c4c97c0 231 DIR_SHOW_OTHER_DIRECTORIES = 1<<1,
266f03ec
HW
232
233 /* Do not include a directory that is not tracked and is empty. */
7c4c97c0 234 DIR_HIDE_EMPTY_DIRECTORIES = 1<<2,
266f03ec
HW
235
236 /**
237 * If set, recurse into a directory that looks like a Git directory.
238 * Otherwise it is shown as a directory.
239 */
7c4c97c0 240 DIR_NO_GITLINKS = 1<<3,
266f03ec
HW
241
242 /**
243 * Special mode for git-add. Return ignored files in `ignored[]` and
244 * untracked files in `entries[]`. Only returns ignored files that match
245 * pathspec exactly (no wildcards). Does not recurse into ignored
246 * directories.
247 */
0aaf62b6 248 DIR_COLLECT_IGNORED = 1<<4,
266f03ec
HW
249
250 /**
251 * Similar to `DIR_SHOW_IGNORED`, but return ignored files in
252 * `ignored[]` in addition to untracked files in `entries[]`.
253 * This flag is mutually exclusive with `DIR_SHOW_IGNORED`.
254 */
2eac2a4c 255 DIR_SHOW_IGNORED_TOO = 1<<5,
266f03ec 256
fb898888 257 DIR_COLLECT_KILLED_ONLY = 1<<6,
266f03ec
HW
258
259 /**
260 * Only has meaning if `DIR_SHOW_IGNORED_TOO` is also set; if this is
261 * set, the untracked contents of untracked directories are also
262 * returned in `entries[]`.
263 */
eec0f7f2 264 DIR_KEEP_UNTRACKED_CONTENTS = 1<<7,
266f03ec
HW
265
266 /**
267 * Only has meaning if `DIR_SHOW_IGNORED_TOO` is also set; if this is
268 * set, returns ignored files and directories that match an exclude
269 * pattern. If a directory matches an exclude pattern, then the
270 * directory is returned and the contained paths are not. A directory
271 * that does not match an exclude pattern will not be returned even if
272 * all of its contents are ignored. In this case, the contents are
273 * returned as individual entries.
274 *
275 * If this is set, files and directories that explicitly match an ignore
276 * pattern are reported. Implicitly ignored directories (directories that
277 * do not match an ignore pattern, but whose contents are all ignored)
278 * are not reported, instead all of the contents are reported.
279 */
09487f2c 280 DIR_SHOW_IGNORED_TOO_MODE_MATCHING = 1<<8,
266f03ec 281
09487f2c 282 DIR_SKIP_NESTED_GIT = 1<<9
7c4c97c0 283 } flags;
266f03ec 284
d144a9d3
EN
285 /* The number of members in `entries[]` array. */
286 int nr; /* output only */
287
288 /* The number of members in `ignored[]` array. */
289 int ignored_nr; /* output only */
290
266f03ec 291 /* An array of `struct dir_entry`, each element of which describes a path. */
d144a9d3 292 struct dir_entry **entries; /* output only */
266f03ec
HW
293
294 /**
295 * used for ignored paths with the `DIR_SHOW_IGNORED_TOO` and
296 * `DIR_COLLECT_IGNORED` flags.
297 */
d144a9d3 298 struct dir_entry **ignored; /* output only */
453ec4bd 299
5fdf285e
EN
300 /* Enable/update untracked file cache if set */
301 struct untracked_cache *untracked;
302
266f03ec 303 /**
59e009bf
EN
304 * Deprecated: ls-files is the only allowed caller; all other callers
305 * should leave this as NULL; it pre-dated the
306 * setup_standard_excludes() mechanism that replaces this.
307 *
308 * This field tracks the name of the file to be read in each directory
309 * for excluded files (typically `.gitignore`).
266f03ec 310 */
453ec4bd 311 const char *exclude_per_dir;
c082df24 312
5fdf285e
EN
313 struct dir_struct_internal {
314 /* Keeps track of allocation of `entries[]` array.*/
315 int alloc;
316
317 /* Keeps track of allocation of `ignored[]` array. */
318 int ignored_alloc;
319
320 /*
321 * We maintain three groups of exclude pattern lists:
322 *
323 * EXC_CMDL lists patterns explicitly given on the command line.
324 * EXC_DIRS lists patterns obtained from per-directory ignore
325 * files.
326 * EXC_FILE lists patterns from fallback ignore files, e.g.
327 * - .git/info/exclude
328 * - core.excludesfile
329 *
330 * Each group contains multiple exclude lists, a single list
331 * per source.
332 */
63d285c8
JH
333#define EXC_CMDL 0
334#define EXC_DIRS 1
335#define EXC_FILE 2
5fdf285e 336 struct exclude_list_group exclude_list_group[3];
7fe1ffda 337
5fdf285e
EN
338 /*
339 * Temporary variables which are used during loading of the
340 * per-directory exclude lists.
341 *
342 * exclude_stack points to the top of the exclude_stack, and
343 * basebuf contains the full path to the current
344 * (sub)directory in the traversal. Exclude points to the
345 * matching exclude struct if the directory is excluded.
346 */
347 struct exclude_stack *exclude_stack;
348 struct path_pattern *pattern;
349 struct strbuf basebuf;
350
351 /* Additional metadata related to 'untracked' */
352 struct oid_stat ss_info_exclude;
353 struct oid_stat ss_excludes_file;
354 unsigned unmanaged_exclude_files;
355
356 /* Stats about the traversal */
357 unsigned visited_paths;
358 unsigned visited_directories;
359 } internal;
453ec4bd
LT
360};
361
ce93a4c6
ÆAB
362#define DIR_INIT { 0 }
363
b548f0f1
EN
364struct dirent *readdir_skip_dot_and_dotdot(DIR *dirp);
365
6dc10043
VD
366/*
367 * Get the d_type of a dirent. If the d_type is unknown, derive it from
368 * stat.st_mode using the path to the dirent's containing directory (path) and
369 * the name of the dirent itself.
370 *
aa79636f
VD
371 * If 'follow_symlink' is 1, this function will attempt to follow DT_LNK types
372 * using 'stat'. Links are *not* followed recursively, so a symlink pointing
373 * to another symlink will still resolve to 'DT_LNK'.
374 *
6dc10043
VD
375 * Note that 'path' is assumed to have a trailing slash. It is also modified
376 * in-place during the execution of the function, but is then reverted to its
377 * original value before returning.
378 */
aa79636f
VD
379unsigned char get_dtype(struct dirent *e, struct strbuf *path,
380 int follow_symlink);
6dc10043 381
e0556a92 382/*Count the number of slashes for string s*/
55454427 383int count_slashes(const char *s);
e0556a92 384
52ed1894
AS
385/*
386 * The ordering of these constants is significant, with
387 * higher-numbered match types signifying "closer" (i.e. more
388 * specific) matches which will override lower-numbered match types
389 * when populating the seen[] array.
390 */
e813d50e 391#define MATCHED_RECURSIVELY 1
89a1f4aa
EN
392#define MATCHED_RECURSIVELY_LEADING_PATHSPEC 2
393#define MATCHED_FNMATCH 3
394#define MATCHED_EXACTLY 4
55454427
DL
395int simple_length(const char *match);
396int no_wildcard(const char *string);
397char *common_prefix(const struct pathspec *pathspec);
4aeeef37 398int report_path_error(const char *ps_matched, const struct pathspec *pathspec);
55454427 399int within_depth(const char *name, int namelen, int depth, int max_depth);
3c6a370b 400
55454427 401int fill_directory(struct dir_struct *dir,
ad6dad09
DL
402 struct index_state *istate,
403 const struct pathspec *pathspec);
55454427 404int read_directory(struct dir_struct *, struct index_state *istate,
ad6dad09
DL
405 const char *path, int len,
406 const struct pathspec *pathspec);
f8a9d428 407
468ce99b
DS
408enum pattern_match_result {
409 UNDECIDED = -1,
410 NOT_MATCHED = 0,
411 MATCHED = 1,
eb42feca 412 MATCHED_RECURSIVE = 2,
468ce99b
DS
413};
414
415/*
416 * Scan the list of patterns to determine if the ordered list
417 * of patterns matches on 'pathname'.
418 *
419 * Return 1 for a match, 0 for not matched and -1 for undecided.
420 */
421enum pattern_match_result path_matches_pattern_list(const char *pathname,
422 int pathlen,
423 const char *basename, int *dtype,
424 struct pattern_list *pl,
425 struct index_state *istate);
02155c8c
DS
426
427int init_sparse_checkout_patterns(struct index_state *state);
428
429int path_in_sparse_checkout(const char *path,
430 struct index_state *istate);
431int path_in_cone_mode_sparse_checkout(const char *path,
432 struct index_state *istate);
433
9e58beca
BW
434struct dir_entry *dir_add_ignored(struct dir_struct *dir,
435 struct index_state *istate,
436 const char *pathname, int len);
eb41775e 437
82dce998
NTND
438/*
439 * these implement the matching logic for dir.c:excluded_from_list and
440 * attr.c:path_matches()
441 */
55454427 442int match_basename(const char *, int,
ad6dad09 443 const char *, int, int, unsigned);
55454427 444int match_pathname(const char *, int,
ad6dad09 445 const char *, int,
77651c03 446 const char *, int, int);
82dce998 447
65edd96a
DS
448struct path_pattern *last_matching_pattern(struct dir_struct *dir,
449 struct index_state *istate,
450 const char *name, int *dtype);
782cd4c0 451
55454427 452int is_excluded(struct dir_struct *dir,
ad6dad09
DL
453 struct index_state *istate,
454 const char *name, int *dtype);
eb41775e 455
af09ce24
DS
456int pl_hashmap_cmp(const void *unused_cmp_data,
457 const struct hashmap_entry *a,
458 const struct hashmap_entry *b,
459 const void *key);
96cc8ab5
DS
460int hashmap_contains_parent(struct hashmap *map,
461 const char *path,
462 struct strbuf *buffer);
65edd96a 463struct pattern_list *add_pattern_list(struct dir_struct *dir,
ad6dad09 464 int group_type, const char *src);
65edd96a 465int add_patterns_from_file_to_list(const char *fname, const char *base, int baselen,
1679d60b
JK
466 struct pattern_list *pl, struct index_state *istate,
467 unsigned flags);
65edd96a
DS
468void add_patterns_from_file(struct dir_struct *, const char *fname);
469int add_patterns_from_blob_to_list(struct object_id *oid,
ad6dad09 470 const char *base, int baselen,
caa3d554 471 struct pattern_list *pl);
65edd96a
DS
472void parse_path_pattern(const char **string, int *patternlen, unsigned *flags, int *nowildcardlen);
473void add_pattern(const char *string, const char *base,
caa3d554 474 int baselen, struct pattern_list *pl, int srcpos);
65edd96a 475void clear_pattern_list(struct pattern_list *pl);
eceba532 476void dir_clear(struct dir_struct *dir);
0488481e
NTND
477
478int repo_file_exists(struct repository *repo, const char *path);
479int file_exists(const char *);
453ec4bd 480
55454427
DL
481int is_inside_dir(const char *dir);
482int dir_inside_of(const char *subdir, const char *dir);
e6636747 483
8ca12c0d
AP
484static inline int is_dot_or_dotdot(const char *name)
485{
486 return (name[0] == '.' &&
487 (name[1] == '\0' ||
488 (name[1] == '.' && name[2] == '\0')));
489}
490
55454427 491int is_empty_dir(const char *dir);
55892d23 492
ed86301f
AR
493/*
494 * Retrieve the "humanish" basename of the given Git URL.
495 *
496 * For example:
497 * /path/to/repo.git => "repo"
498 * host.xz:foo/.git => "foo"
499 * http://example.com/user/bar.baz => "bar.baz"
500 */
501char *git_url_basename(const char *repo, int is_bundle, int is_bare);
502void strip_dir_trailing_slashes(char *dir);
503
55454427 504void setup_standard_excludes(struct dir_struct *dir);
a0f4afbe 505
dd23022a
DS
506char *get_sparse_checkout_filename(void);
507int get_sparse_checkout_patterns(struct pattern_list *pl);
728af283
MH
508
509/* Constants for remove_dir_recursively: */
510
511/*
512 * If a non-directory is found within path, stop and return an error.
513 * (In this case some empty directories might already have been
514 * removed.)
515 */
a0f4afbe 516#define REMOVE_DIR_EMPTY_ONLY 01
728af283
MH
517
518/*
519 * If any Git work trees are found within path, skip them without
520 * considering it an error.
521 */
a0f4afbe 522#define REMOVE_DIR_KEEP_NESTED_GIT 02
728af283
MH
523
524/* Remove the contents of path, but leave path itself. */
c844a803 525#define REMOVE_DIR_KEEP_TOPLEVEL 04
728af283 526
580a5d7f
EN
527/* Remove the_original_cwd too */
528#define REMOVE_DIR_PURGE_ORIGINAL_CWD 0x08
529
728af283
MH
530/*
531 * Remove path and its contents, recursively. flags is a combination
532 * of the above REMOVE_DIR_* constants. Return 0 on success.
533 *
534 * This function uses path as temporary scratch space, but restores it
535 * before returning.
536 */
55454427 537int remove_dir_recursively(struct strbuf *path, int flag);
7155b727 538
63bbe8be
EN
539/*
540 * Tries to remove the path, along with leading empty directories so long as
541 * those empty directories are not startup_info->original_cwd. Ignores
542 * ENOENT.
543 */
55454427 544int remove_path(const char *path);
4a92d1bf 545
55454427 546int fspathcmp(const char *a, const char *b);
cf2dc1c2 547int fspatheq(const char *a, const char *b);
55454427 548int fspathncmp(const char *a, const char *b, size_t count);
cf2dc1c2 549unsigned int fspathhash(const char *str);
8cf2a84e 550
5d74762d
NTND
551/*
552 * The prefix part of pattern must not contains wildcards.
553 */
bd30c2e4 554struct pathspec_item;
55454427 555int git_fnmatch(const struct pathspec_item *item,
ad6dad09
DL
556 const char *pattern, const char *string,
557 int prefix);
5d74762d 558
847a9e5d 559int submodule_path_match(struct index_state *istate,
ad6dad09
DL
560 const struct pathspec *ps,
561 const char *submodule_name,
562 char *seen);
75a6315f 563
847a9e5d 564static inline int dir_path_match(struct index_state *istate,
6d2df284 565 const struct dir_entry *ent,
ebb32893
NTND
566 const struct pathspec *pathspec,
567 int prefix, char *seen)
568{
ae8d0824
NTND
569 int has_trailing_dir = ent->len && ent->name[ent->len - 1] == '/';
570 int len = has_trailing_dir ? ent->len - 1 : ent->len;
6d2df284 571 return match_pathspec(istate, pathspec, ent->name, len, prefix, seen,
ae8d0824 572 has_trailing_dir);
ebb32893
NTND
573}
574
bbf504a9
SL
575int cmp_dir_entry(const void *p1, const void *p2);
576int check_dir_entry_contains(const struct dir_entry *out, const struct dir_entry *in);
577
0cacebf0 578void untracked_cache_invalidate_path(struct index_state *, const char *, int safe_path);
3e4ffda6
JH
579/*
580 * Invalidate the untracked-cache for this path, but first strip
581 * off a trailing slash, if present.
582 */
583void untracked_cache_invalidate_trimmed_path(struct index_state *,
584 const char *path,
585 int safe_path);
e931371a
NTND
586void untracked_cache_remove_from_index(struct index_state *, const char *);
587void untracked_cache_add_to_index(struct index_state *, const char *);
588
f9e6c649
NTND
589void free_untracked_cache(struct untracked_cache *);
590struct untracked_cache *read_untracked_extension(const void *data, unsigned long sz);
83c094ad 591void write_untracked_extension(struct strbuf *out, struct untracked_cache *untracked);
4a4ca479 592void add_untracked_cache(struct index_state *istate);
07b29bfd 593void remove_untracked_cache(struct index_state *istate);
da62f786
SB
594
595/*
596 * Connect a worktree to a git directory by creating (or overwriting) a
597 * '.git' file containing the location of the git directory. In the git
598 * directory set the core.worktree setting to indicate where the worktree is.
599 * When `recurse_into_nested` is set, recurse into any nested submodules,
600 * connecting them as well.
601 */
55454427 602void connect_work_tree_and_git_dir(const char *work_tree,
ad6dad09
DL
603 const char *git_dir,
604 int recurse_into_nested);
55454427 605void relocate_gitdir(const char *path,
ad6dad09
DL
606 const char *old_git_dir,
607 const char *new_git_dir);
9fd512c8
ÆAB
608
609/**
610 * The "enum path_matches_kind" determines how path_match_flags() will
611 * behave. The flags come in sets, and one (and only one) must be
612 * provided out of each "set":
613 *
614 * PATH_MATCH_NATIVE:
615 * Path separator is is_dir_sep()
616 * PATH_MATCH_XPLATFORM:
617 * Path separator is is_xplatform_dir_sep()
618 *
619 * Do we use is_dir_sep() to check for a directory separator
620 * (*_NATIVE), or do we always check for '/' or '\' (*_XPLATFORM). The
621 * "*_NATIVE" version on Windows is the same as "*_XPLATFORM",
622 * everywhere else "*_NATIVE" means "only /".
623 *
624 * PATH_MATCH_STARTS_WITH_DOT_SLASH:
625 * Match a path starting with "./"
626 * PATH_MATCH_STARTS_WITH_DOT_DOT_SLASH:
627 * Match a path starting with "../"
628 *
629 * The "/" in the above is adjusted based on the "*_NATIVE" and
630 * "*_XPLATFORM" flags.
631 */
632enum path_match_flags {
633 PATH_MATCH_NATIVE = 1 << 0,
634 PATH_MATCH_XPLATFORM = 1 << 1,
635 PATH_MATCH_STARTS_WITH_DOT_SLASH = 1 << 2,
636 PATH_MATCH_STARTS_WITH_DOT_DOT_SLASH = 1 << 3,
637};
638#define PATH_MATCH_KINDS_MASK (PATH_MATCH_STARTS_WITH_DOT_SLASH | \
639 PATH_MATCH_STARTS_WITH_DOT_DOT_SLASH)
640#define PATH_MATCH_PLATFORM_MASK (PATH_MATCH_NATIVE | PATH_MATCH_XPLATFORM)
641
642/**
643 * path_match_flags() checks if a given "path" matches a given "enum
644 * path_match_flags" criteria.
645 */
646int path_match_flags(const char *const path, const enum path_match_flags f);
647
648/**
649 * starts_with_dot_slash_native(): convenience wrapper for
650 * path_match_flags() with PATH_MATCH_STARTS_WITH_DOT_SLASH and
651 * PATH_MATCH_NATIVE.
652 */
653static inline int starts_with_dot_slash_native(const char *const path)
654{
655 const enum path_match_flags what = PATH_MATCH_STARTS_WITH_DOT_SLASH;
656
657 return path_match_flags(path, what | PATH_MATCH_NATIVE);
658}
659
660/**
661 * starts_with_dot_slash_native(): convenience wrapper for
662 * path_match_flags() with PATH_MATCH_STARTS_WITH_DOT_DOT_SLASH and
663 * PATH_MATCH_NATIVE.
664 */
665static inline int starts_with_dot_dot_slash_native(const char *const path)
666{
667 const enum path_match_flags what = PATH_MATCH_STARTS_WITH_DOT_DOT_SLASH;
668
669 return path_match_flags(path, what | PATH_MATCH_NATIVE);
670}
592fc5b3 671
453ec4bd 672#endif