Update Go-Git to take advantage of LargeObjectThreshold (#16316)
Following the merging of https://github.com/go-git/go-git/pull/330 we can now add a setting to avoid go-git reading and caching large objects. Signed-off-by: Andrew Thornton <art27@cantab.net>tokarchuk/v1.17
parent
4f26e0ac0e
commit
9979983283
@ -0,0 +1,79 @@ |
||||
package dotgit |
||||
|
||||
import ( |
||||
"fmt" |
||||
"io" |
||||
"os" |
||||
|
||||
"github.com/go-git/go-git/v5/plumbing" |
||||
"github.com/go-git/go-git/v5/plumbing/format/objfile" |
||||
"github.com/go-git/go-git/v5/utils/ioutil" |
||||
) |
||||
|
||||
var _ (plumbing.EncodedObject) = &EncodedObject{} |
||||
|
||||
type EncodedObject struct { |
||||
dir *DotGit |
||||
h plumbing.Hash |
||||
t plumbing.ObjectType |
||||
sz int64 |
||||
} |
||||
|
||||
func (e *EncodedObject) Hash() plumbing.Hash { |
||||
return e.h |
||||
} |
||||
|
||||
func (e *EncodedObject) Reader() (io.ReadCloser, error) { |
||||
f, err := e.dir.Object(e.h) |
||||
if err != nil { |
||||
if os.IsNotExist(err) { |
||||
return nil, plumbing.ErrObjectNotFound |
||||
} |
||||
|
||||
return nil, err |
||||
} |
||||
r, err := objfile.NewReader(f) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
t, size, err := r.Header() |
||||
if err != nil { |
||||
_ = r.Close() |
||||
return nil, err |
||||
} |
||||
if t != e.t { |
||||
_ = r.Close() |
||||
return nil, objfile.ErrHeader |
||||
} |
||||
if size != e.sz { |
||||
_ = r.Close() |
||||
return nil, objfile.ErrHeader |
||||
} |
||||
return ioutil.NewReadCloserWithCloser(r, f.Close), nil |
||||
} |
||||
|
||||
func (e *EncodedObject) SetType(plumbing.ObjectType) {} |
||||
|
||||
func (e *EncodedObject) Type() plumbing.ObjectType { |
||||
return e.t |
||||
} |
||||
|
||||
func (e *EncodedObject) Size() int64 { |
||||
return e.sz |
||||
} |
||||
|
||||
func (e *EncodedObject) SetSize(int64) {} |
||||
|
||||
func (e *EncodedObject) Writer() (io.WriteCloser, error) { |
||||
return nil, fmt.Errorf("Not supported") |
||||
} |
||||
|
||||
func NewEncodedObject(dir *DotGit, h plumbing.Hash, t plumbing.ObjectType, size int64) *EncodedObject { |
||||
return &EncodedObject{ |
||||
dir: dir, |
||||
h: h, |
||||
t: t, |
||||
sz: size, |
||||
} |
||||
} |
Loading…
Reference in new issue