99 "fmt"
1010 "os/exec"
1111 "strings"
12+
13+ "gitea.dev/modules/util"
1214)
1315
1416type RunStdError interface {
@@ -41,32 +43,14 @@ func (r *runStdError) Stderr() string {
4143}
4244
4345func ErrorAsStderr (err error ) (string , bool ) {
44- var runErr RunStdError
45- if errors .As (err , & runErr ) {
46+ if runErr , ok := errors.AsType [RunStdError ](err ); ok {
4647 return runErr .Stderr (), true
4748 }
4849 return "" , false
4950}
5051
51- func StderrHasPrefix (err error , prefix string ) bool {
52- stderr , ok := ErrorAsStderr (err )
53- if ! ok {
54- return false
55- }
56- return strings .HasPrefix (stderr , prefix )
57- }
58-
59- func StderrContains (err error , sub string ) bool {
60- stderr , ok := ErrorAsStderr (err )
61- if ! ok {
62- return false
63- }
64- return strings .Contains (stderr , sub )
65- }
66-
6752func IsErrorExitCode (err error , code int ) bool {
68- var exitError * exec.ExitError
69- if errors .As (err , & exitError ) {
53+ if exitError , ok := errors.AsType [* exec.ExitError ](err ); ok {
7054 return exitError .ExitCode () == code
7155 }
7256 return false
@@ -85,11 +69,41 @@ func IsErrorCanceledOrKilled(err error) bool {
8569 return errors .Is (err , context .Canceled ) || IsErrorSignalKilled (err )
8670}
8771
88- func IsStdErrorNotValidObjectName (err error ) bool {
72+ type StderrPrefix string
73+
74+ type StderrSubStr string
75+
76+ const (
77+ StderrNotValidObjectName StderrPrefix = "fatal: not a valid object name"
78+ StderrNotTreeObject StderrPrefix = "fatal: not a tree object"
79+ StderrPathSpec StderrPrefix = "fatal: pathspec"
80+ StderrBadRevision StderrPrefix = "fatal: bad revision"
81+
82+ StderrNoSuchRemote1 StderrPrefix = "fatal: no such remote" // git < 2.30, exit status 128
83+ StderrNoSuchRemote2 StderrPrefix = "error: no such remote" // git >= 2.30. exit status 2
84+
85+ // fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.
86+ StderrUnknownRevisionOrPath StderrSubStr = "unknown revision or path not in the working tree"
87+ )
88+
89+ func IsStderr [T StderrPrefix | StderrSubStr ](err error , check T ) bool {
8990 stderr , ok := ErrorAsStderr (err )
90- // Git is lowercasing the "fatal: Not a valid object name" error message
91- // ref: https://lore.kernel.org/git/pull.2052.git.1771836302101.gitgitgadget@gmail.com
92- return ok && strings .Contains (strings .ToLower (stderr ), "fatal: not a valid object name" )
91+ if ! ok {
92+ return false
93+ }
94+ checkLen := len (check )
95+ if len (stderr ) < checkLen {
96+ return false
97+ }
98+ switch any (check ).(type ) {
99+ case StderrPrefix :
100+ // Git is lowercasing the "fatal: Not a valid object name" error message
101+ // ref: https://lore.kernel.org/git/pull.2052.git.1771836302101.gitgitgadget@gmail.com
102+ return util .AsciiEqualFold (stderr [:checkLen ], string (check ))
103+ case StderrSubStr :
104+ return strings .Contains (stderr , string (check ))
105+ }
106+ return false
93107}
94108
95109type pipelineError struct {
0 commit comments