[PERFORMANCE] git check-attr on bare repo if supported

This commit is contained in:
oliverpool 2024-03-24 12:44:30 +01:00
parent d5a3f14063
commit 3c81f7478c
17 changed files with 450 additions and 386 deletions

View file

@ -7,6 +7,7 @@ package gitdiff
import (
"bufio"
"bytes"
"cmp"
"context"
"fmt"
"html"
@ -1172,38 +1173,32 @@ func GetDiff(ctx context.Context, gitRepo *git.Repository, opts *DiffOptions, fi
}
diff.Start = opts.SkipTo
checker, deferable := gitRepo.CheckAttributeReader(opts.AfterCommitID)
defer deferable()
checker, err := gitRepo.GitAttributeChecker(opts.AfterCommitID, git.LinguistAttributes...)
if err != nil {
return nil, fmt.Errorf("unable to GitAttributeChecker: %w", err)
}
defer checker.Close()
for _, diffFile := range diff.Files {
gotVendor := false
gotGenerated := false
if checker != nil {
attrs, err := checker.CheckPath(diffFile.Name)
if err == nil {
if vendored, has := attrs["linguist-vendored"]; has {
if vendored == "set" || vendored == "true" {
diffFile.IsVendored = true
gotVendor = true
} else {
gotVendor = vendored == "false"
}
}
if generated, has := attrs["linguist-generated"]; has {
if generated == "set" || generated == "true" {
diffFile.IsGenerated = true
gotGenerated = true
} else {
gotGenerated = generated == "false"
}
}
if language, has := attrs["linguist-language"]; has && language != "unspecified" && language != "" {
diffFile.Language = language
} else if language, has := attrs["gitlab-language"]; has && language != "unspecified" && language != "" {
diffFile.Language = language
}
}
attrs, err := checker.CheckPath(diffFile.Name)
if err != nil {
log.Error("checker.CheckPath(%s) failed: %v", diffFile.Name, err)
} else {
vendored := attrs["linguist-vendored"].Bool()
diffFile.IsVendored = vendored.Value()
gotVendor = vendored.Has()
generated := attrs["linguist-generated"].Bool()
diffFile.IsGenerated = generated.Value()
gotGenerated = generated.Has()
diffFile.Language = cmp.Or(
attrs["linguist-language"].String(),
attrs["gitlab-language"].Prefix(),
)
}
if !gotVendor {