diff options
| author | 2026-03-07 18:09:20 +0800 | |
|---|---|---|
| committer | 2026-03-07 18:17:54 +0800 | |
| commit | e667c3c52a535ee67fe895bb0240fbad6e920087 (patch) | |
| tree | 0815f7cc9b2c4a06d00722bce4c3ac57c515288b /refstore/files/packed_refs.go | |
| parent | receivepack: Connect protocol with service (diff) | |
| signature | No signature | |
refstore/files: Accept timeout instead of reading from config
And split things up again.
Diffstat (limited to 'refstore/files/packed_refs.go')
| -rw-r--r-- | refstore/files/packed_refs.go | 140 |
1 files changed, 0 insertions, 140 deletions
diff --git a/refstore/files/packed_refs.go b/refstore/files/packed_refs.go index 0c534f59..f3e91d83 100644 --- a/refstore/files/packed_refs.go +++ b/refstore/files/packed_refs.go @@ -1,14 +1,6 @@ package files import ( - "bufio" - "errors" - "fmt" - "io" - "os" - "strings" - - "codeberg.org/lindenii/furgit/objectid" "codeberg.org/lindenii/furgit/ref" ) @@ -16,135 +8,3 @@ type packedRefs struct { byName map[string]ref.Detached ordered []ref.Detached } - -func (store *Store) readPackedRefs() (*packedRefs, error) { - file, err := store.commonRoot.Open("packed-refs") - if err != nil { - if errorsIsNotExist(err) { - return &packedRefs{ - byName: make(map[string]ref.Detached), - ordered: nil, - }, nil - } - - return nil, fmt.Errorf("refstore/files: open packed-refs: %w", err) - } - - defer func() { _ = file.Close() }() - - byName, ordered, err := parsePackedRefs(file, store.algo) - if err != nil { - return nil, err - } - - return &packedRefs{ - byName: byName, - ordered: ordered, - }, nil -} - -func parsePackedRefs(r io.Reader, algo objectid.Algorithm) (map[string]ref.Detached, []ref.Detached, error) { - byName := make(map[string]ref.Detached) - ordered := make([]ref.Detached, 0, 32) - - br := bufio.NewReader(r) - prev := -1 - lineNum := 0 - hexsz := algo.Size() * 2 - - for { - line, err := br.ReadString('\n') - if err != nil && err != io.EOF { - return nil, nil, err - } - - if line == "" && err == io.EOF { - break - } - - lineNum++ - hadNewline := strings.HasSuffix(line, "\n") - line = strings.TrimSuffix(line, "\n") - - if err == io.EOF && !hadNewline { - return nil, nil, fmt.Errorf("refstore/files: line %d: unterminated line", lineNum) - } - - if line == "" || strings.HasPrefix(line, "#") { - if err == io.EOF { - break - } - - continue - } - - if strings.HasPrefix(line, "^") { - if prev < 0 { - return nil, nil, fmt.Errorf("refstore/files: line %d: peeled line without preceding ref", lineNum) - } - - if len(line) != hexsz+1 { - return nil, nil, fmt.Errorf("refstore/files: line %d: malformed peeled line", lineNum) - } - - peeled, parseErr := objectid.ParseHex(algo, line[1:]) - if parseErr != nil { - return nil, nil, fmt.Errorf("refstore/files: line %d: invalid peeled oid: %w", lineNum, parseErr) - } - - peeledCopy := peeled - cur := ordered[prev] - cur.Peeled = &peeledCopy - ordered[prev] = cur - byName[cur.Name()] = cur - - if err == io.EOF { - break - } - - continue - } - - if len(line) < hexsz+2 { - return nil, nil, fmt.Errorf("refstore/files: line %d: malformed entry", lineNum) - } - - if line[hexsz] != ' ' { - return nil, nil, fmt.Errorf("refstore/files: line %d: malformed entry", lineNum) - } - - idText := line[:hexsz] - - name := line[hexsz+1:] - if name == "" { - return nil, nil, fmt.Errorf("refstore/files: line %d: empty ref name", lineNum) - } - - id, parseErr := objectid.ParseHex(algo, idText) - if parseErr != nil { - return nil, nil, fmt.Errorf("refstore/files: line %d: invalid oid: %w", lineNum, parseErr) - } - - if _, exists := byName[name]; exists { - return nil, nil, fmt.Errorf("refstore/files: line %d: duplicate ref %q", lineNum, name) - } - - detached := ref.Detached{ - RefName: name, - ID: id, - } - ordered = append(ordered, detached) - prev = len(ordered) - 1 - byName[name] = detached - - if err == io.EOF { - break - } - } - - return byName, ordered, nil -} - -func errorsIsNotExist(err error) bool { - return errors.Is(err, os.ErrNotExist) -} |
