Skip to content

Commit f85af84

Browse files
committed
Added specific exit-code for "missing programmer" kind of errors. (arduino#2429)
* Added gRPC message errors * Implemented specific exit-code for "programmer not found" error
1 parent 2eba12e commit f85af84

File tree

9 files changed

+196
-88
lines changed

9 files changed

+196
-88
lines changed

Diff for: arduino/errors.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,8 @@ func (e *MissingProgrammerError) Error() string {
290290

291291
// ToRPCStatus converts the error into a *status.Status
292292
func (e *MissingProgrammerError) ToRPCStatus() *status.Status {
293-
return status.New(codes.InvalidArgument, e.Error())
293+
s, _ := status.New(codes.InvalidArgument, e.Error()).WithDetails(&rpc.MissingProgrammerError{})
294+
return s
294295
}
295296

296297
// ProgrammerRequiredForUploadError is returned when the upload can be done only using a programmer

Diff for: commands/daemon/debug.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -63,5 +63,6 @@ func (s *ArduinoCoreServerImpl) Debug(stream rpc.ArduinoCoreService_DebugServer)
6363

6464
// GetDebugConfig return metadata about a debug session
6565
func (s *ArduinoCoreServerImpl) GetDebugConfig(ctx context.Context, req *rpc.GetDebugConfigRequest) (*rpc.GetDebugConfigResponse, error) {
66-
return cmd.GetDebugConfig(ctx, req)
66+
res, err := cmd.GetDebugConfig(ctx, req)
67+
return res, convertErrorToRPCStatus(err)
6768
}

Diff for: internal/cli/burnbootloader/burnbootloader.go

+10-1
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@ package burnbootloader
1717

1818
import (
1919
"context"
20+
"errors"
2021
"os"
2122

23+
"github.com/arduino/arduino-cli/arduino"
2224
"github.com/arduino/arduino-cli/commands/upload"
2325
"github.com/arduino/arduino-cli/i18n"
2426
"github.com/arduino/arduino-cli/internal/cli/arguments"
@@ -82,7 +84,14 @@ func runBootloaderCommand(command *cobra.Command, args []string) {
8284
Programmer: programmer.String(instance, fqbn.String()),
8385
DryRun: dryRun,
8486
}, stdOut, stdErr); err != nil {
85-
feedback.Fatal(tr("Error during Upload: %v", err), feedback.ErrGeneric)
87+
errcode := feedback.ErrGeneric
88+
if errors.Is(err, &arduino.ProgrammerRequiredForUploadError{}) {
89+
errcode = feedback.ErrMissingProgrammer
90+
}
91+
if errors.Is(err, &arduino.MissingProgrammerError{}) {
92+
errcode = feedback.ErrMissingProgrammer
93+
}
94+
feedback.Fatal(tr("Error during Upload: %v", err), errcode)
8695
}
8796
feedback.PrintResult(res())
8897
}

Diff for: internal/cli/compile/compile.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,14 @@ func runCompileCommand(cmd *cobra.Command, args []string) {
280280
}
281281

282282
if res, err := upload.Upload(context.Background(), uploadRequest, stdOut, stdErr); err != nil {
283-
feedback.Fatal(tr("Error during Upload: %v", err), feedback.ErrGeneric)
283+
errcode := feedback.ErrGeneric
284+
if errors.Is(err, &arduino.ProgrammerRequiredForUploadError{}) {
285+
errcode = feedback.ErrMissingProgrammer
286+
}
287+
if errors.Is(err, &arduino.MissingProgrammerError{}) {
288+
errcode = feedback.ErrMissingProgrammer
289+
}
290+
feedback.Fatal(tr("Error during Upload: %v", err), errcode)
284291
} else {
285292
uploadRes = res
286293
}

Diff for: internal/cli/debug/debug.go

+12-2
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@ package debug
1818
import (
1919
"context"
2020
"encoding/json"
21+
"errors"
2122
"os"
2223
"os/signal"
2324

25+
"github.com/arduino/arduino-cli/arduino"
2426
"github.com/arduino/arduino-cli/commands/debug"
2527
"github.com/arduino/arduino-cli/commands/sketch"
2628
"github.com/arduino/arduino-cli/i18n"
@@ -93,7 +95,11 @@ func runDebugCommand(command *cobra.Command, args []string) {
9395
if printInfo {
9496

9597
if res, err := debug.GetDebugConfig(context.Background(), debugConfigRequested); err != nil {
96-
feedback.Fatal(tr("Error getting Debug info: %v", err), feedback.ErrBadArgument)
98+
errcode := feedback.ErrBadArgument
99+
if errors.Is(err, &arduino.MissingProgrammerError{}) {
100+
errcode = feedback.ErrMissingProgrammer
101+
}
102+
feedback.Fatal(tr("Error getting Debug info: %v", err), errcode)
97103
} else {
98104
feedback.PrintResult(newDebugInfoResult(res))
99105
}
@@ -109,7 +115,11 @@ func runDebugCommand(command *cobra.Command, args []string) {
109115
feedback.FatalError(err, feedback.ErrBadArgument)
110116
}
111117
if _, err := debug.Debug(context.Background(), debugConfigRequested, in, out, ctrlc); err != nil {
112-
feedback.Fatal(tr("Error during Debug: %v", err), feedback.ErrGeneric)
118+
errcode := feedback.ErrGeneric
119+
if errors.Is(err, &arduino.MissingProgrammerError{}) {
120+
errcode = feedback.ErrMissingProgrammer
121+
}
122+
feedback.Fatal(tr("Error during Debug: %v", err), errcode)
113123
}
114124

115125
}

Diff for: internal/cli/feedback/errorcodes.go

+14
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,18 @@ const (
4242

4343
// ErrBadArgument is returned when the arguments are not valid (7)
4444
ErrBadArgument
45+
46+
// ErrFailedToListenToTCPPort is returned if the CLI failed to open a TCP port
47+
// to listen for incoming connections (8)
48+
ErrFailedToListenToTCPPort
49+
50+
// ErrBadTCPPortArgument is returned if the TCP port argument is not valid (9)
51+
ErrBadTCPPortArgument
52+
53+
// ErrInitializingInventory is returned when the inventory cannot be initialized,
54+
// usually depends on a wrong configuration of the data dir (10)
55+
ErrInitializingInventory
56+
57+
// ErrMissingProgrammer is returned when the programmer argument is missing (11)
58+
ErrMissingProgrammer
4559
)

Diff for: internal/cli/upload/upload.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,14 @@ func runUploadCommand(args []string, uploadFieldsArgs map[string]string) {
193193
UserFields: fields,
194194
}
195195
if res, err := upload.Upload(context.Background(), req, stdOut, stdErr); err != nil {
196-
feedback.FatalError(err, feedback.ErrGeneric)
196+
errcode := feedback.ErrGeneric
197+
if errors.Is(err, &arduino.ProgrammerRequiredForUploadError{}) {
198+
errcode = feedback.ErrMissingProgrammer
199+
}
200+
if errors.Is(err, &arduino.MissingProgrammerError{}) {
201+
errcode = feedback.ErrMissingProgrammer
202+
}
203+
feedback.FatalError(err, errcode)
197204
} else {
198205
io := stdIOResult()
199206
feedback.PrintResult(&uploadResult{

0 commit comments

Comments
 (0)