Skip to content

Commit 2de2656

Browse files
committed
fix
1 parent 7ff3463 commit 2de2656

File tree

2 files changed

+52
-34
lines changed

2 files changed

+52
-34
lines changed

modules/git/gitcmd/command.go

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -453,18 +453,16 @@ func IsErrorExitCode(err error, code int) bool {
453453

454454
// RunStdString runs the command and returns stdout/stderr as string. and store stderr to returned error (err combined with stderr).
455455
func (c *Command) RunStdString(ctx context.Context) (stdout, stderr string, runErr RunStdError) {
456-
stdoutBytes, stderrBytes, err := c.WithParentCallerInfo().RunStdBytes(ctx)
457-
stdout = util.UnsafeBytesToString(stdoutBytes)
458-
stderr = util.UnsafeBytesToString(stderrBytes)
459-
if err != nil {
460-
return stdout, stderr, &runStdError{err: err, stderr: stderr}
461-
}
462-
// even if there is no err, there could still be some stderr output, so we just return stdout/stderr as they are
463-
return stdout, stderr, nil
456+
stdoutBytes, stderrBytes, runErr := c.WithParentCallerInfo().runStdBytes(ctx)
457+
return util.UnsafeBytesToString(stdoutBytes), util.UnsafeBytesToString(stderrBytes), runErr
464458
}
465459

466460
// RunStdBytes runs the command and returns stdout/stderr as bytes. and store stderr to returned error (err combined with stderr).
467-
func (c *Command) RunStdBytes(ctx context.Context) (stdout, stderr []byte, runErr RunStdError) {
461+
func (c *Command) RunStdBytes(ctx context.Context) ( /*stdout*/ []byte /*stderr*/, []byte /*runErr*/, RunStdError) {
462+
return c.WithParentCallerInfo().runStdBytes(ctx)
463+
}
464+
465+
func (c *Command) runStdBytes(ctx context.Context) ( /*stdout*/ []byte /*stderr*/, []byte /*runErr*/, RunStdError) {
468466
if c.opts.Stdout != nil || c.opts.Stderr != nil {
469467
// we must panic here, otherwise there would be bugs if developers set Stdin/Stderr by mistake, and it would be very difficult to debug
470468
panic("stdout and stderr field must be nil when using RunStdBytes")

modules/git/gitcmd/command_test.go

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -23,38 +23,58 @@ func TestMain(m *testing.M) {
2323
defer cleanup()
2424

2525
setting.Git.HomePath = gitHomePath
26+
os.Exit(m.Run())
2627
}
2728

2829
func TestRunWithContextStd(t *testing.T) {
29-
cmd := NewCommand("--version")
30-
stdout, stderr, err := cmd.RunStdString(t.Context())
31-
assert.NoError(t, err)
32-
assert.Empty(t, stderr)
33-
assert.Contains(t, stdout, "git version")
34-
35-
cmd = NewCommand("--no-such-arg")
36-
stdout, stderr, err = cmd.RunStdString(t.Context())
37-
if assert.Error(t, err) {
38-
assert.Equal(t, stderr, err.Stderr())
39-
assert.Contains(t, err.Stderr(), "unknown option:")
40-
assert.Contains(t, err.Error(), "exit status 129 - unknown option:")
41-
assert.Empty(t, stdout)
30+
{
31+
cmd := NewCommand("--version")
32+
stdout, stderr, err := cmd.RunStdString(t.Context())
33+
assert.NoError(t, err)
34+
assert.Empty(t, stderr)
35+
assert.Contains(t, stdout, "git version")
4236
}
4337

44-
cmd = NewCommand()
45-
cmd.AddDynamicArguments("-test")
46-
assert.ErrorIs(t, cmd.Run(t.Context()), ErrBrokenCommand)
38+
{
39+
cmd := NewCommand("ls-tree", "no-such")
40+
stdout, stderr, err := cmd.RunStdString(t.Context())
41+
if assert.Error(t, err) {
42+
assert.Equal(t, stderr, err.Stderr())
43+
assert.Equal(t, "fatal: Not a valid object name no-such\n", err.Stderr())
44+
assert.Equal(t, "exit status 128 - fatal: Not a valid object name no-such\n", err.Error())
45+
assert.Empty(t, stdout)
46+
}
47+
}
48+
49+
{
50+
cmd := NewCommand("ls-tree", "no-such")
51+
stdout, stderr, err := cmd.RunStdBytes(t.Context())
52+
if assert.Error(t, err) {
53+
assert.Equal(t, string(stderr), err.Stderr())
54+
assert.Equal(t, "fatal: Not a valid object name no-such\n", err.Stderr())
55+
assert.Equal(t, "exit status 128 - fatal: Not a valid object name no-such\n", err.Error())
56+
assert.Empty(t, stdout)
57+
}
58+
}
4759

48-
cmd = NewCommand()
49-
cmd.AddDynamicArguments("--test")
50-
assert.ErrorIs(t, cmd.Run(t.Context()), ErrBrokenCommand)
60+
{
61+
cmd := NewCommand()
62+
cmd.AddDynamicArguments("-test")
63+
assert.ErrorIs(t, cmd.Run(t.Context()), ErrBrokenCommand)
5164

52-
subCmd := "version"
53-
cmd = NewCommand().AddDynamicArguments(subCmd) // for test purpose only, the sub-command should never be dynamic for production
54-
stdout, stderr, err = cmd.RunStdString(t.Context())
55-
assert.NoError(t, err)
56-
assert.Empty(t, stderr)
57-
assert.Contains(t, stdout, "git version")
65+
cmd = NewCommand()
66+
cmd.AddDynamicArguments("--test")
67+
assert.ErrorIs(t, cmd.Run(t.Context()), ErrBrokenCommand)
68+
}
69+
70+
{
71+
subCmd := "version"
72+
cmd := NewCommand().AddDynamicArguments(subCmd) // for test purpose only, the sub-command should never be dynamic for production
73+
stdout, stderr, err := cmd.RunStdString(t.Context())
74+
assert.NoError(t, err)
75+
assert.Empty(t, stderr)
76+
assert.Contains(t, stdout, "git version")
77+
}
5878
}
5979

6080
func TestGitArgument(t *testing.T) {

0 commit comments

Comments
 (0)