diff options
Diffstat (limited to 'worktree.c')
-rw-r--r-- | worktree.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/worktree.c b/worktree.c index b0d0b5426d..4193496f2a 100644 --- a/worktree.c +++ b/worktree.c @@ -487,6 +487,36 @@ int submodule_uses_worktrees(const char *path) return ret; } +int parse_worktree_ref(const char *worktree_ref, const char **name, + int *name_length, const char **ref) +{ + if (skip_prefix(worktree_ref, "main-worktree/", &worktree_ref)) { + if (!*worktree_ref) + return -1; + if (name) + *name = NULL; + if (name_length) + *name_length = 0; + if (ref) + *ref = worktree_ref; + return 0; + } + if (skip_prefix(worktree_ref, "worktrees/", &worktree_ref)) { + const char *slash = strchr(worktree_ref, '/'); + + if (!slash || slash == worktree_ref || !slash[1]) + return -1; + if (name) + *name = worktree_ref; + if (name_length) + *name_length = slash - worktree_ref; + if (ref) + *ref = slash + 1; + return 0; + } + return -1; +} + int other_head_refs(each_ref_fn fn, void *cb_data) { struct worktree **worktrees, **p; |