From 2255afffad4ff8173c73b7cec8dbd66d986eaf5c Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 22 Apr 2021 00:31:59 +0800 Subject: [PATCH] Fix lfs management find (#15537) Fix #15236 * Do not do 40byte conversion within ParseTreeLine * Missed a to40ByteSHA Signed-off-by: Andrew Thornton Co-authored-by: Andrew Thornton --- modules/git/batch_reader.go | 4 ++-- modules/git/commit_info_nogogit.go | 2 +- modules/git/pipeline/lfs_nogogit.go | 3 ++- modules/lfs/pointer_scanner_nogogit.go | 2 ++ 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/modules/git/batch_reader.go b/modules/git/batch_reader.go index 6014508b93..1905067cb4 100644 --- a/modules/git/batch_reader.go +++ b/modules/git/batch_reader.go @@ -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 diff --git a/modules/git/commit_info_nogogit.go b/modules/git/commit_info_nogogit.go index b844468c8c..f14b7b8291 100644 --- a/modules/git/commit_info_nogogit.go +++ b/modules/git/commit_info_nogogit.go @@ -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 diff --git a/modules/git/pipeline/lfs_nogogit.go b/modules/git/pipeline/lfs_nogogit.go index f6faa3a48a..79f7528d33 100644 --- a/modules/git/pipeline/lfs_nogogit.go +++ b/modules/git/pipeline/lfs_nogogit.go @@ -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), diff --git a/modules/lfs/pointer_scanner_nogogit.go b/modules/lfs/pointer_scanner_nogogit.go index 28d4afba61..b5654d5de7 100644 --- a/modules/lfs/pointer_scanner_nogogit.go +++ b/modules/lfs/pointer_scanner_nogogit.go @@ -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)