mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Propagate context and ensure git commands run in request context (#17868)
This PR continues the work in #17125 by progressively ensuring that git commands run within the request context. This now means that the if there is a git repo already open in the context it will be used instead of reopening it. Signed-off-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
		@@ -7,6 +7,7 @@ package pipeline
 | 
			
		||||
import (
 | 
			
		||||
	"bufio"
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"strconv"
 | 
			
		||||
@@ -18,27 +19,27 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// CatFileBatchCheck runs cat-file with --batch-check
 | 
			
		||||
func CatFileBatchCheck(shasToCheckReader *io.PipeReader, catFileCheckWriter *io.PipeWriter, wg *sync.WaitGroup, tmpBasePath string) {
 | 
			
		||||
func CatFileBatchCheck(ctx context.Context, shasToCheckReader *io.PipeReader, catFileCheckWriter *io.PipeWriter, wg *sync.WaitGroup, tmpBasePath string) {
 | 
			
		||||
	defer wg.Done()
 | 
			
		||||
	defer shasToCheckReader.Close()
 | 
			
		||||
	defer catFileCheckWriter.Close()
 | 
			
		||||
 | 
			
		||||
	stderr := new(bytes.Buffer)
 | 
			
		||||
	var errbuf strings.Builder
 | 
			
		||||
	cmd := git.NewCommand("cat-file", "--batch-check")
 | 
			
		||||
	cmd := git.NewCommandContext(ctx, "cat-file", "--batch-check")
 | 
			
		||||
	if err := cmd.RunInDirFullPipeline(tmpBasePath, catFileCheckWriter, stderr, shasToCheckReader); err != nil {
 | 
			
		||||
		_ = catFileCheckWriter.CloseWithError(fmt.Errorf("git cat-file --batch-check [%s]: %v - %s", tmpBasePath, err, errbuf.String()))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CatFileBatchCheckAllObjects runs cat-file with --batch-check --batch-all
 | 
			
		||||
func CatFileBatchCheckAllObjects(catFileCheckWriter *io.PipeWriter, wg *sync.WaitGroup, tmpBasePath string, errChan chan<- error) {
 | 
			
		||||
func CatFileBatchCheckAllObjects(ctx context.Context, catFileCheckWriter *io.PipeWriter, wg *sync.WaitGroup, tmpBasePath string, errChan chan<- error) {
 | 
			
		||||
	defer wg.Done()
 | 
			
		||||
	defer catFileCheckWriter.Close()
 | 
			
		||||
 | 
			
		||||
	stderr := new(bytes.Buffer)
 | 
			
		||||
	var errbuf strings.Builder
 | 
			
		||||
	cmd := git.NewCommand("cat-file", "--batch-check", "--batch-all-objects")
 | 
			
		||||
	cmd := git.NewCommandContext(ctx, "cat-file", "--batch-check", "--batch-all-objects")
 | 
			
		||||
	if err := cmd.RunInDirPipeline(tmpBasePath, catFileCheckWriter, stderr); err != nil {
 | 
			
		||||
		log.Error("git cat-file --batch-check --batch-all-object [%s]: %v - %s", tmpBasePath, err, errbuf.String())
 | 
			
		||||
		err = fmt.Errorf("git cat-file --batch-check --batch-all-object [%s]: %v - %s", tmpBasePath, err, errbuf.String())
 | 
			
		||||
@@ -48,14 +49,14 @@ func CatFileBatchCheckAllObjects(catFileCheckWriter *io.PipeWriter, wg *sync.Wai
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CatFileBatch runs cat-file --batch
 | 
			
		||||
func CatFileBatch(shasToBatchReader *io.PipeReader, catFileBatchWriter *io.PipeWriter, wg *sync.WaitGroup, tmpBasePath string) {
 | 
			
		||||
func CatFileBatch(ctx context.Context, shasToBatchReader *io.PipeReader, catFileBatchWriter *io.PipeWriter, wg *sync.WaitGroup, tmpBasePath string) {
 | 
			
		||||
	defer wg.Done()
 | 
			
		||||
	defer shasToBatchReader.Close()
 | 
			
		||||
	defer catFileBatchWriter.Close()
 | 
			
		||||
 | 
			
		||||
	stderr := new(bytes.Buffer)
 | 
			
		||||
	var errbuf strings.Builder
 | 
			
		||||
	if err := git.NewCommand("cat-file", "--batch").RunInDirFullPipeline(tmpBasePath, catFileBatchWriter, stderr, shasToBatchReader); err != nil {
 | 
			
		||||
	if err := git.NewCommandContext(ctx, "cat-file", "--batch").RunInDirFullPipeline(tmpBasePath, catFileBatchWriter, stderr, shasToBatchReader); err != nil {
 | 
			
		||||
		_ = shasToBatchReader.CloseWithError(fmt.Errorf("git rev-list [%s]: %v - %s", tmpBasePath, err, errbuf.String()))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -120,7 +120,7 @@ func FindLFSFile(repo *git.Repository, hash git.SHA1) ([]*LFSResult, error) {
 | 
			
		||||
			i++
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
	go NameRevStdin(shasToNameReader, nameRevStdinWriter, &wg, basePath)
 | 
			
		||||
	go NameRevStdin(repo.Ctx, shasToNameReader, nameRevStdinWriter, &wg, basePath)
 | 
			
		||||
	go func() {
 | 
			
		||||
		defer wg.Done()
 | 
			
		||||
		defer shasToNameWriter.Close()
 | 
			
		||||
 
 | 
			
		||||
@@ -53,7 +53,7 @@ func FindLFSFile(repo *git.Repository, hash git.SHA1) ([]*LFSResult, error) {
 | 
			
		||||
 | 
			
		||||
	go func() {
 | 
			
		||||
		stderr := strings.Builder{}
 | 
			
		||||
		err := git.NewCommand("rev-list", "--all").RunInDirPipeline(repo.Path, revListWriter, &stderr)
 | 
			
		||||
		err := git.NewCommandContext(repo.Ctx, "rev-list", "--all").RunInDirPipeline(repo.Path, revListWriter, &stderr)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			_ = revListWriter.CloseWithError(git.ConcatenateError(err, (&stderr).String()))
 | 
			
		||||
		} else {
 | 
			
		||||
@@ -212,7 +212,7 @@ func FindLFSFile(repo *git.Repository, hash git.SHA1) ([]*LFSResult, error) {
 | 
			
		||||
			i++
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
	go NameRevStdin(shasToNameReader, nameRevStdinWriter, &wg, basePath)
 | 
			
		||||
	go NameRevStdin(repo.Ctx, shasToNameReader, nameRevStdinWriter, &wg, basePath)
 | 
			
		||||
	go func() {
 | 
			
		||||
		defer wg.Done()
 | 
			
		||||
		defer shasToNameWriter.Close()
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@ package pipeline
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"strings"
 | 
			
		||||
@@ -15,14 +16,14 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// NameRevStdin runs name-rev --stdin
 | 
			
		||||
func NameRevStdin(shasToNameReader *io.PipeReader, nameRevStdinWriter *io.PipeWriter, wg *sync.WaitGroup, tmpBasePath string) {
 | 
			
		||||
func NameRevStdin(ctx context.Context, shasToNameReader *io.PipeReader, nameRevStdinWriter *io.PipeWriter, wg *sync.WaitGroup, tmpBasePath string) {
 | 
			
		||||
	defer wg.Done()
 | 
			
		||||
	defer shasToNameReader.Close()
 | 
			
		||||
	defer nameRevStdinWriter.Close()
 | 
			
		||||
 | 
			
		||||
	stderr := new(bytes.Buffer)
 | 
			
		||||
	var errbuf strings.Builder
 | 
			
		||||
	if err := git.NewCommand("name-rev", "--stdin", "--name-only", "--always").RunInDirFullPipeline(tmpBasePath, nameRevStdinWriter, stderr, shasToNameReader); err != nil {
 | 
			
		||||
	if err := git.NewCommandContext(ctx, "name-rev", "--stdin", "--name-only", "--always").RunInDirFullPipeline(tmpBasePath, nameRevStdinWriter, stderr, shasToNameReader); err != nil {
 | 
			
		||||
		_ = shasToNameReader.CloseWithError(fmt.Errorf("git name-rev [%s]: %v - %s", tmpBasePath, err, errbuf.String()))
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ package pipeline
 | 
			
		||||
import (
 | 
			
		||||
	"bufio"
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"strings"
 | 
			
		||||
@@ -17,13 +18,13 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// RevListAllObjects runs rev-list --objects --all and writes to a pipewriter
 | 
			
		||||
func RevListAllObjects(revListWriter *io.PipeWriter, wg *sync.WaitGroup, basePath string, errChan chan<- error) {
 | 
			
		||||
func RevListAllObjects(ctx context.Context, revListWriter *io.PipeWriter, wg *sync.WaitGroup, basePath string, errChan chan<- error) {
 | 
			
		||||
	defer wg.Done()
 | 
			
		||||
	defer revListWriter.Close()
 | 
			
		||||
 | 
			
		||||
	stderr := new(bytes.Buffer)
 | 
			
		||||
	var errbuf strings.Builder
 | 
			
		||||
	cmd := git.NewCommand("rev-list", "--objects", "--all")
 | 
			
		||||
	cmd := git.NewCommandContext(ctx, "rev-list", "--objects", "--all")
 | 
			
		||||
	if err := cmd.RunInDirPipeline(basePath, revListWriter, stderr); err != nil {
 | 
			
		||||
		log.Error("git rev-list --objects --all [%s]: %v - %s", basePath, err, errbuf.String())
 | 
			
		||||
		err = fmt.Errorf("git rev-list --objects --all [%s]: %v - %s", basePath, err, errbuf.String())
 | 
			
		||||
@@ -33,12 +34,12 @@ func RevListAllObjects(revListWriter *io.PipeWriter, wg *sync.WaitGroup, basePat
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RevListObjects run rev-list --objects from headSHA to baseSHA
 | 
			
		||||
func RevListObjects(revListWriter *io.PipeWriter, wg *sync.WaitGroup, tmpBasePath, headSHA, baseSHA string, errChan chan<- error) {
 | 
			
		||||
func RevListObjects(ctx context.Context, revListWriter *io.PipeWriter, wg *sync.WaitGroup, tmpBasePath, headSHA, baseSHA string, errChan chan<- error) {
 | 
			
		||||
	defer wg.Done()
 | 
			
		||||
	defer revListWriter.Close()
 | 
			
		||||
	stderr := new(bytes.Buffer)
 | 
			
		||||
	var errbuf strings.Builder
 | 
			
		||||
	cmd := git.NewCommand("rev-list", "--objects", headSHA, "--not", baseSHA)
 | 
			
		||||
	cmd := git.NewCommandContext(ctx, "rev-list", "--objects", headSHA, "--not", baseSHA)
 | 
			
		||||
	if err := cmd.RunInDirPipeline(tmpBasePath, revListWriter, stderr); err != nil {
 | 
			
		||||
		log.Error("git rev-list [%s]: %v - %s", tmpBasePath, err, errbuf.String())
 | 
			
		||||
		errChan <- fmt.Errorf("git rev-list [%s]: %v - %s", tmpBasePath, err, errbuf.String())
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user