Skip to content

Commit c784c1b

Browse files
committed
better error handling
1 parent edfd40d commit c784c1b

File tree

4 files changed

+20
-23
lines changed

4 files changed

+20
-23
lines changed

modules/git/command.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,6 @@ type RunStdError interface {
367367
error
368368
Unwrap() error
369369
Stderr() string
370-
IsExitCode(code int) bool
371370
}
372371

373372
type runStdError struct {
@@ -392,9 +391,9 @@ func (r *runStdError) Stderr() string {
392391
return r.stderr
393392
}
394393

395-
func (r *runStdError) IsExitCode(code int) bool {
394+
func IsErrorExitCode(err error, code int) bool {
396395
var exitError *exec.ExitError
397-
if errors.As(r.err, &exitError) {
396+
if errors.As(err, &exitError) {
398397
return exitError.ExitCode() == code
399398
}
400399
return false

modules/git/git.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ func checkGitVersionCompatibility(gitVer *version.Version) error {
341341

342342
func configSet(key, value string) error {
343343
stdout, _, err := NewCommand(DefaultContext, "config", "--global", "--get").AddDynamicArguments(key).RunStdString(nil)
344-
if err != nil && !err.IsExitCode(1) {
344+
if err != nil && !IsErrorExitCode(err, 1) {
345345
return fmt.Errorf("failed to get git config %s, err: %w", key, err)
346346
}
347347

@@ -364,7 +364,7 @@ func configSetNonExist(key, value string) error {
364364
// already exist
365365
return nil
366366
}
367-
if err.IsExitCode(1) {
367+
if IsErrorExitCode(err, 1) {
368368
// not exist, set new config
369369
_, _, err = NewCommand(DefaultContext, "config", "--global").AddDynamicArguments(key, value).RunStdString(nil)
370370
if err != nil {
@@ -382,7 +382,7 @@ func configAddNonExist(key, value string) error {
382382
// already exist
383383
return nil
384384
}
385-
if err.IsExitCode(1) {
385+
if IsErrorExitCode(err, 1) {
386386
// not exist, add new config
387387
_, _, err = NewCommand(DefaultContext, "config", "--global", "--add").AddDynamicArguments(key, value).RunStdString(nil)
388388
if err != nil {
@@ -403,7 +403,7 @@ func configUnsetAll(key, value string) error {
403403
}
404404
return nil
405405
}
406-
if err.IsExitCode(1) {
406+
if IsErrorExitCode(err, 1) {
407407
// not exist
408408
return nil
409409
}

modules/git/grep.go

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ package git
55

66
import (
77
"bufio"
8+
"bytes"
89
"context"
910
"errors"
1011
"fmt"
11-
"io"
1212
"os"
1313
"strconv"
1414
"strings"
@@ -33,15 +33,9 @@ func GrepSearch(ctx context.Context, repo *Repository, search string, opts GrepO
3333
if err != nil {
3434
return nil, fmt.Errorf("unable to create os pipe to grep: %w", err)
3535
}
36-
stderrReader, stderrWriter, err := os.Pipe()
37-
if err != nil {
38-
return nil, fmt.Errorf("unable to create os pipe to grep: %w", err)
39-
}
4036
defer func() {
4137
_ = stdoutReader.Close()
4238
_ = stdoutWriter.Close()
43-
_ = stderrReader.Close()
44-
_ = stderrWriter.Close()
4539
}()
4640

4741
/*
@@ -53,28 +47,26 @@ func GrepSearch(ctx context.Context, repo *Repository, search string, opts GrepO
5347
HEAD:.changelog.yml
5448
2^@repo: go-gitea/gitea
5549
*/
56-
var stderr []byte
5750
var results []*GrepResult
5851
cmd := NewCommand(ctx, "grep", "--null", "--break", "--heading", "--fixed-strings", "--line-number", "--ignore-case", "--full-name")
5952
cmd.AddOptionValues("--context", fmt.Sprint(opts.ContextLineNumber))
6053
if opts.IsFuzzy {
6154
words := strings.Fields(search)
6255
for _, word := range words {
63-
cmd.AddOptionValues("-e", word)
56+
cmd.AddOptionValues("-e", strings.TrimLeft(word, "-"))
6457
}
6558
} else {
66-
cmd.AddOptionValues("-e", search)
59+
cmd.AddOptionValues("-e", strings.TrimLeft(search, "-"))
6760
}
6861
cmd.AddDynamicArguments(util.IfZero(opts.RefName, "HEAD"))
62+
stderr := bytes.Buffer{}
6963
err = cmd.Run(&RunOpts{
7064
Dir: repo.Path,
7165
Stdout: stdoutWriter,
72-
Stderr: stderrWriter,
66+
Stderr: &stderr,
7367
PipelineFunc: func(ctx context.Context, cancel context.CancelFunc) error {
7468
_ = stdoutWriter.Close()
75-
_ = stderrWriter.Close()
7669
defer stdoutReader.Close()
77-
defer stderrReader.Close()
7870

7971
isInBlock := false
8072
scanner := bufio.NewScanner(stdoutReader)
@@ -106,12 +98,15 @@ func GrepSearch(ctx context.Context, repo *Repository, search string, opts GrepO
10698
res.LineCodes = append(res.LineCodes, lineCode)
10799
}
108100
}
109-
stderr, _ = io.ReadAll(stderrReader)
110101
return scanner.Err()
111102
},
112103
})
113-
if err != nil && !errors.Is(err, context.Canceled) && len(stderr) != 0 {
114-
return nil, fmt.Errorf("unable to run git grep: %w, stderr: %s", err, string(stderr))
104+
// git grep exits with 1 if no results are found
105+
if IsErrorExitCode(err, 1) && stderr.Len() == 0 {
106+
return nil, nil
107+
}
108+
if err != nil && !errors.Is(err, context.Canceled) {
109+
return nil, fmt.Errorf("unable to run git grep: %w, stderr: %s", err, stderr.String())
115110
}
116111
return results, nil
117112
}

modules/git/grep_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,7 @@ func TestGrepSearch(t *testing.T) {
3434
res, err = GrepSearch(context.Background(), repo, "no-such-content", GrepOptions{})
3535
assert.NoError(t, err)
3636
assert.Len(t, res, 0)
37+
38+
res, err = GrepSearch(context.Background(), &Repository{Path: "no-such-git-repo"}, "no-such-content", GrepOptions{})
39+
assert.Error(t, err)
3740
}

0 commit comments

Comments
 (0)