Brandon Williams | e7d72d0 | 2017-06-22 11:43:35 -0700 | [diff] [blame] | 1 | #ifndef PATH_H |
| 2 | #define PATH_H |
| 3 | |
Brandon Williams | b337172 | 2017-06-22 11:43:37 -0700 | [diff] [blame] | 4 | struct repository; |
Elijah Newren | ef3ca95 | 2018-08-15 10:54:05 -0700 | [diff] [blame] | 5 | struct strbuf; |
Elijah Newren | 905f969 | 2023-03-21 06:26:00 +0000 | [diff] [blame] | 6 | struct string_list; |
Brandon Williams | b337172 | 2017-06-22 11:43:37 -0700 | [diff] [blame] | 7 | |
Brandon Williams | e7d72d0 | 2017-06-22 11:43:35 -0700 | [diff] [blame] | 8 | /* |
Brandon Williams | c07b3ad | 2017-12-13 10:28:02 -0800 | [diff] [blame] | 9 | * The result to all functions which return statically allocated memory may be |
| 10 | * overwritten by another call to _any_ one of these functions. Consider using |
| 11 | * the safer variants which operate on strbufs or return allocated memory. |
Brandon Williams | e7d72d0 | 2017-06-22 11:43:35 -0700 | [diff] [blame] | 12 | */ |
Brandon Williams | e7d72d0 | 2017-06-22 11:43:35 -0700 | [diff] [blame] | 13 | |
Brandon Williams | c07b3ad | 2017-12-13 10:28:02 -0800 | [diff] [blame] | 14 | /* |
| 15 | * Return a statically allocated path. |
| 16 | */ |
Denton Liu | b199d71 | 2019-04-29 04:28:20 -0400 | [diff] [blame] | 17 | const char *mkpath(const char *fmt, ...) |
Brandon Williams | c07b3ad | 2017-12-13 10:28:02 -0800 | [diff] [blame] | 18 | __attribute__((format (printf, 1, 2))); |
| 19 | |
| 20 | /* |
| 21 | * Return a path. |
| 22 | */ |
Denton Liu | b199d71 | 2019-04-29 04:28:20 -0400 | [diff] [blame] | 23 | char *mkpathdup(const char *fmt, ...) |
Brandon Williams | c07b3ad | 2017-12-13 10:28:02 -0800 | [diff] [blame] | 24 | __attribute__((format (printf, 1, 2))); |
| 25 | |
| 26 | /* |
| 27 | * Construct a path and place the result in the provided buffer `buf`. |
| 28 | */ |
Denton Liu | b199d71 | 2019-04-29 04:28:20 -0400 | [diff] [blame] | 29 | char *mksnpath(char *buf, size_t n, const char *fmt, ...) |
Brandon Williams | e7d72d0 | 2017-06-22 11:43:35 -0700 | [diff] [blame] | 30 | __attribute__((format (printf, 3, 4))); |
Brandon Williams | c07b3ad | 2017-12-13 10:28:02 -0800 | [diff] [blame] | 31 | |
| 32 | /* |
| 33 | * The `git_common_path` family of functions will construct a path into a |
| 34 | * repository's common git directory, which is shared by all worktrees. |
| 35 | */ |
| 36 | |
| 37 | /* |
| 38 | * Constructs a path into the common git directory of repository `repo` and |
| 39 | * append it in the provided buffer `sb`. |
| 40 | */ |
Denton Liu | b199d71 | 2019-04-29 04:28:20 -0400 | [diff] [blame] | 41 | void strbuf_git_common_path(struct strbuf *sb, |
Denton Liu | ad6dad0 | 2019-04-29 04:28:23 -0400 | [diff] [blame] | 42 | const struct repository *repo, |
| 43 | const char *fmt, ...) |
Brandon Williams | b337172 | 2017-06-22 11:43:37 -0700 | [diff] [blame] | 44 | __attribute__((format (printf, 3, 4))); |
Brandon Williams | e7d72d0 | 2017-06-22 11:43:35 -0700 | [diff] [blame] | 45 | |
Brandon Williams | c07b3ad | 2017-12-13 10:28:02 -0800 | [diff] [blame] | 46 | /* |
| 47 | * Return a statically allocated path into the main repository's |
| 48 | * (the_repository) common git directory. |
| 49 | */ |
Denton Liu | b199d71 | 2019-04-29 04:28:20 -0400 | [diff] [blame] | 50 | const char *git_common_path(const char *fmt, ...) |
Brandon Williams | c07b3ad | 2017-12-13 10:28:02 -0800 | [diff] [blame] | 51 | __attribute__((format (printf, 1, 2))); |
| 52 | |
| 53 | |
| 54 | /* |
| 55 | * The `git_path` family of functions will construct a path into a repository's |
| 56 | * git directory. |
| 57 | * |
| 58 | * These functions will perform adjustments to the resultant path to account |
| 59 | * for special paths which are either considered common among worktrees (e.g. |
| 60 | * paths into the object directory) or have been explicitly set via an |
| 61 | * environment variable or config (e.g. path to the index file). |
| 62 | * |
| 63 | * For an exhaustive list of the adjustments made look at `common_list` and |
| 64 | * `adjust_git_path` in path.c. |
| 65 | */ |
| 66 | |
| 67 | /* |
| 68 | * Return a path into the git directory of repository `repo`. |
| 69 | */ |
Denton Liu | b199d71 | 2019-04-29 04:28:20 -0400 | [diff] [blame] | 70 | char *repo_git_path(const struct repository *repo, |
Denton Liu | ad6dad0 | 2019-04-29 04:28:23 -0400 | [diff] [blame] | 71 | const char *fmt, ...) |
Brandon Williams | 3181d86 | 2017-06-22 11:43:40 -0700 | [diff] [blame] | 72 | __attribute__((format (printf, 2, 3))); |
Brandon Williams | c07b3ad | 2017-12-13 10:28:02 -0800 | [diff] [blame] | 73 | |
| 74 | /* |
| 75 | * Construct a path into the git directory of repository `repo` and append it |
| 76 | * to the provided buffer `sb`. |
| 77 | */ |
Denton Liu | b199d71 | 2019-04-29 04:28:20 -0400 | [diff] [blame] | 78 | void strbuf_repo_git_path(struct strbuf *sb, |
Denton Liu | ad6dad0 | 2019-04-29 04:28:23 -0400 | [diff] [blame] | 79 | const struct repository *repo, |
| 80 | const char *fmt, ...) |
Brandon Williams | 3181d86 | 2017-06-22 11:43:40 -0700 | [diff] [blame] | 81 | __attribute__((format (printf, 3, 4))); |
| 82 | |
Brandon Williams | c07b3ad | 2017-12-13 10:28:02 -0800 | [diff] [blame] | 83 | /* |
| 84 | * Return a statically allocated path into the main repository's |
| 85 | * (the_repository) git directory. |
| 86 | */ |
Denton Liu | b199d71 | 2019-04-29 04:28:20 -0400 | [diff] [blame] | 87 | const char *git_path(const char *fmt, ...) |
Brandon Williams | c07b3ad | 2017-12-13 10:28:02 -0800 | [diff] [blame] | 88 | __attribute__((format (printf, 1, 2))); |
| 89 | |
| 90 | /* |
| 91 | * Return a path into the main repository's (the_repository) git directory. |
| 92 | */ |
Denton Liu | b199d71 | 2019-04-29 04:28:20 -0400 | [diff] [blame] | 93 | char *git_pathdup(const char *fmt, ...) |
Brandon Williams | c07b3ad | 2017-12-13 10:28:02 -0800 | [diff] [blame] | 94 | __attribute__((format (printf, 1, 2))); |
| 95 | |
| 96 | /* |
| 97 | * Construct a path into the main repository's (the_repository) git directory |
| 98 | * and place it in the provided buffer `buf`, the contents of the buffer will |
| 99 | * be overridden. |
| 100 | */ |
Denton Liu | b199d71 | 2019-04-29 04:28:20 -0400 | [diff] [blame] | 101 | char *git_path_buf(struct strbuf *buf, const char *fmt, ...) |
Brandon Williams | c07b3ad | 2017-12-13 10:28:02 -0800 | [diff] [blame] | 102 | __attribute__((format (printf, 2, 3))); |
| 103 | |
| 104 | /* |
| 105 | * Construct a path into the main repository's (the_repository) git directory |
| 106 | * and append it to the provided buffer `sb`. |
| 107 | */ |
Denton Liu | b199d71 | 2019-04-29 04:28:20 -0400 | [diff] [blame] | 108 | void strbuf_git_path(struct strbuf *sb, const char *fmt, ...) |
Brandon Williams | c07b3ad | 2017-12-13 10:28:02 -0800 | [diff] [blame] | 109 | __attribute__((format (printf, 2, 3))); |
| 110 | |
| 111 | /* |
| 112 | * Return a path into the worktree of repository `repo`. |
| 113 | * |
| 114 | * If the repository doesn't have a worktree NULL is returned. |
| 115 | */ |
Denton Liu | b199d71 | 2019-04-29 04:28:20 -0400 | [diff] [blame] | 116 | char *repo_worktree_path(const struct repository *repo, |
Brandon Williams | b42b0c0 | 2017-06-22 11:43:41 -0700 | [diff] [blame] | 117 | const char *fmt, ...) |
| 118 | __attribute__((format (printf, 2, 3))); |
Brandon Williams | c07b3ad | 2017-12-13 10:28:02 -0800 | [diff] [blame] | 119 | |
| 120 | /* |
| 121 | * Construct a path into the worktree of repository `repo` and append it |
| 122 | * to the provided buffer `sb`. |
| 123 | * |
| 124 | * If the repository doesn't have a worktree nothing will be appended to `sb`. |
| 125 | */ |
Denton Liu | b199d71 | 2019-04-29 04:28:20 -0400 | [diff] [blame] | 126 | void strbuf_repo_worktree_path(struct strbuf *sb, |
Brandon Williams | b42b0c0 | 2017-06-22 11:43:41 -0700 | [diff] [blame] | 127 | const struct repository *repo, |
| 128 | const char *fmt, ...) |
| 129 | __attribute__((format (printf, 3, 4))); |
| 130 | |
Brandon Williams | c07b3ad | 2017-12-13 10:28:02 -0800 | [diff] [blame] | 131 | /* |
| 132 | * Return a path into a submodule's git directory located at `path`. `path` |
| 133 | * must only reference a submodule of the main repository (the_repository). |
| 134 | */ |
Denton Liu | b199d71 | 2019-04-29 04:28:20 -0400 | [diff] [blame] | 135 | char *git_pathdup_submodule(const char *path, const char *fmt, ...) |
Brandon Williams | c07b3ad | 2017-12-13 10:28:02 -0800 | [diff] [blame] | 136 | __attribute__((format (printf, 2, 3))); |
| 137 | |
| 138 | /* |
| 139 | * Construct a path into a submodule's git directory located at `path` and |
| 140 | * append it to the provided buffer `sb`. `path` must only reference a |
| 141 | * submodule of the main repository (the_repository). |
| 142 | */ |
Denton Liu | b199d71 | 2019-04-29 04:28:20 -0400 | [diff] [blame] | 143 | int strbuf_git_path_submodule(struct strbuf *sb, const char *path, |
Brandon Williams | c07b3ad | 2017-12-13 10:28:02 -0800 | [diff] [blame] | 144 | const char *fmt, ...) |
| 145 | __attribute__((format (printf, 3, 4))); |
| 146 | |
Denton Liu | 5545442 | 2019-04-29 04:28:14 -0400 | [diff] [blame] | 147 | void report_linked_checkout_garbage(void); |
Brandon Williams | e7d72d0 | 2017-06-22 11:43:35 -0700 | [diff] [blame] | 148 | |
| 149 | /* |
| 150 | * You can define a static memoized git path like: |
| 151 | * |
Beat Bolli | 9ad3635 | 2018-07-09 21:25:35 +0200 | [diff] [blame] | 152 | * static GIT_PATH_FUNC(git_path_foo, "FOO") |
Brandon Williams | e7d72d0 | 2017-06-22 11:43:35 -0700 | [diff] [blame] | 153 | * |
| 154 | * or use one of the global ones below. |
| 155 | */ |
| 156 | #define GIT_PATH_FUNC(func, filename) \ |
| 157 | const char *func(void) \ |
| 158 | { \ |
| 159 | static char *ret; \ |
| 160 | if (!ret) \ |
| 161 | ret = git_pathdup(filename); \ |
| 162 | return ret; \ |
| 163 | } |
| 164 | |
Stefan Beller | 102de88 | 2018-05-17 15:51:51 -0700 | [diff] [blame] | 165 | #define REPO_GIT_PATH_FUNC(var, filename) \ |
| 166 | const char *git_path_##var(struct repository *r) \ |
| 167 | { \ |
| 168 | if (!r->cached_paths.var) \ |
Stefan Beller | b6b24fc | 2018-12-14 16:09:41 -0800 | [diff] [blame] | 169 | r->cached_paths.var = repo_git_path(r, filename); \ |
Stefan Beller | 102de88 | 2018-05-17 15:51:51 -0700 | [diff] [blame] | 170 | return r->cached_paths.var; \ |
| 171 | } |
| 172 | |
Stefan Beller | 102de88 | 2018-05-17 15:51:51 -0700 | [diff] [blame] | 173 | const char *git_path_squash_msg(struct repository *r); |
| 174 | const char *git_path_merge_msg(struct repository *r); |
| 175 | const char *git_path_merge_rr(struct repository *r); |
| 176 | const char *git_path_merge_mode(struct repository *r); |
| 177 | const char *git_path_merge_head(struct repository *r); |
Denton Liu | a03b555 | 2020-04-07 10:28:07 -0400 | [diff] [blame] | 178 | const char *git_path_merge_autostash(struct repository *r); |
Elijah Newren | 5291828 | 2021-03-20 00:03:52 +0000 | [diff] [blame] | 179 | const char *git_path_auto_merge(struct repository *r); |
Stefan Beller | 102de88 | 2018-05-17 15:51:51 -0700 | [diff] [blame] | 180 | const char *git_path_fetch_head(struct repository *r); |
| 181 | const char *git_path_shallow(struct repository *r); |
Brandon Williams | e7d72d0 | 2017-06-22 11:43:35 -0700 | [diff] [blame] | 182 | |
brian m. carlson | ce17feb | 2019-08-25 23:33:39 +0000 | [diff] [blame] | 183 | int ends_with_path_components(const char *path, const char *components); |
Elijah Newren | 905f969 | 2023-03-21 06:26:00 +0000 | [diff] [blame] | 184 | int validate_headref(const char *ref); |
| 185 | |
| 186 | int adjust_shared_perm(const char *path); |
| 187 | |
| 188 | char *interpolate_path(const char *path, int real_home); |
| 189 | const char *enter_repo(const char *path, int strict); |
| 190 | const char *remove_leading_path(const char *in, const char *prefix); |
| 191 | const char *relative_path(const char *in, const char *prefix, struct strbuf *sb); |
| 192 | int normalize_path_copy_len(char *dst, const char *src, int *prefix_len); |
| 193 | int normalize_path_copy(char *dst, const char *src); |
Calvin Wan | aba0706 | 2023-06-06 19:48:42 +0000 | [diff] [blame] | 194 | /** |
| 195 | * Normalize in-place the path contained in the strbuf. If an error occurs, |
| 196 | * the contents of "sb" are left untouched, and -1 is returned. |
| 197 | */ |
| 198 | int strbuf_normalize_path(struct strbuf *src); |
Elijah Newren | 905f969 | 2023-03-21 06:26:00 +0000 | [diff] [blame] | 199 | int longest_ancestor_length(const char *path, struct string_list *prefixes); |
| 200 | char *strip_path_suffix(const char *path, const char *suffix); |
| 201 | int daemon_avoid_alias(const char *path); |
| 202 | |
| 203 | /* |
| 204 | * These functions match their is_hfs_dotgit() counterparts; see utf8.h for |
| 205 | * details. |
| 206 | */ |
| 207 | int is_ntfs_dotgit(const char *name); |
| 208 | int is_ntfs_dotgitmodules(const char *name); |
| 209 | int is_ntfs_dotgitignore(const char *name); |
| 210 | int is_ntfs_dotgitattributes(const char *name); |
| 211 | int is_ntfs_dotmailmap(const char *name); |
| 212 | |
| 213 | /* |
| 214 | * Returns true iff "str" could be confused as a command-line option when |
| 215 | * passed to a sub-program like "ssh". Note that this has nothing to do with |
| 216 | * shell-quoting, which should be handled separately; we're assuming here that |
| 217 | * the string makes it verbatim to the sub-program. |
| 218 | */ |
| 219 | int looks_like_command_line_option(const char *str); |
| 220 | |
| 221 | /** |
| 222 | * Return a newly allocated string with the evaluation of |
| 223 | * "$XDG_CONFIG_HOME/$subdir/$filename" if $XDG_CONFIG_HOME is non-empty, otherwise |
| 224 | * "$HOME/.config/$subdir/$filename". Return NULL upon error. |
| 225 | */ |
| 226 | char *xdg_config_home_for(const char *subdir, const char *filename); |
| 227 | |
| 228 | /** |
| 229 | * Return a newly allocated string with the evaluation of |
| 230 | * "$XDG_CONFIG_HOME/git/$filename" if $XDG_CONFIG_HOME is non-empty, otherwise |
| 231 | * "$HOME/.config/git/$filename". Return NULL upon error. |
| 232 | */ |
| 233 | char *xdg_config_home(const char *filename); |
| 234 | |
| 235 | /** |
| 236 | * Return a newly allocated string with the evaluation of |
| 237 | * "$XDG_CACHE_HOME/git/$filename" if $XDG_CACHE_HOME is non-empty, otherwise |
| 238 | * "$HOME/.cache/git/$filename". Return NULL upon error. |
| 239 | */ |
| 240 | char *xdg_cache_home(const char *filename); |
| 241 | |
| 242 | /* |
| 243 | * Create a directory and (if share is nonzero) adjust its permissions |
| 244 | * according to the shared_repository setting. Only use this for |
| 245 | * directories under $GIT_DIR. Don't use it for working tree |
| 246 | * directories. |
| 247 | */ |
| 248 | void safe_create_dir(const char *dir, int share); |
brian m. carlson | ce17feb | 2019-08-25 23:33:39 +0000 | [diff] [blame] | 249 | |
Brandon Williams | e7d72d0 | 2017-06-22 11:43:35 -0700 | [diff] [blame] | 250 | #endif /* PATH_H */ |