forked from
tangled.org/core
fork
Configure Feed
Select the types of activity you want to include in your feed.
this repo has no description
fork
Configure Feed
Select the types of activity you want to include in your feed.
1package git
2
3import (
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
11type LangBreakdown map[string]int64
12
13func (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
50func 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}