diff options
author | zeripath <art27@cantab.net> | 2021-11-17 20:37:00 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-17 20:37:00 +0000 |
commit | 3c4724d70e4ac7bfc06b97f6fad8936f97479b6b (patch) | |
tree | 754286def789b823e020d3ccfafae148d0017b62 /routers | |
parent | 81a4fc752833101dd7d6b4f612bccc4b29c98dff (diff) | |
download | gitea-3c4724d70e4ac7bfc06b97f6fad8936f97479b6b.tar.gz gitea-3c4724d70e4ac7bfc06b97f6fad8936f97479b6b.zip |
Add .gitattribute assisted language detection to blame, diff and render (#17590)
Use check attribute code to check the assigned language of a file and send that in to
chroma as a hint for the language of the file.
Signed-off-by: Andrew Thornton <art27@cantab.net>
Diffstat (limited to 'routers')
-rw-r--r-- | routers/web/repo/blame.go | 28 | ||||
-rw-r--r-- | routers/web/repo/view.go | 28 |
2 files changed, 54 insertions, 2 deletions
diff --git a/routers/web/repo/blame.go b/routers/web/repo/blame.go index 110ec037e1..2fd72d81ab 100644 --- a/routers/web/repo/blame.go +++ b/routers/web/repo/blame.go @@ -16,6 +16,7 @@ import ( "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/highlight" + "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/templates" "code.gitea.io/gitea/modules/timeutil" "code.gitea.io/gitea/modules/util" @@ -204,6 +205,31 @@ func processBlameParts(ctx *context.Context, blameParts []git.BlamePart) (map[st func renderBlame(ctx *context.Context, blameParts []git.BlamePart, commitNames map[string]*models.UserCommit, previousCommits map[string]string) { 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 = "" + } + } var lines = make([]string, 0) rows := make([]*blameRow, 0) @@ -248,7 +274,7 @@ func renderBlame(ctx *context.Context, blameParts []git.BlamePart, commitNames m line += "\n" } fileName := fmt.Sprintf("%v", ctx.Data["FileName"]) - line = highlight.Code(fileName, line) + line = highlight.Code(fileName, language, line) br.Code = gotemplate.HTML(line) rows = append(rows, br) diff --git a/routers/web/repo/view.go b/routers/web/repo/view.go index 12b3aef505..938292a37a 100644 --- a/routers/web/repo/view.go +++ b/routers/web/repo/view.go @@ -502,7 +502,33 @@ func renderFile(ctx *context.Context, entry *git.TreeEntry, treeLink, rawLink st lineNums := linesBytesCount(buf) ctx.Data["NumLines"] = strconv.Itoa(lineNums) ctx.Data["NumLinesSet"] = true - ctx.Data["FileContent"] = highlight.File(lineNums, blob.Name(), buf) + + 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 = "" + } + } + ctx.Data["FileContent"] = highlight.File(lineNums, blob.Name(), language, buf) } if !isLFSFile { if ctx.Repo.CanEnableEditor() { |