Mirror of @tangled.org/core. Running on a Raspberry Pi Zero 2 (Please be gentle).
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

knotserver/git: refactor language breakdown logic

Signed-off-by: oppiliappan <me@oppi.li>

authored by

oppiliappan and committed by
Tangled
7010d62e e79245cb

+68 -51
+66
knotserver/git/language.go
··· 1 + package git 2 + 3 + import ( 4 + "context" 5 + "path" 6 + 7 + "github.com/go-enry/go-enry/v2" 8 + "github.com/go-git/go-git/v5/plumbing/object" 9 + ) 10 + 11 + type LangBreakdown map[string]int64 12 + 13 + func (g *GitRepo) AnalyzeLanguages(ctx context.Context) (LangBreakdown, error) { 14 + sizes := make(map[string]int64) 15 + err := g.Walk(ctx, "", func(node object.TreeEntry, parent *object.Tree, root string) error { 16 + filepath := path.Join(root, node.Name) 17 + 18 + content, err := g.FileContentN(filepath, 16*1024) // 16KB 19 + if err != nil { 20 + return nil 21 + } 22 + 23 + if enry.IsGenerated(filepath, content) { 24 + return nil 25 + } 26 + 27 + language := analyzeLanguage(node, content) 28 + if group := enry.GetLanguageGroup(language); group != "" { 29 + language = group 30 + } 31 + 32 + langType := enry.GetLanguageType(language) 33 + if langType != enry.Programming && langType != enry.Markup && langType != enry.Unknown { 34 + return nil 35 + } 36 + 37 + sz, _ := parent.Size(node.Name) 38 + sizes[language] += sz 39 + 40 + return nil 41 + }) 42 + 43 + if err != nil { 44 + return nil, err 45 + } 46 + 47 + return sizes, nil 48 + } 49 + 50 + func analyzeLanguage(node object.TreeEntry, content []byte) string { 51 + language, ok := enry.GetLanguageByExtension(node.Name) 52 + if ok { 53 + return language 54 + } 55 + 56 + language, ok = enry.GetLanguageByFilename(node.Name) 57 + if ok { 58 + return language 59 + } 60 + 61 + if len(content) == 0 { 62 + return enry.OtherLanguage 63 + } 64 + 65 + return enry.GetLanguage(node.Name, content) 66 + }
+2 -51
knotserver/routes.go
··· 13 13 "net/http" 14 14 "net/url" 15 15 "os" 16 - "path" 17 16 "path/filepath" 18 17 "strconv" 19 18 "strings" ··· 22 23 securejoin "github.com/cyphar/filepath-securejoin" 23 24 "github.com/gliderlabs/ssh" 24 25 "github.com/go-chi/chi/v5" 25 - "github.com/go-enry/go-enry/v2" 26 26 gogit "github.com/go-git/go-git/v5" 27 27 "github.com/go-git/go-git/v5/plumbing" 28 28 "github.com/go-git/go-git/v5/plumbing/object" ··· 783 785 return 784 786 } 785 787 786 - sizes := make(map[string]int64) 787 - 788 788 ctx, cancel := context.WithTimeout(r.Context(), 1*time.Second) 789 789 defer cancel() 790 790 791 - err = gr.Walk(ctx, "", func(node object.TreeEntry, parent *object.Tree, root string) error { 792 - filepath := path.Join(root, node.Name) 793 - 794 - content, err := gr.FileContentN(filepath, 16*1024) // 16KB 795 - if err != nil { 796 - return nil 797 - } 798 - 799 - if enry.IsGenerated(filepath, content) { 800 - return nil 801 - } 802 - 803 - language := analyzeLanguage(node, content) 804 - if group := enry.GetLanguageGroup(language); group != "" { 805 - language = group 806 - } 807 - 808 - langType := enry.GetLanguageType(language) 809 - if langType != enry.Programming && langType != enry.Markup && langType != enry.Unknown { 810 - return nil 811 - } 812 - 813 - sz, _ := parent.Size(node.Name) 814 - sizes[language] += sz 815 - 816 - return nil 817 - }) 791 + sizes, err := gr.AnalyzeLanguages(ctx) 818 792 if err != nil { 819 - l.Error("failed to recurse file tree", "error", err.Error()) 793 + l.Error("failed to analyze languages", "error", err.Error()) 820 794 writeError(w, err.Error(), http.StatusNoContent) 821 795 return 822 796 } ··· 796 826 resp := types.RepoLanguageResponse{Languages: sizes} 797 827 798 828 writeJSON(w, resp) 799 - return 800 - } 801 - 802 - func analyzeLanguage(node object.TreeEntry, content []byte) string { 803 - language, ok := enry.GetLanguageByExtension(node.Name) 804 - if ok { 805 - return language 806 - } 807 - 808 - language, ok = enry.GetLanguageByFilename(node.Name) 809 - if ok { 810 - return language 811 - } 812 - 813 - if len(content) == 0 { 814 - return enry.OtherLanguage 815 - } 816 - 817 - return enry.GetLanguage(node.Name, content) 818 829 } 819 830 820 831 func (h *Handle) RepoForkSync(w http.ResponseWriter, r *http.Request) {