Fast implementation of Git in pure Go
1package mix
2
3import (
4 "errors"
5 "fmt"
6 "io"
7
8 "codeberg.org/lindenii/furgit/objectid"
9 "codeberg.org/lindenii/furgit/objectstore"
10 "codeberg.org/lindenii/furgit/objecttype"
11)
12
13// ReadReaderFull reads a full serialized object stream from one backend that
14// has it.
15func (mix *Mix) ReadReaderFull(id objectid.ObjectID) (io.ReadCloser, error) {
16 for i, backend := 0, mix.firstBackend(); backend != nil; i, backend = i+1, mix.nextBackend(backend) {
17 reader, err := backend.ReadReaderFull(id)
18 if err == nil {
19 mix.touchBackend(backend)
20
21 return reader, nil
22 }
23
24 if errors.Is(err, objectstore.ErrObjectNotFound) {
25 continue
26 }
27
28 return nil, fmt.Errorf("objectstore: backend %d read reader full: %w", i, err)
29 }
30
31 return nil, objectstore.ErrObjectNotFound
32}
33
34// ReadReaderContent reads an object's type, declared content length, and
35// content stream from one backend that has it.
36func (mix *Mix) ReadReaderContent(id objectid.ObjectID) (objecttype.Type, int64, io.ReadCloser, error) {
37 for i, backend := 0, mix.firstBackend(); backend != nil; i, backend = i+1, mix.nextBackend(backend) {
38 ty, size, reader, err := backend.ReadReaderContent(id)
39 if err == nil {
40 mix.touchBackend(backend)
41
42 return ty, size, reader, nil
43 }
44
45 if errors.Is(err, objectstore.ErrObjectNotFound) {
46 continue
47 }
48
49 return objecttype.TypeInvalid, 0, nil, fmt.Errorf("objectstore: backend %d read reader content: %w", i, err)
50 }
51
52 return objecttype.TypeInvalid, 0, nil, objectstore.ErrObjectNotFound
53}