"io"
"strconv"
"strings"
+
+ gitea_log "code.gitea.io/gitea/modules/log"
)
// Blob represents a Git object.
// Calling the Close function on the result will discard all unread output.
func (b *Blob) DataAsync() (io.ReadCloser, error) {
stdoutReader, stdoutWriter := io.Pipe()
- var err error
go func() {
stderr := &strings.Builder{}
- err = NewCommand("cat-file", "--batch").RunInDirFullPipeline(b.repoPath, stdoutWriter, stderr, strings.NewReader(b.ID.String()+"\n"))
+ err := NewCommand("cat-file", "--batch").RunInDirFullPipeline(b.repoPath, stdoutWriter, stderr, strings.NewReader(b.ID.String()+"\n"))
if err != nil {
err = ConcatenateError(err, stderr.String())
+ gitea_log.Error("Blob.DataAsync Error: %v", err)
_ = stdoutWriter.CloseWithError(err)
} else {
_ = stdoutWriter.Close()
return &LimitedReaderCloser{
R: bufReader,
C: stdoutReader,
- N: int64(size),
- }, err
+ N: size,
+ }, nil
}
// Size returns the uncompressed size of the blob
// ErrExecTimeout represent a timeout error
ErrExecTimeout = errors.New("Process execution timeout")
manager *Manager
+ managerInit sync.Once
// DefaultContext is the default context to run processing commands in
DefaultContext = context.Background()
// GetManager returns a Manager and initializes one as singleton if there's none yet
func GetManager() *Manager {
- if manager == nil {
+ managerInit.Do(func() {
manager = &Manager{
processes: make(map[int64]*Process),
}
- }
+ })
return manager
}
"github.com/stretchr/testify/assert"
)
+func TestGetManager(t *testing.T) {
+ go func() {
+ // test race protection
+ _ = GetManager()
+ }()
+ pm := GetManager()
+ assert.NotNil(t, pm)
+}
+
func TestManager_Add(t *testing.T) {
pm := Manager{processes: make(map[int64]*Process)}