Git fork
at reftables-rust 240 lines 7.9 kB view raw
1#ifndef WORKTREE_H 2#define WORKTREE_H 3 4#include "refs.h" 5 6struct strbuf; 7 8struct worktree { 9 /* The repository this worktree belongs to. */ 10 struct repository *repo; 11 char *path; 12 char *id; 13 char *head_ref; /* NULL if HEAD is broken or detached */ 14 char *lock_reason; /* private - use worktree_lock_reason */ 15 char *prune_reason; /* private - use worktree_prune_reason */ 16 struct object_id head_oid; 17 int is_detached; 18 int is_bare; 19 int is_current; 20 int lock_reason_valid; /* private */ 21 int prune_reason_valid; /* private */ 22}; 23 24/* 25 * Get the worktrees. The primary worktree will always be the first returned, 26 * and linked worktrees will follow in no particular order. 27 * 28 * The caller is responsible for freeing the memory from the returned 29 * worktrees by calling free_worktrees(). 30 */ 31struct worktree **get_worktrees(void); 32 33/* 34 * Like `get_worktrees`, but does not read HEAD. Skip reading HEAD allows to 35 * get the worktree without worrying about failures pertaining to parsing 36 * the HEAD ref. This is useful in contexts where it is assumed that the 37 * refdb may not be in a consistent state. 38 */ 39struct worktree **get_worktrees_without_reading_head(void); 40 41/* 42 * Returns 1 if linked worktrees exist, 0 otherwise. 43 */ 44int submodule_uses_worktrees(const char *path); 45 46/* 47 * Return git dir of the worktree. Note that the path may be relative. 48 * If wt is NULL, git dir of current worktree is returned. 49 */ 50char *get_worktree_git_dir(const struct worktree *wt); 51 52/* 53 * Search for the worktree identified unambiguously by `arg` -- typically 54 * supplied by the user via the command-line -- which may be a pathname or some 55 * shorthand uniquely identifying a worktree, thus making it convenient for the 56 * user to specify a worktree with minimal typing. For instance, if the last 57 * component (say, "foo") of a worktree's pathname is unique among worktrees 58 * (say, "work/foo" and "work/bar"), it can be used to identify the worktree 59 * unambiguously. 60 * 61 * `prefix` should be the `prefix` handed to top-level Git commands along with 62 * `argc` and `argv`. 63 * 64 * Return the worktree identified by `arg`, or NULL if not found. 65 */ 66struct worktree *find_worktree(struct worktree **list, 67 const char *prefix, 68 const char *arg); 69 70/* 71 * Look up the worktree corresponding to `id`, or NULL of no such worktree 72 * exists. 73 */ 74struct worktree *get_linked_worktree(const char *id, 75 int skip_reading_head); 76 77/* 78 * Return the worktree corresponding to `path`, or NULL if no such worktree 79 * exists. 80 */ 81struct worktree *find_worktree_by_path(struct worktree **, const char *path); 82 83/* 84 * Return true if the given worktree is the main one. 85 */ 86int is_main_worktree(const struct worktree *wt); 87 88/* 89 * Return the reason string if the given worktree is locked or NULL 90 * otherwise. 91 */ 92const char *worktree_lock_reason(struct worktree *wt); 93 94/* 95 * Return the reason string if the given worktree should be pruned, otherwise 96 * NULL if it should not be pruned. `expire` defines a grace period to prune 97 * the worktree when its path does not exist. 98 */ 99const char *worktree_prune_reason(struct worktree *wt, timestamp_t expire); 100 101/* 102 * Return true if worktree entry should be pruned, along with the reason for 103 * pruning. Otherwise, return false and the worktree's path in `wtpath`, or 104 * NULL if it cannot be determined. Caller is responsible for freeing 105 * returned path. 106 * 107 * `expire` defines a grace period to prune the worktree when its path 108 * does not exist. 109 */ 110int should_prune_worktree(const char *id, 111 struct strbuf *reason, 112 char **wtpath, 113 timestamp_t expire); 114 115#define WT_VALIDATE_WORKTREE_MISSING_OK (1 << 0) 116 117/* 118 * Return zero if the worktree is in good condition. Error message is 119 * returned if "errmsg" is not NULL. 120 */ 121int validate_worktree(const struct worktree *wt, 122 struct strbuf *errmsg, 123 unsigned flags); 124 125/* 126 * Update worktrees/xxx/gitdir with the new path. 127 */ 128void update_worktree_location(struct worktree *wt, const char *path_, 129 int use_relative_paths); 130 131typedef void (* worktree_repair_fn)(int iserr, const char *path, 132 const char *msg, void *cb_data); 133 134/* 135 * Visit each registered linked worktree and repair corruptions. For each 136 * repair made or error encountered while attempting a repair, the callback 137 * function, if non-NULL, is called with the path of the worktree and a 138 * description of the repair or error, along with the callback user-data. 139 */ 140void repair_worktrees(worktree_repair_fn, void *cb_data, int use_relative_paths); 141 142/* 143 * Repair the linked worktrees after the gitdir has been moved. 144 */ 145void repair_worktrees_after_gitdir_move(const char *old_path); 146 147/* 148 * Repair the linked worktree after the gitdir has been moved. 149 */ 150void repair_worktree_after_gitdir_move(struct worktree *wt, const char *old_path); 151 152/* 153 * Repair administrative files corresponding to the worktree at the given path. 154 * The worktree's .git file pointing at the repository must be intact for the 155 * repair to succeed. Useful for re-associating an orphaned worktree with the 156 * repository if the worktree has been moved manually (without using "git 157 * worktree move"). For each repair made or error encountered while attempting 158 * a repair, the callback function, if non-NULL, is called with the path of the 159 * worktree and a description of the repair or error, along with the callback 160 * user-data. 161 */ 162void repair_worktree_at_path(const char *, worktree_repair_fn, 163 void *cb_data, int use_relative_paths); 164 165/* 166 * Free up the memory for a worktree. 167 */ 168void free_worktree(struct worktree *); 169 170/* 171 * Free up the memory for worktree(s) 172 */ 173void free_worktrees(struct worktree **); 174 175/* 176 * Check if a per-worktree symref points to a ref in the main worktree 177 * or any linked worktree, and return the worktree that holds the ref, 178 * or NULL otherwise. 179 */ 180const struct worktree *find_shared_symref(struct worktree **worktrees, 181 const char *symref, 182 const char *target); 183 184/* 185 * Returns true if a symref points to a ref in a worktree. 186 */ 187int is_shared_symref(const struct worktree *wt, 188 const char *symref, const char *target); 189 190/* 191 * Similar to head_ref() for all HEADs _except_ one from the current 192 * worktree, which is covered by head_ref(). 193 */ 194int other_head_refs(each_ref_fn fn, void *cb_data); 195 196int is_worktree_being_rebased(const struct worktree *wt, const char *target); 197int is_worktree_being_bisected(const struct worktree *wt, const char *target); 198 199/* 200 * Return a refname suitable for access from the current ref store. 201 */ 202void strbuf_worktree_ref(const struct worktree *wt, 203 struct strbuf *sb, 204 const char *refname); 205 206/** 207 * Enable worktree config for the first time. This will make the following 208 * adjustments: 209 * 210 * 1. Add extensions.worktreeConfig=true in the common config file. 211 * 212 * 2. If the common config file has a core.worktree value, then that value 213 * is moved to the main worktree's config.worktree file. 214 * 215 * 3. If the common config file has a core.bare enabled, then that value 216 * is moved to the main worktree's config.worktree file. 217 * 218 * If extensions.worktreeConfig is already true, then this method 219 * terminates early without any of the above steps. The existing config 220 * arrangement is assumed to be intentional. 221 * 222 * Returns 0 on success. Reports an error message and returns non-zero 223 * if any of these steps fail. 224 */ 225int init_worktree_config(struct repository *r); 226 227/** 228 * Write the .git file and gitdir file that links the worktree to the repository. 229 * 230 * The `dotgit` parameter is the path to the worktree's .git file, and `gitdir` 231 * is the path to the repository's `gitdir` file. 232 * 233 * Example 234 * dotgit: "/path/to/foo/.git" 235 * gitdir: "/path/to/repo/worktrees/foo/gitdir" 236 */ 237void write_worktree_linking_files(struct strbuf dotgit, struct strbuf gitdir, 238 int use_relative_paths); 239 240#endif