blob: ce45b66de9e82d4d619b6f74e0e77c8bd5ab3f53 [file] [log] [blame]
Michael Rappazzoac6c5612015-10-02 07:55:31 -04001#ifndef WORKTREE_H
2#define WORKTREE_H
3
Nguyễn Thái Ngọc Duyd0c39a42017-08-23 19:36:59 +07004#include "refs.h"
5
Nguyễn Thái Ngọc Duy4ddddc12018-01-24 16:53:51 +07006struct strbuf;
7
Michael Rappazzo51934902015-10-08 13:01:03 -04008struct worktree {
9 char *path;
Nguyễn Thái Ngọc Duy69dfe3b2016-04-22 20:01:26 +070010 char *id;
Nguyễn Thái Ngọc Duyfa099d22017-04-24 17:01:23 +070011 char *head_ref; /* NULL if HEAD is broken or detached */
Nickolai Belakovskid236f122018-10-29 23:24:09 -070012 char *lock_reason; /* private - use worktree_lock_reason */
Rafael Silvafc0c7d52021-01-19 22:27:34 +010013 char *prune_reason; /* private - use worktree_prune_reason */
brian m. carlson0f051542017-10-15 22:07:08 +000014 struct object_id head_oid;
Michael Rappazzo92718b72015-10-08 13:01:04 -040015 int is_detached;
16 int is_bare;
Nguyễn Thái Ngọc Duy750e8a62016-04-22 20:01:28 +070017 int is_current;
Nickolai Belakovskie21cc072018-10-29 23:24:08 -070018 int lock_reason_valid; /* private */
Rafael Silvafc0c7d52021-01-19 22:27:34 +010019 int prune_reason_valid; /* private */
Michael Rappazzo51934902015-10-08 13:01:03 -040020};
21
Michael Rappazzo51934902015-10-08 13:01:03 -040022/*
23 * Get the worktrees. The primary worktree will always be the first returned,
Eric Sunshined9c54c22020-06-19 19:35:43 -040024 * and linked worktrees will follow in no particular order.
Michael Rappazzo51934902015-10-08 13:01:03 -040025 *
26 * The caller is responsible for freeing the memory from the returned
Eric Sunshined9c54c22020-06-19 19:35:43 -040027 * worktrees by calling free_worktrees().
Michael Rappazzo51934902015-10-08 13:01:03 -040028 */
Eric Sunshine03f24652020-06-19 19:35:44 -040029struct worktree **get_worktrees(void);
Michael Rappazzo51934902015-10-08 13:01:03 -040030
31/*
Stefan Beller1a248cf2016-12-12 11:04:33 -080032 * Returns 1 if linked worktrees exist, 0 otherwise.
33 */
Denton Liu55454422019-04-29 04:28:14 -040034int submodule_uses_worktrees(const char *path);
Stefan Beller1a248cf2016-12-12 11:04:33 -080035
36/*
Nguyễn Thái Ngọc Duy69dfe3b2016-04-22 20:01:26 +070037 * Return git dir of the worktree. Note that the path may be relative.
38 * If wt is NULL, git dir of current worktree is returned.
39 */
Denton Liu55454422019-04-29 04:28:14 -040040const char *get_worktree_git_dir(const struct worktree *wt);
Nguyễn Thái Ngọc Duy69dfe3b2016-04-22 20:01:26 +070041
42/*
Eric Sunshinea80c4c22020-02-24 04:08:46 -050043 * Search for the worktree identified unambiguously by `arg` -- typically
44 * supplied by the user via the command-line -- which may be a pathname or some
45 * shorthand uniquely identifying a worktree, thus making it convenient for the
46 * user to specify a worktree with minimal typing. For instance, if the last
47 * component (say, "foo") of a worktree's pathname is unique among worktrees
48 * (say, "work/foo" and "work/bar"), it can be used to identify the worktree
49 * unambiguously.
50 *
51 * `prefix` should be the `prefix` handed to top-level Git commands along with
52 * `argc` and `argv`.
53 *
54 * Return the worktree identified by `arg`, or NULL if not found.
Nguyễn Thái Ngọc Duy68353142016-06-03 19:19:39 +070055 */
Denton Liu55454422019-04-29 04:28:14 -040056struct worktree *find_worktree(struct worktree **list,
Denton Liuad6dad02019-04-29 04:28:23 -040057 const char *prefix,
58 const char *arg);
Nguyễn Thái Ngọc Duy68353142016-06-03 19:19:39 +070059
60/*
Eric Sunshinebb4995f2020-02-24 04:08:47 -050061 * Return the worktree corresponding to `path`, or NULL if no such worktree
62 * exists.
63 */
64struct worktree *find_worktree_by_path(struct worktree **, const char *path);
65
66/*
Nguyễn Thái Ngọc Duy984ad9e2016-06-03 19:19:40 +070067 * Return true if the given worktree is the main one.
68 */
Denton Liu55454422019-04-29 04:28:14 -040069int is_main_worktree(const struct worktree *wt);
Nguyễn Thái Ngọc Duy984ad9e2016-06-03 19:19:40 +070070
71/*
Nguyễn Thái Ngọc Duy346ef532016-06-13 19:18:23 +070072 * Return the reason string if the given worktree is locked or NULL
73 * otherwise.
74 */
Denton Liu55454422019-04-29 04:28:14 -040075const char *worktree_lock_reason(struct worktree *wt);
Nguyễn Thái Ngọc Duy346ef532016-06-13 19:18:23 +070076
Rafael Silvaa29a8b72021-01-19 22:27:33 +010077/*
Rafael Silvafc0c7d52021-01-19 22:27:34 +010078 * Return the reason string if the given worktree should be pruned, otherwise
79 * NULL if it should not be pruned. `expire` defines a grace period to prune
80 * the worktree when its path does not exist.
81 */
82const char *worktree_prune_reason(struct worktree *wt, timestamp_t expire);
83
84/*
Rafael Silvaa29a8b72021-01-19 22:27:33 +010085 * Return true if worktree entry should be pruned, along with the reason for
86 * pruning. Otherwise, return false and the worktree's path in `wtpath`, or
87 * NULL if it cannot be determined. Caller is responsible for freeing
88 * returned path.
89 *
90 * `expire` defines a grace period to prune the worktree when its path
91 * does not exist.
92 */
93int should_prune_worktree(const char *id,
94 struct strbuf *reason,
95 char **wtpath,
96 timestamp_t expire);
97
Nguyễn Thái Ngọc Duyee6763a2018-02-12 16:49:40 +070098#define WT_VALIDATE_WORKTREE_MISSING_OK (1 << 0)
99
Nguyễn Thái Ngọc Duy346ef532016-06-13 19:18:23 +0700100/*
Nguyễn Thái Ngọc Duy4ddddc12018-01-24 16:53:51 +0700101 * Return zero if the worktree is in good condition. Error message is
102 * returned if "errmsg" is not NULL.
103 */
Denton Liu55454422019-04-29 04:28:14 -0400104int validate_worktree(const struct worktree *wt,
Denton Liuad6dad02019-04-29 04:28:23 -0400105 struct strbuf *errmsg,
106 unsigned flags);
Nguyễn Thái Ngọc Duy4ddddc12018-01-24 16:53:51 +0700107
108/*
Nguyễn Thái Ngọc Duy9c620fc2018-02-12 16:49:35 +0700109 * Update worktrees/xxx/gitdir with the new path.
110 */
Denton Liu55454422019-04-29 04:28:14 -0400111void update_worktree_location(struct worktree *wt,
Denton Liuad6dad02019-04-29 04:28:23 -0400112 const char *path_);
Nguyễn Thái Ngọc Duy9c620fc2018-02-12 16:49:35 +0700113
Eric Sunshinebdd1f3e2020-08-31 02:57:57 -0400114typedef void (* worktree_repair_fn)(int iserr, const char *path,
115 const char *msg, void *cb_data);
116
117/*
118 * Visit each registered linked worktree and repair corruptions. For each
119 * repair made or error encountered while attempting a repair, the callback
120 * function, if non-NULL, is called with the path of the worktree and a
121 * description of the repair or error, along with the callback user-data.
122 */
123void repair_worktrees(worktree_repair_fn, void *cb_data);
124
Nguyễn Thái Ngọc Duy9c620fc2018-02-12 16:49:35 +0700125/*
Eric Sunshineb214ab52020-08-31 02:57:58 -0400126 * Repair administrative files corresponding to the worktree at the given path.
127 * The worktree's .git file pointing at the repository must be intact for the
128 * repair to succeed. Useful for re-associating an orphaned worktree with the
129 * repository if the worktree has been moved manually (without using "git
130 * worktree move"). For each repair made or error encountered while attempting
131 * a repair, the callback function, if non-NULL, is called with the path of the
132 * worktree and a description of the repair or error, along with the callback
133 * user-data.
134 */
135void repair_worktree_at_path(const char *, worktree_repair_fn, void *cb_data);
136
137/*
Michael Rappazzo51934902015-10-08 13:01:03 -0400138 * Free up the memory for worktree(s)
139 */
Denton Liu55454422019-04-29 04:28:14 -0400140void free_worktrees(struct worktree **);
Michael Rappazzo51934902015-10-08 13:01:03 -0400141
Michael Rappazzoac6c5612015-10-02 07:55:31 -0400142/*
143 * Check if a per-worktree symref points to a ref in the main worktree
Nguyễn Thái Ngọc Duyd3b9ac02016-04-22 20:01:27 +0700144 * or any linked worktree, and return the worktree that holds the ref,
Anders Kaseorgc8dd4912021-12-01 14:15:43 -0800145 * or NULL otherwise.
Michael Rappazzoac6c5612015-10-02 07:55:31 -0400146 */
Anders Kaseorgc8dd4912021-12-01 14:15:43 -0800147const struct worktree *find_shared_symref(struct worktree **worktrees,
148 const char *symref,
Denton Liuad6dad02019-04-29 04:28:23 -0400149 const char *target);
Michael Rappazzoac6c5612015-10-02 07:55:31 -0400150
Nguyễn Thái Ngọc Duyd0c39a42017-08-23 19:36:59 +0700151/*
Rubén Justo662078c2023-02-25 15:21:51 +0100152 * Returns true if a symref points to a ref in a worktree.
153 */
154int is_shared_symref(const struct worktree *wt,
155 const char *symref, const char *target);
156
157/*
Nguyễn Thái Ngọc Duyd0c39a42017-08-23 19:36:59 +0700158 * Similar to head_ref() for all HEADs _except_ one from the current
159 * worktree, which is covered by head_ref().
160 */
161int other_head_refs(each_ref_fn fn, void *cb_data);
162
Nguyễn Thái Ngọc Duy14ace5b2016-04-22 20:01:36 +0700163int is_worktree_being_rebased(const struct worktree *wt, const char *target);
164int is_worktree_being_bisected(const struct worktree *wt, const char *target);
165
Nguyễn Thái Ngọc Duy2e641d52016-04-22 20:01:29 +0700166/*
167 * Similar to git_path() but can produce paths for a specified
168 * worktree instead of current one
169 */
Denton Liub199d712019-04-29 04:28:20 -0400170const char *worktree_git_path(const struct worktree *wt,
Denton Liuad6dad02019-04-29 04:28:23 -0400171 const char *fmt, ...)
Nguyễn Thái Ngọc Duy2e641d52016-04-22 20:01:29 +0700172 __attribute__((format (printf, 2, 3)));
173
Nguyễn Thái Ngọc Duy3a3b9d82018-10-21 10:08:54 +0200174/*
Nguyễn Thái Ngọc Duyab3e1f72018-10-21 10:08:56 +0200175 * Return a refname suitable for access from the current ref store.
176 */
177void strbuf_worktree_ref(const struct worktree *wt,
178 struct strbuf *sb,
179 const char *refname);
180
Derrick Stolee615a84a2022-02-07 21:32:59 +0000181/**
182 * Enable worktree config for the first time. This will make the following
183 * adjustments:
184 *
185 * 1. Add extensions.worktreeConfig=true in the common config file.
186 *
187 * 2. If the common config file has a core.worktree value, then that value
188 * is moved to the main worktree's config.worktree file.
189 *
190 * 3. If the common config file has a core.bare enabled, then that value
191 * is moved to the main worktree's config.worktree file.
192 *
193 * If extensions.worktreeConfig is already true, then this method
194 * terminates early without any of the above steps. The existing config
195 * arrangement is assumed to be intentional.
196 *
197 * Returns 0 on success. Reports an error message and returns non-zero
198 * if any of these steps fail.
199 */
200int init_worktree_config(struct repository *r);
201
Michael Rappazzoac6c5612015-10-02 07:55:31 -0400202#endif