@@ -20,6 +20,7 @@ import ( | |||
"code.gitea.io/gitea/modules/templates" | |||
"code.gitea.io/gitea/modules/timeutil" | |||
"code.gitea.io/gitea/modules/util" | |||
files_service "code.gitea.io/gitea/services/repository/files" | |||
) | |||
type blameRow struct { | |||
@@ -247,31 +248,11 @@ func processBlameParts(ctx *context.Context, blameParts []*git.BlamePart) map[st | |||
func renderBlame(ctx *context.Context, blameParts []*git.BlamePart, commitNames map[string]*user_model.UserCommit) { | |||
repoLink := ctx.Repo.RepoLink | |||
language := "" | |||
indexFilename, worktree, deleteTemporaryFile, err := ctx.Repo.GitRepo.ReadTreeToTemporaryIndex(ctx.Repo.CommitID) | |||
if err == nil { | |||
defer deleteTemporaryFile() | |||
filename2attribute2info, err := ctx.Repo.GitRepo.CheckAttribute(git.CheckAttributeOpts{ | |||
CachedOnly: true, | |||
Attributes: []string{"linguist-language", "gitlab-language"}, | |||
Filenames: []string{ctx.Repo.TreePath}, | |||
IndexFile: indexFilename, | |||
WorkTree: worktree, | |||
}) | |||
if err != nil { | |||
log.Error("Unable to load attributes for %-v:%s. Error: %v", ctx.Repo.Repository, ctx.Repo.TreePath, err) | |||
} | |||
language = filename2attribute2info[ctx.Repo.TreePath]["linguist-language"] | |||
if language == "" || language == "unspecified" { | |||
language = filename2attribute2info[ctx.Repo.TreePath]["gitlab-language"] | |||
} | |||
if language == "unspecified" { | |||
language = "" | |||
} | |||
language, err := files_service.TryGetContentLanguage(ctx.Repo.GitRepo, ctx.Repo.CommitID, ctx.Repo.TreePath) | |||
if err != nil { | |||
log.Error("Unable to get file language for %-v:%s. Error: %v", ctx.Repo.Repository, ctx.Repo.TreePath, err) | |||
} | |||
lines := make([]string, 0) | |||
rows := make([]*blameRow, 0) | |||
escapeStatus := &charset.EscapeStatus{} |
@@ -49,6 +49,7 @@ import ( | |||
"code.gitea.io/gitea/modules/util" | |||
"code.gitea.io/gitea/routers/web/feed" | |||
issue_service "code.gitea.io/gitea/services/issue" | |||
files_service "code.gitea.io/gitea/services/repository/files" | |||
"github.com/nektos/act/pkg/model" | |||
@@ -553,31 +554,11 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry) { | |||
} | |||
ctx.Data["NumLinesSet"] = true | |||
language := "" | |||
indexFilename, worktree, deleteTemporaryFile, err := ctx.Repo.GitRepo.ReadTreeToTemporaryIndex(ctx.Repo.CommitID) | |||
if err == nil { | |||
defer deleteTemporaryFile() | |||
filename2attribute2info, err := ctx.Repo.GitRepo.CheckAttribute(git.CheckAttributeOpts{ | |||
CachedOnly: true, | |||
Attributes: []string{"linguist-language", "gitlab-language"}, | |||
Filenames: []string{ctx.Repo.TreePath}, | |||
IndexFile: indexFilename, | |||
WorkTree: worktree, | |||
}) | |||
if err != nil { | |||
log.Error("Unable to load attributes for %-v:%s. Error: %v", ctx.Repo.Repository, ctx.Repo.TreePath, err) | |||
} | |||
language = filename2attribute2info[ctx.Repo.TreePath]["linguist-language"] | |||
if language == "" || language == "unspecified" { | |||
language = filename2attribute2info[ctx.Repo.TreePath]["gitlab-language"] | |||
} | |||
if language == "unspecified" { | |||
language = "" | |||
} | |||
language, err := files_service.TryGetContentLanguage(ctx.Repo.GitRepo, ctx.Repo.CommitID, ctx.Repo.TreePath) | |||
if err != nil { | |||
log.Error("Unable to get file language for %-v:%s. Error: %v", ctx.Repo.Repository, ctx.Repo.TreePath, err) | |||
} | |||
fileContent, lexerName, err := highlight.File(blob.Name(), language, buf) | |||
ctx.Data["LexerName"] = lexerName | |||
if err != nil { |
@@ -270,3 +270,34 @@ func GetBlobBySHA(ctx context.Context, repo *repo_model.Repository, gitRepo *git | |||
Content: content, | |||
}, nil | |||
} | |||
// TryGetContentLanguage tries to get the (linguist) language of the file content | |||
func TryGetContentLanguage(gitRepo *git.Repository, commitID, treePath string) (string, error) { | |||
indexFilename, worktree, deleteTemporaryFile, err := gitRepo.ReadTreeToTemporaryIndex(commitID) | |||
if err != nil { | |||
return "", err | |||
} | |||
defer deleteTemporaryFile() | |||
filename2attribute2info, err := gitRepo.CheckAttribute(git.CheckAttributeOpts{ | |||
CachedOnly: true, | |||
Attributes: []string{"linguist-language", "gitlab-language"}, | |||
Filenames: []string{treePath}, | |||
IndexFile: indexFilename, | |||
WorkTree: worktree, | |||
}) | |||
if err != nil { | |||
return "", err | |||
} | |||
language := filename2attribute2info[treePath]["linguist-language"] | |||
if language == "" || language == "unspecified" { | |||
language = filename2attribute2info[treePath]["gitlab-language"] | |||
} | |||
if language == "unspecified" { | |||
language = "" | |||
} | |||
return language, nil | |||
} |