update go min version Update Vendors: * code.gitea.io/gitea-vet v0.2.0 -> v0.2.1 * code.gitea.io/sdk/gitea v0.13.0 -> v0.13.1 * github.com/AlecAivazis/survey v2.1.1 -> v2.2.2 * github.com/adrg/xdg v0.2.1 -> v0.2.2 * github.com/araddon/dateparse d820a6159ab1 -> 8aadafed4dc4 * github.com/go-git/go-git v5.1.0 -> v5.2.0 * github.com/muesli/termenv v0.7.2 -> v0.7.4 * github.com/stretchr/testify v1.5.1 -> v1.6.1 * github.com/urfave/cli v2.2.0 -> v2.3.0 Co-authored-by: 6543 <6543@obermui.de> Reviewed-on: https://gitea.com/gitea/tea/pulls/250 Reviewed-by: Andrew Thornton <art27@cantab.net> Reviewed-by: mrsdizzie <info@mrsdizzie.com> Co-Authored-By: 6543 <6543@noreply.gitea.io> Co-Committed-By: 6543 <6543@noreply.gitea.io>
73 lines
1.9 KiB
Go
73 lines
1.9 KiB
Go
package plumbing
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
)
|
|
|
|
// MemoryObject on memory Object implementation
|
|
type MemoryObject struct {
|
|
t ObjectType
|
|
h Hash
|
|
cont []byte
|
|
sz int64
|
|
}
|
|
|
|
// Hash returns the object Hash, the hash is calculated on-the-fly the first
|
|
// time it's called, in all subsequent calls the same Hash is returned even
|
|
// if the type or the content have changed. The Hash is only generated if the
|
|
// size of the content is exactly the object size.
|
|
func (o *MemoryObject) Hash() Hash {
|
|
if o.h == ZeroHash && int64(len(o.cont)) == o.sz {
|
|
o.h = ComputeHash(o.t, o.cont)
|
|
}
|
|
|
|
return o.h
|
|
}
|
|
|
|
// Type return the ObjectType
|
|
func (o *MemoryObject) Type() ObjectType { return o.t }
|
|
|
|
// SetType sets the ObjectType
|
|
func (o *MemoryObject) SetType(t ObjectType) { o.t = t }
|
|
|
|
// Size return the size of the object
|
|
func (o *MemoryObject) Size() int64 { return o.sz }
|
|
|
|
// SetSize set the object size, a content of the given size should be written
|
|
// afterwards
|
|
func (o *MemoryObject) SetSize(s int64) { o.sz = s }
|
|
|
|
// Reader returns an io.ReadCloser used to read the object's content.
|
|
//
|
|
// For a MemoryObject, this reader is seekable.
|
|
func (o *MemoryObject) Reader() (io.ReadCloser, error) {
|
|
return nopCloser{bytes.NewReader(o.cont)}, nil
|
|
}
|
|
|
|
// Writer returns a ObjectWriter used to write the object's content.
|
|
func (o *MemoryObject) Writer() (io.WriteCloser, error) {
|
|
return o, nil
|
|
}
|
|
|
|
func (o *MemoryObject) Write(p []byte) (n int, err error) {
|
|
o.cont = append(o.cont, p...)
|
|
o.sz = int64(len(o.cont))
|
|
|
|
return len(p), nil
|
|
}
|
|
|
|
// Close releases any resources consumed by the object when it is acting as a
|
|
// ObjectWriter.
|
|
func (o *MemoryObject) Close() error { return nil }
|
|
|
|
// nopCloser exposes the extra methods of bytes.Reader while nopping Close().
|
|
//
|
|
// This allows clients to attempt seeking in a cached Blob's Reader.
|
|
type nopCloser struct {
|
|
*bytes.Reader
|
|
}
|
|
|
|
// Close does nothing.
|
|
func (nc nopCloser) Close() error { return nil }
|