mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Fix lfs management find (#15537)
Fix #15236 * Do not do 40byte conversion within ParseTreeLine * Missed a to40ByteSHA Signed-off-by: Andrew Thornton <art27@cantab.net> Co-authored-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
		@@ -149,10 +149,10 @@ headerLoop:
 | 
			
		||||
// constant hextable to help quickly convert between 20byte and 40byte hashes
 | 
			
		||||
const hextable = "0123456789abcdef"
 | 
			
		||||
 | 
			
		||||
// to40ByteSHA converts a 20-byte SHA in a 40-byte slice into a 40-byte sha in place
 | 
			
		||||
// To40ByteSHA converts a 20-byte SHA in a 40-byte slice into a 40-byte sha in place
 | 
			
		||||
// without allocations. This is at least 100x quicker that hex.EncodeToString
 | 
			
		||||
// NB This requires that sha is a 40-byte slice
 | 
			
		||||
func to40ByteSHA(sha []byte) []byte {
 | 
			
		||||
func To40ByteSHA(sha []byte) []byte {
 | 
			
		||||
	for i := 19; i >= 0; i-- {
 | 
			
		||||
		v := sha[i]
 | 
			
		||||
		vhi, vlo := v>>4, v&0x0f
 | 
			
		||||
 
 | 
			
		||||
@@ -300,7 +300,7 @@ revListLoop:
 | 
			
		||||
					commits[0] = string(commitID)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			treeID = to40ByteSHA(treeID)
 | 
			
		||||
			treeID = To40ByteSHA(treeID)
 | 
			
		||||
			_, err = batchStdinWriter.Write(treeID)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, err
 | 
			
		||||
 
 | 
			
		||||
@@ -127,11 +127,12 @@ func FindLFSFile(repo *git.Repository, hash git.SHA1) ([]*LFSResult, error) {
 | 
			
		||||
			case "tree":
 | 
			
		||||
				var n int64
 | 
			
		||||
				for n < size {
 | 
			
		||||
					mode, fname, sha, count, err := git.ParseTreeLine(batchReader, modeBuf, fnameBuf, workingShaBuf)
 | 
			
		||||
					mode, fname, sha20byte, count, err := git.ParseTreeLine(batchReader, modeBuf, fnameBuf, workingShaBuf)
 | 
			
		||||
					if err != nil {
 | 
			
		||||
						return nil, err
 | 
			
		||||
					}
 | 
			
		||||
					n += int64(count)
 | 
			
		||||
					sha := git.To40ByteSHA(sha20byte)
 | 
			
		||||
					if bytes.Equal(sha, []byte(hashStr)) {
 | 
			
		||||
						result := LFSResult{
 | 
			
		||||
							Name:         curPath + string(fname),
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,7 @@ import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"io"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"sync"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/modules/git"
 | 
			
		||||
@@ -78,6 +79,7 @@ loop:
 | 
			
		||||
			_ = catFileBatchReader.CloseWithError(err)
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
		sha = strings.TrimSpace(sha)
 | 
			
		||||
		// Throw away the blob
 | 
			
		||||
		if _, err := bufferedReader.ReadString(' '); err != nil {
 | 
			
		||||
			_ = catFileBatchReader.CloseWithError(err)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user