ref: df1f2fb3daa1acd25c88510f259d5535fb482126
dir: /ref/store/files/read_resolve_fully.go/
package files
import (
"fmt"
"strings"
"codeberg.org/lindenii/furgit/ref"
)
// ResolveToDetached resolves symbolic references through the visible files store
// namespace until one detached reference is reached.
func (store *Store) ResolveToDetached(name string) (ref.Detached, error) {
cur := name
seen := make(map[string]struct{})
for {
if _, ok := seen[cur]; ok {
return ref.Detached{}, fmt.Errorf("refstore/files: symbolic reference cycle at %q", cur)
}
seen[cur] = struct{}{}
resolved, err := store.Resolve(cur)
if err != nil {
return ref.Detached{}, err
}
switch resolved := resolved.(type) {
case ref.Detached:
return resolved, nil
case ref.Symbolic:
target := strings.TrimSpace(resolved.Target)
if target == "" {
return ref.Detached{}, fmt.Errorf("refstore/files: symbolic reference %q has empty target", resolved.Name())
}
cur = target
default:
return ref.Detached{}, fmt.Errorf("refstore/files: unsupported reference type %T", resolved)
}
}
}