Fix git grep search limit, add test (#30071)

Fix #30069
This commit is contained in:
wxiaoguang 2024-03-25 21:25:22 +08:00 committed by GitHub
parent bbaf62589f
commit 8e79aed573
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 17 additions and 1 deletions

View File

@ -24,6 +24,7 @@ type GrepResult struct {
type GrepOptions struct { type GrepOptions struct {
RefName string RefName string
MaxResultLimit int
ContextLineNumber int ContextLineNumber int
IsFuzzy bool IsFuzzy bool
} }
@ -59,6 +60,7 @@ func GrepSearch(ctx context.Context, repo *Repository, search string, opts GrepO
cmd.AddOptionValues("-e", strings.TrimLeft(search, "-")) cmd.AddOptionValues("-e", strings.TrimLeft(search, "-"))
} }
cmd.AddDynamicArguments(util.IfZero(opts.RefName, "HEAD")) cmd.AddDynamicArguments(util.IfZero(opts.RefName, "HEAD"))
opts.MaxResultLimit = util.IfZero(opts.MaxResultLimit, 50)
stderr := bytes.Buffer{} stderr := bytes.Buffer{}
err = cmd.Run(&RunOpts{ err = cmd.Run(&RunOpts{
Dir: repo.Path, Dir: repo.Path,
@ -82,7 +84,7 @@ func GrepSearch(ctx context.Context, repo *Repository, search string, opts GrepO
continue continue
} }
if line == "" { if line == "" {
if len(results) >= 50 { if len(results) >= opts.MaxResultLimit {
cancel() cancel()
break break
} }
@ -101,6 +103,10 @@ func GrepSearch(ctx context.Context, repo *Repository, search string, opts GrepO
return scanner.Err() return scanner.Err()
}, },
}) })
// git grep exits by cancel (killed), usually it is caused by the limit of results
if IsErrorExitCode(err, -1) && stderr.Len() == 0 {
return results, nil
}
// git grep exits with 1 if no results are found // git grep exits with 1 if no results are found
if IsErrorExitCode(err, 1) && stderr.Len() == 0 { if IsErrorExitCode(err, 1) && stderr.Len() == 0 {
return nil, nil return nil, nil

View File

@ -31,6 +31,16 @@ func TestGrepSearch(t *testing.T) {
}, },
}, res) }, res)
res, err = GrepSearch(context.Background(), repo, "void", GrepOptions{MaxResultLimit: 1})
assert.NoError(t, err)
assert.Equal(t, []*GrepResult{
{
Filename: "java-hello/main.java",
LineNumbers: []int{3},
LineCodes: []string{" public static void main(String[] args)"},
},
}, res)
res, err = GrepSearch(context.Background(), repo, "no-such-content", GrepOptions{}) res, err = GrepSearch(context.Background(), repo, "no-such-content", GrepOptions{})
assert.NoError(t, err) assert.NoError(t, err)
assert.Len(t, res, 0) assert.Len(t, res, 0)