diff options
Diffstat (limited to 'ref/store/files/read_loose.go')
| -rw-r--r-- | ref/store/files/read_loose.go | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/ref/store/files/read_loose.go b/ref/store/files/read_loose.go new file mode 100644 index 00000000..fbbdb109 --- /dev/null +++ b/ref/store/files/read_loose.go @@ -0,0 +1,48 @@ +package files + +import ( + "errors" + "fmt" + "os" + "strings" + + objectid "codeberg.org/lindenii/furgit/object/id" + "codeberg.org/lindenii/furgit/ref" + "codeberg.org/lindenii/furgit/ref/store" +) + +func (store *Store) readLooseRef(name string) (ref.Ref, error) { //nolint:ireturn + refPath := store.loosePath(name) + + data, err := store.rootFor(refPath.root).ReadFile(refPath.path) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + return nil, refstore.ErrReferenceNotFound + } + + return nil, err + } + + line := strings.TrimRightFunc(string(data), isRefWhitespace) + if strings.HasPrefix(line, "ref:") { + target := strings.TrimLeftFunc(line[len("ref:"):], isRefWhitespace) + if target == "" { + return nil, brokenRefError{name: name, err: fmt.Errorf("empty symbolic target")} + } + + return ref.Symbolic{ + RefName: name, + Target: target, + }, nil + } + + id, err := objectid.ParseHex(store.algo, line) + if err != nil { + return nil, brokenRefError{name: name, err: err} + } + + return ref.Detached{ + RefName: name, + ID: id, + }, nil +} |
