1#ifndef WORKTREE_H 2#define WORKTREE_H 3 4#include "cache.h" 5#include "refs.h" 6 7struct strbuf; 8 9struct worktree { 10 char *path; 11 char *id; 12 char *head_ref; /* NULL if HEAD is broken or detached */ 13 char *lock_reason; /* internal use */ 14 struct object_id head_oid; 15 int is_detached; 16 int is_bare; 17 int is_current; 18 int lock_reason_valid; 19}; 20 21/* Functions for acting on the information about worktrees. */ 22 23#define GWT_SORT_LINKED (1 << 0) /* keeps linked worktrees sorted */ 24 25/* 26 * Get the worktrees. The primary worktree will always be the first returned, 27 * and linked worktrees will be pointed to by 'next' in each subsequent 28 * worktree. No specific ordering is done on the linked worktrees. 29 * 30 * The caller is responsible for freeing the memory from the returned 31 * worktree(s). 32 */ 33extern struct worktree **get_worktrees(unsigned flags); 34 35/* 36 * Returns 1 if linked worktrees exist, 0 otherwise. 37 */ 38extern int submodule_uses_worktrees(const char *path); 39 40/* 41 * Return git dir of the worktree. Note that the path may be relative. 42 * If wt is NULL, git dir of current worktree is returned. 43 */ 44extern const char *get_worktree_git_dir(const struct worktree *wt); 45 46/* 47 * Search a worktree that can be unambiguously identified by 48 * "arg". "prefix" must not be NULL. 49 */ 50extern struct worktree *find_worktree(struct worktree **list, 51 const char *prefix, 52 const char *arg); 53 54/* 55 * Return true if the given worktree is the main one. 56 */ 57extern int is_main_worktree(const struct worktree *wt); 58 59/* 60 * Return the reason string if the given worktree is locked or NULL 61 * otherwise. 62 */ 63extern const char *is_worktree_locked(struct worktree *wt); 64 65#define WT_VALIDATE_WORKTREE_MISSING_OK (1 << 0) 66 67/* 68 * Return zero if the worktree is in good condition. Error message is 69 * returned if "errmsg" is not NULL. 70 */ 71extern int validate_worktree(const struct worktree *wt, 72 struct strbuf *errmsg, 73 unsigned flags); 74 75/* 76 * Update worktrees/xxx/gitdir with the new path. 77 */ 78extern void update_worktree_location(struct worktree *wt, 79 const char *path_); 80 81/* 82 * Free up the memory for worktree(s) 83 */ 84extern void free_worktrees(struct worktree **); 85 86/* 87 * Check if a per-worktree symref points to a ref in the main worktree 88 * or any linked worktree, and return the worktree that holds the ref, 89 * or NULL otherwise. The result may be destroyed by the next call. 90 */ 91extern const struct worktree *find_shared_symref(const char *symref, 92 const char *target); 93 94/* 95 * Similar to head_ref() for all HEADs _except_ one from the current 96 * worktree, which is covered by head_ref(). 97 */ 98int other_head_refs(each_ref_fn fn, void *cb_data); 99 100int is_worktree_being_rebased(const struct worktree *wt, const char *target); 101int is_worktree_being_bisected(const struct worktree *wt, const char *target); 102 103/* 104 * Similar to git_path() but can produce paths for a specified 105 * worktree instead of current one 106 */ 107extern const char *worktree_git_path(const struct worktree *wt, 108 const char *fmt, ...) 109 __attribute__((format (printf, 2, 3))); 110 111#endif