ref: 1556cfb51d980ae8c5bf664ad69f3abd46f02386
dir: /refstore/files/update_resolve_target_ordinary.go/
package files
import (
"fmt"
"strings"
"codeberg.org/lindenii/furgit/refstore"
)
func (executor *refUpdateExecutor) resolveOrdinaryTarget(name string, allowMissing bool) (resolvedUpdateTarget, error) {
cur := name
seen := make(map[string]struct{})
for {
if _, ok := seen[cur]; ok {
return resolvedUpdateTarget{}, fmt.Errorf("refstore/files: symbolic reference cycle at %q", cur)
}
seen[cur] = struct{}{}
refState, err := executor.directRead(cur)
if err != nil {
return resolvedUpdateTarget{}, err
}
switch refState.kind {
case directMissing:
if !allowMissing {
return resolvedUpdateTarget{}, wrapUpdateError(name, refstore.ErrReferenceNotFound)
}
return resolvedUpdateTarget{name: cur, loc: executor.store.loosePath(cur), ref: refState}, nil
case directDetached:
return resolvedUpdateTarget{name: cur, loc: executor.store.loosePath(cur), ref: refState}, nil
case directSymbolic:
target := strings.TrimSpace(refState.target)
if target == "" {
return resolvedUpdateTarget{}, wrapUpdateError(name, &refstore.InvalidValueError{
Err: fmt.Errorf("symbolic reference has empty target"),
})
}
cur = target
default:
return resolvedUpdateTarget{}, fmt.Errorf("refstore/files: unsupported direct reference state %d", refState.kind)
}
}
}