mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 19:06:18 +01:00 
			
		
		
		
	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>
This commit is contained in:
		| @@ -13,11 +13,10 @@ import ( | ||||
| 	"context" | ||||
| 	"io" | ||||
| 	"math" | ||||
| 	"os" | ||||
| 	"strings" | ||||
|  | ||||
| 	"code.gitea.io/gitea/modules/analyze" | ||||
| 	"code.gitea.io/gitea/modules/log" | ||||
| 	"code.gitea.io/gitea/modules/util" | ||||
|  | ||||
| 	"github.com/go-enry/go-enry/v2" | ||||
| ) | ||||
| @@ -68,35 +67,28 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err | ||||
| 	var checker *CheckAttributeReader | ||||
|  | ||||
| 	if CheckGitVersionAtLeast("1.7.8") == nil { | ||||
| 		indexFilename, deleteTemporaryFile, err := repo.ReadTreeToTemporaryIndex(commitID) | ||||
| 		indexFilename, worktree, deleteTemporaryFile, err := repo.ReadTreeToTemporaryIndex(commitID) | ||||
| 		if err == nil { | ||||
| 			defer deleteTemporaryFile() | ||||
| 			tmpWorkTree, err := os.MkdirTemp("", "empty-work-dir") | ||||
| 			if err == nil { | ||||
| 				defer func() { | ||||
| 					_ = util.RemoveAll(tmpWorkTree) | ||||
| 				}() | ||||
|  | ||||
| 				checker = &CheckAttributeReader{ | ||||
| 					Attributes: []string{"linguist-vendored", "linguist-generated", "linguist-language"}, | ||||
| 					Repo:       repo, | ||||
| 					IndexFile:  indexFilename, | ||||
| 					WorkTree:   tmpWorkTree, | ||||
| 				} | ||||
| 				ctx, cancel := context.WithCancel(DefaultContext) | ||||
| 				if err := checker.Init(ctx); err != nil { | ||||
| 					log.Error("Unable to open checker for %s. Error: %v", commitID, err) | ||||
| 				} else { | ||||
| 					go func() { | ||||
| 						err = checker.Run() | ||||
| 						if err != nil { | ||||
| 							log.Error("Unable to open checker for %s. Error: %v", commitID, err) | ||||
| 							cancel() | ||||
| 						} | ||||
| 					}() | ||||
| 				} | ||||
| 				defer cancel() | ||||
| 			checker = &CheckAttributeReader{ | ||||
| 				Attributes: []string{"linguist-vendored", "linguist-generated", "linguist-language", "gitlab-language"}, | ||||
| 				Repo:       repo, | ||||
| 				IndexFile:  indexFilename, | ||||
| 				WorkTree:   worktree, | ||||
| 			} | ||||
| 			ctx, cancel := context.WithCancel(DefaultContext) | ||||
| 			if err := checker.Init(ctx); err != nil { | ||||
| 				log.Error("Unable to open checker for %s. Error: %v", commitID, err) | ||||
| 			} else { | ||||
| 				go func() { | ||||
| 					err = checker.Run() | ||||
| 					if err != nil { | ||||
| 						log.Error("Unable to open checker for %s. Error: %v", commitID, err) | ||||
| 						cancel() | ||||
| 					} | ||||
| 				}() | ||||
| 			} | ||||
| 			defer cancel() | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @@ -138,7 +130,23 @@ func (repo *Repository) GetLanguageStats(commitID string) (map[string]int64, err | ||||
|  | ||||
| 					sizes[language] += f.Size() | ||||
| 					continue | ||||
| 				} else if language, has := attrs["gitlab-language"]; has && language != "unspecified" && language != "" { | ||||
| 					// strip off a ? if present | ||||
| 					if idx := strings.IndexByte(language, '?'); idx >= 0 { | ||||
| 						language = language[:idx] | ||||
| 					} | ||||
| 					if len(language) != 0 { | ||||
| 						// group languages, such as Pug -> HTML; SCSS -> CSS | ||||
| 						group := enry.GetLanguageGroup(language) | ||||
| 						if len(group) != 0 { | ||||
| 							language = group | ||||
| 						} | ||||
|  | ||||
| 						sizes[language] += f.Size() | ||||
| 						continue | ||||
| 					} | ||||
| 				} | ||||
|  | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user