aboutsummaryrefslogtreecommitdiff
path: root/ref/store/files/read_loose.go
diff options
context:
space:
mode:
Diffstat (limited to 'ref/store/files/read_loose.go')
-rw-r--r--ref/store/files/read_loose.go48
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
+}