[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

@ -145,30 +145,13 @@ func LFSLocks(ctx *context.Context) {
return
}
name2attribute2info, err := gitRepo.CheckAttribute(git.CheckAttributeOpts{
Attributes: []string{"lockable"},
Filenames: filenames,
CachedOnly: true,
})
ctx.Data["Lockables"], err = lockablesGitAttributes(gitRepo, lfsLocks)
if err != nil {
log.Error("Unable to check attributes in %s (%v)", tmpBasePath, err)
log.Error("Unable to get lockablesGitAttributes in %s (%v)", tmpBasePath, err)
ctx.ServerError("LFSLocks", err)
return
}
lockables := make([]bool, len(lfsLocks))
for i, lock := range lfsLocks {
attribute2info, has := name2attribute2info[lock.Path]
if !has {
continue
}
if attribute2info["lockable"] != "set" {
continue
}
lockables[i] = true
}
ctx.Data["Lockables"] = lockables
filelist, err := gitRepo.LsFiles(filenames...)
if err != nil {
log.Error("Unable to lsfiles in %s (%v)", tmpBasePath, err)
@ -189,6 +172,24 @@ func LFSLocks(ctx *context.Context) {
ctx.HTML(http.StatusOK, tplSettingsLFSLocks)
}
func lockablesGitAttributes(gitRepo *git.Repository, lfsLocks []*git_model.LFSLock) ([]bool, error) {
checker, err := gitRepo.GitAttributeChecker("", "lockable")
if err != nil {
return nil, fmt.Errorf("could not GitAttributeChecker: %w", err)
}
defer checker.Close()
lockables := make([]bool, len(lfsLocks))
for i, lock := range lfsLocks {
attrs, err := checker.CheckPath(lock.Path)
if err != nil {
return nil, fmt.Errorf("could not CheckPath(%s): %w", lock.Path, err)
}
lockables[i] = attrs["lockable"].Bool().Value()
}
return lockables, nil
}
// LFSLockFile locks a file
func LFSLockFile(ctx *context.Context) {
if !setting.LFS.StartServer {

View file

@ -643,17 +643,12 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) {
}
if ctx.Repo.GitRepo != nil {
checker, deferable := ctx.Repo.GitRepo.CheckAttributeReader(ctx.Repo.CommitID)
if checker != nil {
defer deferable()
attrs, err := checker.CheckPath(ctx.Repo.TreePath)
if err == nil {
vendored, has := attrs["linguist-vendored"]
ctx.Data["IsVendored"] = has && (vendored == "set" || vendored == "true")
generated, has := attrs["linguist-generated"]
ctx.Data["IsGenerated"] = has && (generated == "set" || generated == "true")
}
attrs, err := ctx.Repo.GitRepo.GitAttributes(ctx.Repo.CommitID, ctx.Repo.TreePath, "linguist-vendored", "linguist-generated")
if err != nil {
log.Error("GitAttributes(%s, %s) failed: %v", ctx.Repo.CommitID, ctx.Repo.TreePath, err)
} else {
ctx.Data["IsVendored"] = attrs["linguist-vendored"].Bool().Value()
ctx.Data["IsGenerated"] = attrs["linguist-generated"].Bool().Value()
}
}