diff options
| author | 2026-03-26 09:19:01 +0000 | |
|---|---|---|
| committer | 2026-03-26 09:19:01 +0000 | |
| commit | 929b8cc620abca70b3444b09be5249f6c6cb7812 (patch) | |
| tree | 29b1edba8f597d09a2a51a6b2c901389cc40e242 /ref/name/worktree.go | |
| parent | format: Move commitgraph and packfile here (diff) | |
| signature | No signature | |
ref/name: Rename from ref/refname
Diffstat (limited to 'ref/name/worktree.go')
| -rw-r--r-- | ref/name/worktree.go | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/ref/name/worktree.go b/ref/name/worktree.go new file mode 100644 index 00000000..48ca215d --- /dev/null +++ b/ref/name/worktree.go @@ -0,0 +1,75 @@ +package refname + +import "strings" + +// WorktreeType classifies one worktree-qualified refname prefix. +type WorktreeType uint8 + +const ( + // WorktreeShared is one ordinary shared refname. + WorktreeShared WorktreeType = iota + + // WorktreeCurrent is one current-worktree-only refname like HEAD or refs/worktree/... + WorktreeCurrent + + // WorktreeMain is one main-worktree-qualified refname like main-worktree/HEAD. + WorktreeMain + + // WorktreeOther is one other-worktree-qualified refname like worktrees/wt1/HEAD. + WorktreeOther +) + +// IsPerWorktree reports whether name is one per-worktree ref namespace. +func IsPerWorktree(name string) bool { + return strings.HasPrefix(name, "refs/worktree/") || + strings.HasPrefix(name, "refs/bisect/") || + strings.HasPrefix(name, "refs/rewritten/") +} + +// ParsedWorktreeRef is the result of parsing one worktree-qualified refname. +type ParsedWorktreeRef struct { + Type WorktreeType + WorktreeName string + BareRefName string +} + +// ParseWorktree parses Git's worktree ref prefixes. +func ParseWorktree(name string) ParsedWorktreeRef { + if bare, ok := strings.CutPrefix(name, "worktrees/"); ok { + worktreeName, rest, found := strings.Cut(bare, "/") + if !found { + return ParsedWorktreeRef{ + Type: WorktreeOther, + WorktreeName: worktreeName, + BareRefName: "", + } + } + + if isCurrentWorktreeRef(rest) { + return ParsedWorktreeRef{ + Type: WorktreeOther, + WorktreeName: worktreeName, + BareRefName: rest, + } + } + } + + if bare, ok := strings.CutPrefix(name, "main-worktree/"); ok && isCurrentWorktreeRef(bare) { + return ParsedWorktreeRef{ + Type: WorktreeMain, + BareRefName: bare, + } + } + + if isCurrentWorktreeRef(name) { + return ParsedWorktreeRef{ + Type: WorktreeCurrent, + BareRefName: name, + } + } + + return ParsedWorktreeRef{ + Type: WorktreeShared, + BareRefName: name, + } +} |
