Raw
1 #ifndef SETUP_H
2 #define SETUP_H
3
4 #include "refs.h"
5 #include "string-list.h"
6
7 int is_inside_git_dir(struct repository *repo);
8 int is_inside_work_tree(struct repository *repo);
9 int get_common_dir_noenv(struct strbuf *sb, const char *gitdir);
10 int get_common_dir(struct strbuf *sb, const char *gitdir);
11
12 /*
13 * Return true if the given path is a git directory; note that this _just_
14 * looks at the directory itself. If you want to know whether "foo/.git"
15 * is a repository, you must feed that path, not just "foo".
16 */
17 int is_git_directory(const char *path);
18
19 /*
20 * Return 1 if the given path is the root of a git repository or
21 * submodule, else 0. Will not return 1 for bare repositories with the
22 * exception of creating a bare repository in "foo/.git" and calling
23 * is_git_repository("foo").
24 *
25 * If we run into read errors, we err on the side of saying "yes, it is",
26 * as we usually consider sub-repos precious, and would prefer to err on the
27 * side of not disrupting or deleting them.
28 */
29 int is_nonbare_repository_dir(struct strbuf *path);
30
31 #define READ_GITFILE_ERR_STAT_FAILED 1
32 #define READ_GITFILE_ERR_NOT_A_FILE 2
33 #define READ_GITFILE_ERR_OPEN_FAILED 3
34 #define READ_GITFILE_ERR_READ_FAILED 4
35 #define READ_GITFILE_ERR_INVALID_FORMAT 5
36 #define READ_GITFILE_ERR_NO_PATH 6
37 #define READ_GITFILE_ERR_NOT_A_REPO 7
38 #define READ_GITFILE_ERR_TOO_LARGE 8
39 #define READ_GITFILE_ERR_MISSING 9
40 #define READ_GITFILE_ERR_IS_A_DIR 10
41 void read_gitfile_error_die(int error_code, const char *path, const char *dir);
42 const char *read_gitfile_gently(const char *path, int *return_error_code);
43 #define read_gitfile(path) read_gitfile_gently((path), NULL)
44 const char *resolve_gitdir_gently(const char *suspect, int *return_error_code);
45 #define resolve_gitdir(path) resolve_gitdir_gently((path), NULL)
46
47 /*
48 * Check if a repository is safe and die if it is not, by verifying the
49 * ownership of the worktree (if any), the git directory, and the gitfile (if
50 * any).
51 *
52 * Exemptions for known-safe repositories can be added via `safe.directory`
53 * config settings; for non-bare repositories, their worktree needs to be
54 * added, for bare ones their git directory.
55 */
56 void die_upon_dubious_ownership(const char *gitfile, const char *worktree,
57 const char *gitdir);
58
59 void setup_work_tree(struct repository *repo);
60
61 /*
62 * discover_git_directory_reason() is similar to discover_git_directory(),
63 * except it returns an enum value instead. It is important to note that
64 * a zero-valued return here is actually GIT_DIR_NONE, which is different
65 * from discover_git_directory.
66 */
67 enum discovery_result {
68 GIT_DIR_EXPLICIT = 1,
69 GIT_DIR_DISCOVERED = 2,
70 GIT_DIR_BARE = 3,
71 /* these are errors */
72 GIT_DIR_HIT_CEILING = -1,
73 GIT_DIR_HIT_MOUNT_POINT = -2,
74 GIT_DIR_INVALID_GITFILE = -3,
75 GIT_DIR_INVALID_OWNERSHIP = -4,
76 GIT_DIR_DISALLOWED_BARE = -5,
77 GIT_DIR_INVALID_FORMAT = -6,
78 GIT_DIR_CWD_FAILURE = -7,
79 };
80 enum discovery_result discover_git_directory_reason(struct strbuf *commondir,
81 struct strbuf *gitdir);
82
83 /*
84 * Find the commondir and gitdir of the repository that contains the current
85 * working directory, without changing the working directory or other global
86 * state. The result is appended to commondir and gitdir. If the discovered
87 * gitdir does not correspond to a worktree, then 'commondir' and 'gitdir' will
88 * both have the same result appended to the buffer. The return value is
89 * either 0 upon success and -1 if no repository was found.
90 */
91 static inline int discover_git_directory(struct strbuf *commondir,
92 struct strbuf *gitdir)
93 {
94 if (discover_git_directory_reason(commondir, gitdir) <= 0)
95 return -1;
96 return 0;
97 }
98
99 void set_git_work_tree(struct repository *repo, const char *tree);
100
101 /* Flags that can be passed to `enter_repo()`. */
102 enum {
103 /*
104 * Callers that require exact paths (as opposed to allowing known
105 * suffixes like ".git", ".git/.git" to be omitted) can set this bit.
106 */
107 ENTER_REPO_STRICT = (1<<0),
108
109 /*
110 * Callers that are willing to run without ownership check can set this
111 * bit.
112 */
113 ENTER_REPO_ANY_OWNER_OK = (1<<1),
114 };
115
116 /*
117 * Discover and enter a repository.
118 *
119 * First, one directory to try is determined by the following algorithm.
120 *
121 * (0) If "strict" is given, the path is used as given and no DWIM is
122 * done. Otherwise:
123 * (1) "~/path" to mean path under the running user's home directory;
124 * (2) "~user/path" to mean path under named user's home directory;
125 * (3) "relative/path" to mean cwd relative directory; or
126 * (4) "/absolute/path" to mean absolute directory.
127 *
128 * Unless "strict" is given, we check "%s/.git", "%s", "%s.git/.git", "%s.git"
129 * in this order. We select the first one that is a valid git repository, and
130 * chdir() to it. If none match, or we fail to chdir, we return NULL.
131 *
132 * If all goes well, we return the directory we used to chdir() (but
133 * before ~user is expanded), avoiding getcwd() resolving symbolic
134 * links. User relative paths are also returned as they are given,
135 * except DWIM suffixing.
136 */
137 const char *enter_repo(struct repository *repo, const char *path, unsigned flags);
138
139 const char *setup_git_directory_gently(struct repository *repo, int *);
140 const char *setup_git_directory(struct repository *repo);
141 char *prefix_path(struct repository *repo, const char *prefix, int len, const char *path);
142 char *prefix_path_gently(struct repository *repo, const char *prefix, int len, int *remaining, const char *path);
143
144 int check_filename(const char *prefix, const char *name);
145 void verify_filename(struct repository *repo,
146 const char *prefix,
147 const char *name,
148 int diagnose_misspelt_rev);
149 void verify_non_filename(struct repository *repo, const char *prefix, const char *name);
150 int path_inside_repo(struct repository *repo, const char *prefix, const char *path);
151
152 void sanitize_stdfds(void);
153
154 /*
155 * Daemonize the current process by forking and then exiting the parent
156 * process. Returns 0 when successful, in which case the parent process will
157 * have exited and it's the child process that continues to run the code.
158 * Otherwise, a negative error code is returned and the parent process will
159 * continue execution.
160 *
161 * Note that this function will also perform the following changes:
162 *
163 * - Standard file descriptors in the child process are closed.
164 * - The child process is made a session leader via setsid(3p).
165 * - All tempfiles owned by the parent process are reassigned to the
166 * daemonized child process.
167 */
168 int daemonize(void);
169
170 /*
171 * GIT_REPO_VERSION is the version we write by default. The
172 * _READ variant is the highest number we know how to
173 * handle.
174 */
175 #define GIT_REPO_VERSION 0
176 #define GIT_REPO_VERSION_READ 1
177
178 /*
179 * You _have_ to initialize a `struct repository_format` using
180 * `= REPOSITORY_FORMAT_INIT` before calling `read_repository_format()`.
181 */
182 struct repository_format {
183 int version;
184 int precious_objects;
185 char *partial_clone; /* value of extensions.partialclone */
186 int worktree_config;
187 int relative_worktrees;
188 int submodule_path_cfg;
189 int is_bare;
190 int hash_algo;
191 int compat_hash_algo;
192 enum ref_storage_format ref_storage_format;
193 char *ref_storage_payload;
194 int sparse_index;
195 char *work_tree;
196 struct string_list unknown_extensions;
197 struct string_list v1_only_extensions;
198 };
199
200 /*
201 * Always use this to initialize a `struct repository_format`
202 * to a well-defined, default state before calling
203 * `read_repository()`.
204 */
205 #define REPOSITORY_FORMAT_INIT \
206 { \
207 .version = -1, \
208 .is_bare = -1, \
209 .hash_algo = GIT_HASH_DEFAULT, \
210 .ref_storage_format = REF_STORAGE_FORMAT_FILES, \
211 .unknown_extensions = STRING_LIST_INIT_DUP, \
212 .v1_only_extensions = STRING_LIST_INIT_DUP, \
213 }
214
215 /*
216 * Read the repository format characteristics from the config file "path" into
217 * "format" struct. Returns the numeric version. On error, or if no version is
218 * found in the configuration, -1 is returned, format->version is set to -1,
219 * and all other fields in the struct are set to the default configuration
220 * (REPOSITORY_FORMAT_INIT). Always initialize the struct using
221 * REPOSITORY_FORMAT_INIT before calling this function.
222 */
223 int read_repository_format(struct repository_format *format, const char *path);
224
225 /*
226 * Free the memory held onto by `format`, but not the struct itself.
227 * (No need to use this after `read_repository_format()` fails.)
228 */
229 void clear_repository_format(struct repository_format *format);
230
231 /*
232 * Verify that the repository described by repository_format is something we
233 * can read. If it is, return 0. Otherwise, return -1, and "err" will describe
234 * any errors encountered.
235 */
236 int verify_repository_format(const struct repository_format *format,
237 struct strbuf *err);
238
239 enum apply_repository_format_flags {
240 /*
241 * Honor environment variables when applying the repository format to
242 * the repository. For now, this only covers environment variables that
243 * relate to the object database.
244 */
245 APPLY_REPOSITORY_FORMAT_HONOR_ENV = (1 << 0),
246 };
247
248 /*
249 * Apply the given repository format to the repo. This initializes extensions
250 * and basic data structures required for normal operation. Returns 0 on
251 * success, a negative error code when the format is not valid as determined by
252 * `verify_repository_format()`.
253 */
254 int apply_repository_format(struct repository *repo,
255 const struct repository_format *format,
256 enum apply_repository_format_flags flags,
257 struct strbuf *err);
258
259 const char *get_template_dir(const char *option_template);
260
261 #define INIT_DB_QUIET (1 << 0)
262 #define INIT_DB_EXIST_OK (1 << 1)
263 #define INIT_DB_SKIP_REFDB (1 << 2)
264
265 int init_db(struct repository *repo,
266 const char *git_dir, const char *real_git_dir,
267 const char *template_dir, int hash_algo,
268 enum ref_storage_format ref_storage_format,
269 const char *initial_branch, int init_shared_repository,
270 unsigned int flags);
271 void initialize_repository_version(struct repository *repo,
272 int hash_algo,
273 enum ref_storage_format ref_storage_format,
274 int reinit);
275 void create_reference_database(struct repository *repo, const char *initial_branch, int quiet);
276
277 /*
278 * NOTE NOTE NOTE!!
279 *
280 * PERM_UMASK, OLD_PERM_GROUP and OLD_PERM_EVERYBODY enumerations must
281 * not be changed. Old repositories have core.sharedrepository written in
282 * numeric format, and therefore these values are preserved for compatibility
283 * reasons.
284 */
285 enum sharedrepo {
286 PERM_UMASK = 0,
287 OLD_PERM_GROUP = 1,
288 OLD_PERM_EVERYBODY = 2,
289 PERM_GROUP = 0660,
290 PERM_EVERYBODY = 0664
291 };
292 int git_config_perm(const char *var, const char *value);
293
294 struct startup_info {
295 int have_repository;
296 const char *prefix;
297 const char *original_cwd;
298 };
299 extern struct startup_info *startup_info;
300 extern const char *tmp_original_cwd;
301
302 #endif /* SETUP_H */