Skip to content

Commit 29a6b64

Browse files
committed
some improvements
1 parent 369e17d commit 29a6b64

File tree

5 files changed

+67
-63
lines changed

5 files changed

+67
-63
lines changed

modules/git/attribute/attribute.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,15 @@ const (
2020
GitlabLanguage = "gitlab-language"
2121
)
2222

23+
var LinguistAttributes = []string{
24+
LinguistVendored,
25+
LinguistGenerated,
26+
LinguistDocumentation,
27+
LinguistDetectable,
28+
LinguistLanguage,
29+
GitlabLanguage,
30+
}
31+
2332
func (a Attribute) ToString() optional.Option[string] {
2433
if a != "" && a != "unspecified" {
2534
return optional.Some(string(a))

modules/git/attribute/batch.go

Lines changed: 44 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,48 @@ type BatchChecker struct {
3434
cancel context.CancelFunc
3535
}
3636

37+
// NewBatchChecker creates a check attribute reader for the current repository and provided commit ID
38+
func NewBatchChecker(repo *git.Repository, treeish string, attributes ...string) (*BatchChecker, error) {
39+
indexFilename, worktree, deleteTemporaryFile, err := repo.ReadTreeToTemporaryIndex(treeish)
40+
if err != nil {
41+
return nil, err
42+
}
43+
44+
if len(attributes) == 0 {
45+
attributes = LinguistAttributes
46+
}
47+
48+
ctx, cancel := context.WithCancel(repo.Ctx)
49+
50+
checker := &BatchChecker{
51+
Attributes: attributes,
52+
Repo: repo,
53+
IndexFile: indexFilename,
54+
WorkTree: worktree,
55+
ctx: ctx,
56+
cancel: func() {
57+
cancel()
58+
deleteTemporaryFile()
59+
},
60+
}
61+
62+
if err := checker.init(ctx); err != nil {
63+
log.Error("Unable to open attribute checker for commit %s, error: %v", treeish, err)
64+
checker.Close()
65+
return nil, err
66+
}
67+
68+
go func() {
69+
err := checker.run(ctx)
70+
if err != nil && !git.IsErrCanceledOrKilled(err) {
71+
log.Error("Attribute checker for commit %s exits with error: %v", treeish, err)
72+
}
73+
cancel()
74+
}()
75+
76+
return checker, nil
77+
}
78+
3779
// init initializes the AttributeChecker
3880
func (c *BatchChecker) init(ctx context.Context) error {
3981
if len(c.Attributes) == 0 {
@@ -46,7 +88,6 @@ func (c *BatchChecker) init(ctx context.Context) error {
4688
return errors.New("no provided Attributes to check")
4789
}
4890

49-
c.ctx, c.cancel = context.WithCancel(ctx)
5091
c.cmd = git.NewCommand("check-attr", "--stdin", "-z")
5192

5293
if len(c.IndexFile) > 0 {
@@ -77,13 +118,13 @@ func (c *BatchChecker) init(ctx context.Context) error {
77118
return nil
78119
}
79120

80-
func (c *BatchChecker) run() error {
121+
func (c *BatchChecker) run(ctx context.Context) error {
81122
defer func() {
82123
_ = c.stdinReader.Close()
83124
_ = c.stdOut.Close()
84125
}()
85126
stdErr := new(bytes.Buffer)
86-
err := c.cmd.Run(c.ctx, &git.RunOpts{
127+
err := c.cmd.Run(ctx, &git.RunOpts{
87128
Env: c.env,
88129
Dir: c.Repo.Path,
89130
Stdin: c.stdinReader,
@@ -221,46 +262,3 @@ func (wr *nulSeparatedAttributeWriter) Close() error {
221262
close(wr.closed)
222263
return nil
223264
}
224-
225-
// NewBatchChecker creates a check attribute reader for the current repository and provided commit ID
226-
func NewBatchChecker(repo *git.Repository, commitID string) (*BatchChecker, context.CancelFunc, error) {
227-
indexFilename, worktree, deleteTemporaryFile, err := repo.ReadTreeToTemporaryIndex(commitID)
228-
if err != nil {
229-
return nil, nil, err
230-
}
231-
232-
checker := &BatchChecker{
233-
Attributes: []string{
234-
LinguistVendored,
235-
LinguistGenerated,
236-
LinguistDocumentation,
237-
LinguistDetectable,
238-
LinguistLanguage,
239-
GitlabLanguage,
240-
},
241-
Repo: repo,
242-
IndexFile: indexFilename,
243-
WorkTree: worktree,
244-
}
245-
ctx, cancel := context.WithCancel(repo.Ctx)
246-
deferrable := func() {
247-
_ = checker.Close()
248-
cancel()
249-
deleteTemporaryFile()
250-
}
251-
if err := checker.init(ctx); err != nil {
252-
log.Error("Unable to open attribute checker for commit %s, error: %v", commitID, err)
253-
deferrable()
254-
return nil, nil, err
255-
}
256-
257-
go func() {
258-
err := checker.run()
259-
if err != nil && !git.IsErrCanceledOrKilled(err) {
260-
log.Error("Attribute checker for commit %s exits with error: %v", commitID, err)
261-
}
262-
cancel()
263-
}()
264-
265-
return checker, deferrable, nil
266-
}

modules/git/languagestats/language_stats_nogogit.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,11 @@ func GetLanguageStats(repo *git.Repository, commitID string) (map[string]int64,
6464
return nil, err
6565
}
6666

67-
checker, deferable, err := attribute.NewBatchChecker(repo, commitID)
67+
checker, err := attribute.NewBatchChecker(repo, commitID)
6868
if err != nil {
6969
return nil, err
7070
}
71-
defer deferable()
71+
defer checker.Close()
7272

7373
contentBuf := bytes.Buffer{}
7474
var content []byte

routers/web/repo/view_file.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -285,12 +285,13 @@ func prepareToRenderFile(ctx *context.Context, entry *git.TreeEntry) {
285285
}
286286

287287
if ctx.Repo.GitRepo != nil {
288-
checker, deferable, err := attribute.NewBatchChecker(ctx.Repo.GitRepo, ctx.Repo.CommitID)
288+
checker, err := attribute.NewBatchChecker(ctx.Repo.GitRepo, ctx.Repo.CommitID, attribute.LinguistGenerated, attribute.LinguistVendored)
289289
if err != nil {
290290
ctx.ServerError("NewAttributeChecker", err)
291291
return
292292
}
293-
defer deferable()
293+
defer checker.Close()
294+
294295
attrs, err := checker.CheckPath(ctx.Repo.TreePath)
295296
if err == nil {
296297
ctx.Data["IsVendored"] = attrs.HasVendored().Value()

services/gitdiff/gitdiff.go

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1238,26 +1238,22 @@ func GetDiffForRender(ctx context.Context, gitRepo *git.Repository, opts *DiffOp
12381238
return nil, err
12391239
}
12401240

1241-
checker, deferrable, err := attribute.NewBatchChecker(gitRepo, opts.AfterCommitID)
1241+
checker, err := attribute.NewBatchChecker(gitRepo, opts.AfterCommitID)
12421242
if err != nil {
12431243
return nil, err
12441244
}
1245-
defer deferrable()
1245+
defer checker.Close()
12461246

12471247
for _, diffFile := range diff.Files {
12481248
isVendored := optional.None[bool]()
12491249
isGenerated := optional.None[bool]()
1250-
if checker != nil {
1251-
attrs, err := checker.CheckPath(diffFile.Name)
1252-
if err == nil {
1253-
isVendored = attrs.HasVendored()
1254-
isGenerated = attrs.HasGenerated()
1255-
language := attrs.Language()
1256-
if language.Has() {
1257-
diffFile.Language = language.Value()
1258-
}
1259-
} else {
1260-
checker = nil // CheckPath fails, it's not impossible to "check" anymore
1250+
attrs, err := checker.CheckPath(diffFile.Name)
1251+
if err == nil {
1252+
isVendored = attrs.HasVendored()
1253+
isGenerated = attrs.HasGenerated()
1254+
language := attrs.Language()
1255+
if language.Has() {
1256+
diffFile.Language = language.Value()
12611257
}
12621258
}
12631259

0 commit comments

Comments
 (0)