blob: 90e1311fa73fa6bdde5249d68818eacb6dc8edd0 [file] [log] [blame]
Michael Rappazzoac6c5612015-10-02 07:55:31 -04001#ifndef WORKTREE_H
2#define WORKTREE_H
3
Michael Rappazzo51934902015-10-08 13:01:03 -04004struct worktree {
5 char *path;
Nguyễn Thái Ngọc Duy69dfe3b2016-04-22 20:01:26 +07006 char *id;
Michael Rappazzo92718b72015-10-08 13:01:04 -04007 char *head_ref;
Nguyễn Thái Ngọc Duy346ef532016-06-13 19:18:23 +07008 char *lock_reason; /* internal use */
Michael Rappazzo92718b72015-10-08 13:01:04 -04009 unsigned char head_sha1[20];
10 int is_detached;
11 int is_bare;
Nguyễn Thái Ngọc Duy750e8a62016-04-22 20:01:28 +070012 int is_current;
Nguyễn Thái Ngọc Duy346ef532016-06-13 19:18:23 +070013 int lock_reason_valid;
Michael Rappazzo51934902015-10-08 13:01:03 -040014};
15
16/* Functions for acting on the information about worktrees. */
17
18/*
19 * Get the worktrees. The primary worktree will always be the first returned,
20 * and linked worktrees will be pointed to by 'next' in each subsequent
21 * worktree. No specific ordering is done on the linked worktrees.
22 *
23 * The caller is responsible for freeing the memory from the returned
24 * worktree(s).
25 */
26extern struct worktree **get_worktrees(void);
27
28/*
Nguyễn Thái Ngọc Duy69dfe3b2016-04-22 20:01:26 +070029 * Return git dir of the worktree. Note that the path may be relative.
30 * If wt is NULL, git dir of current worktree is returned.
31 */
32extern const char *get_worktree_git_dir(const struct worktree *wt);
33
34/*
Nguyễn Thái Ngọc Duy68353142016-06-03 19:19:39 +070035 * Search a worktree that can be unambiguously identified by
36 * "arg". "prefix" must not be NULL.
37 */
38extern struct worktree *find_worktree(struct worktree **list,
39 const char *prefix,
40 const char *arg);
41
42/*
Nguyễn Thái Ngọc Duy984ad9e2016-06-03 19:19:40 +070043 * Return true if the given worktree is the main one.
44 */
45extern int is_main_worktree(const struct worktree *wt);
46
47/*
Nguyễn Thái Ngọc Duy346ef532016-06-13 19:18:23 +070048 * Return the reason string if the given worktree is locked or NULL
49 * otherwise.
50 */
51extern const char *is_worktree_locked(struct worktree *wt);
52
53/*
Michael Rappazzo51934902015-10-08 13:01:03 -040054 * Free up the memory for worktree(s)
55 */
56extern void free_worktrees(struct worktree **);
57
Michael Rappazzoac6c5612015-10-02 07:55:31 -040058/*
59 * 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 +070060 * or any linked worktree, and return the worktree that holds the ref,
61 * or NULL otherwise. The result may be destroyed by the next call.
Michael Rappazzoac6c5612015-10-02 07:55:31 -040062 */
Nguyễn Thái Ngọc Duyd3b9ac02016-04-22 20:01:27 +070063extern const struct worktree *find_shared_symref(const char *symref,
64 const char *target);
Michael Rappazzoac6c5612015-10-02 07:55:31 -040065
Nguyễn Thái Ngọc Duy14ace5b2016-04-22 20:01:36 +070066int is_worktree_being_rebased(const struct worktree *wt, const char *target);
67int is_worktree_being_bisected(const struct worktree *wt, const char *target);
68
Nguyễn Thái Ngọc Duy2e641d52016-04-22 20:01:29 +070069/*
70 * Similar to git_path() but can produce paths for a specified
71 * worktree instead of current one
72 */
73extern const char *worktree_git_path(const struct worktree *wt,
74 const char *fmt, ...)
75 __attribute__((format (printf, 2, 3)));
76
Michael Rappazzoac6c5612015-10-02 07:55:31 -040077#endif