Don't print "context canceled" if user terminated
Without breaking API compatibility, this patch allows us to know whether a returned `cli/StatusError` was caused by a context cancellation or not, which we can use to provide a nicer UX and not print the Go "context canceled" error message if this is the cause. Signed-off-by: Laura Brehm <laurabrehm@hey.com>
This commit is contained in:
parent
d48fb9f9f7
commit
85a77af591
@ -324,6 +324,7 @@ func toStatusError(err error) error {
|
|||||||
|
|
||||||
if strings.Contains(errMsg, "executable file not found") || strings.Contains(errMsg, "no such file or directory") || strings.Contains(errMsg, "system cannot find the file specified") {
|
if strings.Contains(errMsg, "executable file not found") || strings.Contains(errMsg, "no such file or directory") || strings.Contains(errMsg, "system cannot find the file specified") {
|
||||||
return cli.StatusError{
|
return cli.StatusError{
|
||||||
|
Cause: err,
|
||||||
Status: withHelp(err, "run").Error(),
|
Status: withHelp(err, "run").Error(),
|
||||||
StatusCode: 127,
|
StatusCode: 127,
|
||||||
}
|
}
|
||||||
@ -331,12 +332,14 @@ func toStatusError(err error) error {
|
|||||||
|
|
||||||
if strings.Contains(errMsg, syscall.EACCES.Error()) || strings.Contains(errMsg, syscall.EISDIR.Error()) {
|
if strings.Contains(errMsg, syscall.EACCES.Error()) || strings.Contains(errMsg, syscall.EISDIR.Error()) {
|
||||||
return cli.StatusError{
|
return cli.StatusError{
|
||||||
|
Cause: err,
|
||||||
Status: withHelp(err, "run").Error(),
|
Status: withHelp(err, "run").Error(),
|
||||||
StatusCode: 126,
|
StatusCode: 126,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return cli.StatusError{
|
return cli.StatusError{
|
||||||
|
Cause: err,
|
||||||
Status: withHelp(err, "run").Error(),
|
Status: withHelp(err, "run").Error(),
|
||||||
StatusCode: 125,
|
StatusCode: 125,
|
||||||
}
|
}
|
||||||
|
@ -290,6 +290,7 @@ func TestRunPullTermination(t *testing.T) {
|
|||||||
select {
|
select {
|
||||||
case cmdErr := <-cmdErrC:
|
case cmdErr := <-cmdErrC:
|
||||||
assert.Equal(t, cmdErr, cli.StatusError{
|
assert.Equal(t, cmdErr, cli.StatusError{
|
||||||
|
Cause: context.Canceled,
|
||||||
StatusCode: 125,
|
StatusCode: 125,
|
||||||
Status: "docker: context canceled\n\nRun 'docker run --help' for more information",
|
Status: "docker: context canceled\n\nRun 'docker run --help' for more information",
|
||||||
})
|
})
|
||||||
|
14
cli/error.go
14
cli/error.go
@ -6,6 +6,7 @@ import (
|
|||||||
|
|
||||||
// StatusError reports an unsuccessful exit by a command.
|
// StatusError reports an unsuccessful exit by a command.
|
||||||
type StatusError struct {
|
type StatusError struct {
|
||||||
|
Cause error
|
||||||
Status string
|
Status string
|
||||||
StatusCode int
|
StatusCode int
|
||||||
}
|
}
|
||||||
@ -14,8 +15,15 @@ type StatusError struct {
|
|||||||
// it is returned as-is, otherwise it generates a generic error-message
|
// it is returned as-is, otherwise it generates a generic error-message
|
||||||
// based on the StatusCode.
|
// based on the StatusCode.
|
||||||
func (e StatusError) Error() string {
|
func (e StatusError) Error() string {
|
||||||
if e.Status == "" {
|
if e.Status != "" {
|
||||||
return "exit status " + strconv.Itoa(e.StatusCode)
|
return e.Status
|
||||||
}
|
}
|
||||||
return e.Status
|
if e.Cause != nil {
|
||||||
|
return e.Cause.Error()
|
||||||
|
}
|
||||||
|
return "exit status " + strconv.Itoa(e.StatusCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e StatusError) Unwrap() error {
|
||||||
|
return e.Cause
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user