|
|
|
@ -7,6 +7,7 @@ package git |
|
|
|
|
import ( |
|
|
|
|
"bufio" |
|
|
|
|
"bytes" |
|
|
|
|
"context" |
|
|
|
|
"io" |
|
|
|
|
"math" |
|
|
|
|
"strconv" |
|
|
|
@ -28,16 +29,20 @@ type WriteCloserError interface { |
|
|
|
|
func CatFileBatchCheck(repoPath string) (WriteCloserError, *bufio.Reader, func()) { |
|
|
|
|
batchStdinReader, batchStdinWriter := io.Pipe() |
|
|
|
|
batchStdoutReader, batchStdoutWriter := io.Pipe() |
|
|
|
|
ctx, ctxCancel := context.WithCancel(DefaultContext) |
|
|
|
|
closed := make(chan struct{}) |
|
|
|
|
cancel := func() { |
|
|
|
|
_ = batchStdinReader.Close() |
|
|
|
|
_ = batchStdinWriter.Close() |
|
|
|
|
_ = batchStdoutReader.Close() |
|
|
|
|
_ = batchStdoutWriter.Close() |
|
|
|
|
ctxCancel() |
|
|
|
|
<-closed |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
go func() { |
|
|
|
|
stderr := strings.Builder{} |
|
|
|
|
err := NewCommand("cat-file", "--batch-check").RunInDirFullPipeline(repoPath, batchStdoutWriter, &stderr, batchStdinReader) |
|
|
|
|
err := NewCommandContext(ctx, "cat-file", "--batch-check").RunInDirFullPipeline(repoPath, batchStdoutWriter, &stderr, batchStdinReader) |
|
|
|
|
if err != nil { |
|
|
|
|
_ = batchStdoutWriter.CloseWithError(ConcatenateError(err, (&stderr).String())) |
|
|
|
|
_ = batchStdinReader.CloseWithError(ConcatenateError(err, (&stderr).String())) |
|
|
|
@ -45,6 +50,7 @@ func CatFileBatchCheck(repoPath string) (WriteCloserError, *bufio.Reader, func() |
|
|
|
|
_ = batchStdoutWriter.Close() |
|
|
|
|
_ = batchStdinReader.Close() |
|
|
|
|
} |
|
|
|
|
close(closed) |
|
|
|
|
}() |
|
|
|
|
|
|
|
|
|
// For simplicities sake we'll use a buffered reader to read from the cat-file --batch-check
|
|
|
|
@ -59,16 +65,20 @@ func CatFileBatch(repoPath string) (WriteCloserError, *bufio.Reader, func()) { |
|
|
|
|
// so let's create a batch stdin and stdout
|
|
|
|
|
batchStdinReader, batchStdinWriter := io.Pipe() |
|
|
|
|
batchStdoutReader, batchStdoutWriter := nio.Pipe(buffer.New(32 * 1024)) |
|
|
|
|
ctx, ctxCancel := context.WithCancel(DefaultContext) |
|
|
|
|
closed := make(chan struct{}) |
|
|
|
|
cancel := func() { |
|
|
|
|
_ = batchStdinReader.Close() |
|
|
|
|
_ = batchStdinWriter.Close() |
|
|
|
|
_ = batchStdoutReader.Close() |
|
|
|
|
_ = batchStdoutWriter.Close() |
|
|
|
|
ctxCancel() |
|
|
|
|
<-closed |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
go func() { |
|
|
|
|
stderr := strings.Builder{} |
|
|
|
|
err := NewCommand("cat-file", "--batch").RunInDirFullPipeline(repoPath, batchStdoutWriter, &stderr, batchStdinReader) |
|
|
|
|
err := NewCommandContext(ctx, "cat-file", "--batch").RunInDirFullPipeline(repoPath, batchStdoutWriter, &stderr, batchStdinReader) |
|
|
|
|
if err != nil { |
|
|
|
|
_ = batchStdoutWriter.CloseWithError(ConcatenateError(err, (&stderr).String())) |
|
|
|
|
_ = batchStdinReader.CloseWithError(ConcatenateError(err, (&stderr).String())) |
|
|
|
@ -76,6 +86,7 @@ func CatFileBatch(repoPath string) (WriteCloserError, *bufio.Reader, func()) { |
|
|
|
|
_ = batchStdoutWriter.Close() |
|
|
|
|
_ = batchStdinReader.Close() |
|
|
|
|
} |
|
|
|
|
close(closed) |
|
|
|
|
}() |
|
|
|
|
|
|
|
|
|
// For simplicities sake we'll us a buffered reader to read from the cat-file --batch
|
|
|
|
|