mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-10-26 20:11:02 +00:00 
			
		
		
		
	Change all license headers to comply with REUSE specification. Fix #16132 Co-authored-by: flynnnnnnnnnn <flynnnnnnnnnn@github> Co-authored-by: John Olheiser <john.olheiser@gmail.com>
		
			
				
	
	
		
			108 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright 2019 The Gitea Authors. All rights reserved.
 | |
| // SPDX-License-Identifier: MIT
 | |
| 
 | |
| package pipeline
 | |
| 
 | |
| import (
 | |
| 	"bufio"
 | |
| 	"bytes"
 | |
| 	"context"
 | |
| 	"fmt"
 | |
| 	"io"
 | |
| 	"strconv"
 | |
| 	"strings"
 | |
| 	"sync"
 | |
| 
 | |
| 	"code.gitea.io/gitea/modules/git"
 | |
| 	"code.gitea.io/gitea/modules/log"
 | |
| )
 | |
| 
 | |
| // CatFileBatchCheck runs cat-file with --batch-check
 | |
| 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(ctx, "cat-file", "--batch-check")
 | |
| 	if err := cmd.Run(&git.RunOpts{
 | |
| 		Dir:    tmpBasePath,
 | |
| 		Stdin:  shasToCheckReader,
 | |
| 		Stdout: catFileCheckWriter,
 | |
| 		Stderr: stderr,
 | |
| 	}); err != nil {
 | |
| 		_ = catFileCheckWriter.CloseWithError(fmt.Errorf("git cat-file --batch-check [%s]: %w - %s", tmpBasePath, err, errbuf.String()))
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // CatFileBatchCheckAllObjects runs cat-file with --batch-check --batch-all
 | |
| 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(ctx, "cat-file", "--batch-check", "--batch-all-objects")
 | |
| 	if err := cmd.Run(&git.RunOpts{
 | |
| 		Dir:    tmpBasePath,
 | |
| 		Stdout: catFileCheckWriter,
 | |
| 		Stderr: 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]: %w - %s", tmpBasePath, err, errbuf.String())
 | |
| 		_ = catFileCheckWriter.CloseWithError(err)
 | |
| 		errChan <- err
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // CatFileBatch runs cat-file --batch
 | |
| 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(ctx, "cat-file", "--batch").Run(&git.RunOpts{
 | |
| 		Dir:    tmpBasePath,
 | |
| 		Stdout: catFileBatchWriter,
 | |
| 		Stdin:  shasToBatchReader,
 | |
| 		Stderr: stderr,
 | |
| 	}); err != nil {
 | |
| 		_ = shasToBatchReader.CloseWithError(fmt.Errorf("git rev-list [%s]: %w - %s", tmpBasePath, err, errbuf.String()))
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // BlobsLessThan1024FromCatFileBatchCheck reads a pipeline from cat-file --batch-check and returns the blobs <1024 in size
 | |
| func BlobsLessThan1024FromCatFileBatchCheck(catFileCheckReader *io.PipeReader, shasToBatchWriter *io.PipeWriter, wg *sync.WaitGroup) {
 | |
| 	defer wg.Done()
 | |
| 	defer catFileCheckReader.Close()
 | |
| 	scanner := bufio.NewScanner(catFileCheckReader)
 | |
| 	defer func() {
 | |
| 		_ = shasToBatchWriter.CloseWithError(scanner.Err())
 | |
| 	}()
 | |
| 	for scanner.Scan() {
 | |
| 		line := scanner.Text()
 | |
| 		if len(line) == 0 {
 | |
| 			continue
 | |
| 		}
 | |
| 		fields := strings.Split(line, " ")
 | |
| 		if len(fields) < 3 || fields[1] != "blob" {
 | |
| 			continue
 | |
| 		}
 | |
| 		size, _ := strconv.Atoi(fields[2])
 | |
| 		if size > 1024 {
 | |
| 			continue
 | |
| 		}
 | |
| 		toWrite := []byte(fields[0] + "\n")
 | |
| 		for len(toWrite) > 0 {
 | |
| 			n, err := shasToBatchWriter.Write(toWrite)
 | |
| 			if err != nil {
 | |
| 				_ = catFileCheckReader.CloseWithError(err)
 | |
| 				break
 | |
| 			}
 | |
| 			toWrite = toWrite[n:]
 | |
| 		}
 | |
| 	}
 | |
| }
 |