Skip to content

Commit 97d9e24

Browse files
committed
Added scaffolding to return updated-port after upload
1 parent d7e9242 commit 97d9e24

File tree

8 files changed

+372
-232
lines changed

8 files changed

+372
-232
lines changed

commands/daemon/daemon.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -307,13 +307,17 @@ func (s *ArduinoCoreServerImpl) Upload(req *rpc.UploadRequest, stream rpc.Arduin
307307
Message: &rpc.UploadResponse_ErrStream{ErrStream: data},
308308
})
309309
})
310-
err := upload.Upload(stream.Context(), req, outStream, errStream)
310+
res, err := upload.Upload(stream.Context(), req, outStream, errStream)
311311
outStream.Close()
312312
errStream.Close()
313-
if err != nil {
314-
return convertErrorToRPCStatus(err)
313+
if res != nil {
314+
syncSend.Send(&rpc.UploadResponse{
315+
Message: &rpc.UploadResponse_Result{
316+
Result: res,
317+
},
318+
})
315319
}
316-
return nil
320+
return convertErrorToRPCStatus(err)
317321
}
318322

319323
// UploadUsingProgrammer FIXMEDOC

commands/upload/burnbootloader.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func BurnBootloader(ctx context.Context, req *rpc.BurnBootloaderRequest, outStre
3939
}
4040
defer release()
4141

42-
err := runProgramAction(
42+
_, err := runProgramAction(
4343
pme,
4444
nil, // sketch
4545
"", // importFile

commands/upload/upload.go

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -123,24 +123,24 @@ func getUserFields(toolID string, platformRelease *cores.PlatformRelease) []*rpc
123123
}
124124

125125
// Upload FIXMEDOC
126-
func Upload(ctx context.Context, req *rpc.UploadRequest, outStream io.Writer, errStream io.Writer) error {
126+
func Upload(ctx context.Context, req *rpc.UploadRequest, outStream io.Writer, errStream io.Writer) (*rpc.UploadResult, error) {
127127
logrus.Tracef("Upload %s on %s started", req.GetSketchPath(), req.GetFqbn())
128128

129129
// TODO: make a generic function to extract sketch from request
130130
// and remove duplication in commands/compile.go
131131
sketchPath := paths.New(req.GetSketchPath())
132132
sk, err := sketch.New(sketchPath)
133133
if err != nil && req.GetImportDir() == "" && req.GetImportFile() == "" {
134-
return &arduino.CantOpenSketchError{Cause: err}
134+
return nil, &arduino.CantOpenSketchError{Cause: err}
135135
}
136136

137137
pme, release := commands.GetPackageManagerExplorer(req)
138138
if pme == nil {
139-
return &arduino.InvalidInstanceError{}
139+
return nil, &arduino.InvalidInstanceError{}
140140
}
141141
defer release()
142142

143-
if err := runProgramAction(
143+
updatedPort, err := runProgramAction(
144144
pme,
145145
sk,
146146
req.GetImportFile(),
@@ -155,11 +155,14 @@ func Upload(ctx context.Context, req *rpc.UploadRequest, outStream io.Writer, er
155155
errStream,
156156
req.GetDryRun(),
157157
req.GetUserFields(),
158-
); err != nil {
159-
return err
158+
)
159+
if err != nil {
160+
return nil, err
160161
}
161162

162-
return nil
163+
return &rpc.UploadResult{
164+
UpdatedUploadPort: updatedPort,
165+
}, nil
163166
}
164167

165168
// UsingProgrammer FIXMEDOC
@@ -169,7 +172,7 @@ func UsingProgrammer(ctx context.Context, req *rpc.UploadUsingProgrammerRequest,
169172
if req.GetProgrammer() == "" {
170173
return &arduino.MissingProgrammerError{}
171174
}
172-
err := Upload(ctx, &rpc.UploadRequest{
175+
_, err := Upload(ctx, &rpc.UploadRequest{
173176
Instance: req.GetInstance(),
174177
SketchPath: req.GetSketchPath(),
175178
ImportFile: req.GetImportFile(),
@@ -190,10 +193,10 @@ func runProgramAction(pme *packagemanager.Explorer,
190193
programmerID string,
191194
verbose, verify, burnBootloader bool,
192195
outStream, errStream io.Writer,
193-
dryRun bool, userFields map[string]string) error {
196+
dryRun bool, userFields map[string]string) (*rpc.Port, error) {
194197

195198
if burnBootloader && programmerID == "" {
196-
return &arduino.MissingProgrammerError{}
199+
return nil, &arduino.MissingProgrammerError{}
197200
}
198201
if port == nil || (port.Address == "" && port.Protocol == "") {
199202
// For no-port uploads use "default" protocol
@@ -203,19 +206,19 @@ func runProgramAction(pme *packagemanager.Explorer,
203206

204207
fqbn, err := cores.ParseFQBN(fqbnIn)
205208
if err != nil {
206-
return &arduino.InvalidFQBNError{Cause: err}
209+
return nil, &arduino.InvalidFQBNError{Cause: err}
207210
}
208211
logrus.WithField("fqbn", fqbn).Tracef("Detected FQBN")
209212

210213
// Find target board and board properties
211214
_, boardPlatform, board, boardProperties, buildPlatform, err := pme.ResolveFQBN(fqbn)
212215
if boardPlatform == nil {
213-
return &arduino.PlatformNotFoundError{
216+
return nil, &arduino.PlatformNotFoundError{
214217
Platform: fmt.Sprintf("%s:%s", fqbn.Package, fqbn.PlatformArch),
215218
Cause: err,
216219
}
217220
} else if err != nil {
218-
return &arduino.UnknownFQBNError{Cause: err}
221+
return nil, &arduino.UnknownFQBNError{Cause: err}
219222
}
220223
logrus.
221224
WithField("boardPlatform", boardPlatform).
@@ -232,7 +235,7 @@ func runProgramAction(pme *packagemanager.Explorer,
232235
programmer = buildPlatform.Programmers[programmerID]
233236
}
234237
if programmer == nil {
235-
return &arduino.ProgrammerNotFoundError{Programmer: programmerID}
238+
return nil, &arduino.ProgrammerNotFoundError{Programmer: programmerID}
236239
}
237240
}
238241

@@ -253,7 +256,7 @@ func runProgramAction(pme *packagemanager.Explorer,
253256
}
254257
uploadToolID, err := getToolID(props, action, port.Protocol)
255258
if err != nil {
256-
return err
259+
return nil, err
257260
}
258261

259262
var uploadToolPlatform *cores.PlatformRelease
@@ -268,7 +271,7 @@ func runProgramAction(pme *packagemanager.Explorer,
268271
Trace("Upload tool")
269272

270273
if split := strings.Split(uploadToolID, ":"); len(split) > 2 {
271-
return &arduino.InvalidPlatformPropertyError{
274+
return nil, &arduino.InvalidPlatformPropertyError{
272275
Property: fmt.Sprintf("%s.tool.%s", action, port.Protocol), // TODO: Can be done better, maybe inline getToolID(...)
273276
Value: uploadToolID}
274277
} else if len(split) == 2 {
@@ -277,12 +280,12 @@ func runProgramAction(pme *packagemanager.Explorer,
277280
PlatformArchitecture: boardPlatform.Platform.Architecture,
278281
})
279282
if p == nil {
280-
return &arduino.PlatformNotFoundError{Platform: split[0] + ":" + boardPlatform.Platform.Architecture}
283+
return nil, &arduino.PlatformNotFoundError{Platform: split[0] + ":" + boardPlatform.Platform.Architecture}
281284
}
282285
uploadToolID = split[1]
283286
uploadToolPlatform = pme.GetInstalledPlatformRelease(p)
284287
if uploadToolPlatform == nil {
285-
return &arduino.PlatformNotFoundError{Platform: split[0] + ":" + boardPlatform.Platform.Architecture}
288+
return nil, &arduino.PlatformNotFoundError{Platform: split[0] + ":" + boardPlatform.Platform.Architecture}
286289
}
287290
}
288291

@@ -309,7 +312,7 @@ func runProgramAction(pme *packagemanager.Explorer,
309312
}
310313

311314
if !uploadProperties.ContainsKey("upload.protocol") && programmer == nil {
312-
return &arduino.ProgrammerRequiredForUploadError{}
315+
return nil, &arduino.ProgrammerRequiredForUploadError{}
313316
}
314317

315318
// Set properties for verbose upload
@@ -357,13 +360,13 @@ func runProgramAction(pme *packagemanager.Explorer,
357360
if !burnBootloader {
358361
importPath, sketchName, err := determineBuildPathAndSketchName(importFile, importDir, sk, fqbn)
359362
if err != nil {
360-
return &arduino.NotFoundError{Message: tr("Error finding build artifacts"), Cause: err}
363+
return nil, &arduino.NotFoundError{Message: tr("Error finding build artifacts"), Cause: err}
361364
}
362365
if !importPath.Exist() {
363-
return &arduino.NotFoundError{Message: tr("Compiled sketch not found in %s", importPath)}
366+
return nil, &arduino.NotFoundError{Message: tr("Compiled sketch not found in %s", importPath)}
364367
}
365368
if !importPath.IsDir() {
366-
return &arduino.NotFoundError{Message: tr("Expected compiled sketch in directory %s, but is a file instead", importPath)}
369+
return nil, &arduino.NotFoundError{Message: tr("Expected compiled sketch in directory %s, but is a file instead", importPath)}
367370
}
368371
uploadProperties.SetPath("build.path", importPath)
369372
uploadProperties.Set("build.project_name", sketchName)
@@ -466,22 +469,28 @@ func runProgramAction(pme *packagemanager.Explorer,
466469
toolEnv := pme.GetEnvVarsForSpawnedProcess()
467470
if burnBootloader {
468471
if err := runTool("erase.pattern", uploadProperties, outStream, errStream, verbose, dryRun, toolEnv); err != nil {
469-
return &arduino.FailedUploadError{Message: tr("Failed chip erase"), Cause: err}
472+
return nil, &arduino.FailedUploadError{Message: tr("Failed chip erase"), Cause: err}
470473
}
471474
if err := runTool("bootloader.pattern", uploadProperties, outStream, errStream, verbose, dryRun, toolEnv); err != nil {
472-
return &arduino.FailedUploadError{Message: tr("Failed to burn bootloader"), Cause: err}
475+
return nil, &arduino.FailedUploadError{Message: tr("Failed to burn bootloader"), Cause: err}
473476
}
474477
} else if programmer != nil {
475478
if err := runTool("program.pattern", uploadProperties, outStream, errStream, verbose, dryRun, toolEnv); err != nil {
476-
return &arduino.FailedUploadError{Message: tr("Failed programming"), Cause: err}
479+
return nil, &arduino.FailedUploadError{Message: tr("Failed programming"), Cause: err}
477480
}
478481
} else {
479482
if err := runTool("upload.pattern", uploadProperties, outStream, errStream, verbose, dryRun, toolEnv); err != nil {
480-
return &arduino.FailedUploadError{Message: tr("Failed uploading"), Cause: err}
483+
return nil, &arduino.FailedUploadError{Message: tr("Failed uploading"), Cause: err}
481484
}
482485
}
483486

484487
logrus.Tracef("Upload successful")
488+
return nil, nil // TODO: return new port
489+
}
490+
491+
func detectNewUploadPort(oldPort *rpc.Port) *rpc.Port {
492+
logrus.Tracef("Detecting new board port")
493+
// TODO
485494
return nil
486495
}
487496

commands/upload/upload_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ func TestUploadPropertiesComposition(t *testing.T) {
184184
testRunner := func(t *testing.T, test test, verboseVerify bool) {
185185
outStream := &bytes.Buffer{}
186186
errStream := &bytes.Buffer{}
187-
err := runProgramAction(
187+
_, err := runProgramAction(
188188
pme,
189189
nil, // sketch
190190
"", // importFile

internal/cli/compile/compile.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,8 @@ func runCompileCommand(cmd *cobra.Command, args []string) {
236236
DoNotExpandBuildProperties: showProperties == arguments.ShowPropertiesUnexpanded,
237237
}
238238
compileRes, compileError := compile.Compile(context.Background(), compileRequest, stdOut, stdErr, nil)
239+
240+
var uploadRes *rpc.UploadResult
239241
if compileError == nil && uploadAfterCompile {
240242
userFieldRes, err := upload.SupportedUserFields(context.Background(), &rpc.SupportedUserFieldsRequest{
241243
Instance: inst,
@@ -268,8 +270,10 @@ func runCompileCommand(cmd *cobra.Command, args []string) {
268270
UserFields: fields,
269271
}
270272

271-
if err := upload.Upload(context.Background(), uploadRequest, stdOut, stdErr); err != nil {
273+
if res, err := upload.Upload(context.Background(), uploadRequest, stdOut, stdErr); err != nil {
272274
feedback.Fatal(tr("Error during Upload: %v", err), feedback.ErrGeneric)
275+
} else {
276+
uploadRes = res
273277
}
274278
}
275279

@@ -330,6 +334,7 @@ func runCompileCommand(cmd *cobra.Command, args []string) {
330334
CompilerOut: stdIO.Stdout,
331335
CompilerErr: stdIO.Stderr,
332336
BuilderResult: compileRes,
337+
UploadResult: uploadRes,
333338
ProfileOut: profileOut,
334339
Success: compileError == nil,
335340
showPropertiesMode: showProperties,
@@ -375,6 +380,7 @@ type compileResult struct {
375380
CompilerOut string `json:"compiler_out"`
376381
CompilerErr string `json:"compiler_err"`
377382
BuilderResult *rpc.CompileResponse `json:"builder_result"`
383+
UploadResult *rpc.UploadResult `json:"upload_result"`
378384
Success bool `json:"success"`
379385
ProfileOut string `json:"profile_out,omitempty"`
380386
Error string `json:"error,omitempty"`

internal/cli/upload/upload.go

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,31 @@ func runUploadCommand(command *cobra.Command, args []string) {
168168
DryRun: dryRun,
169169
UserFields: fields,
170170
}
171-
if err := upload.Upload(context.Background(), req, stdOut, stdErr); err != nil {
171+
if res, err := upload.Upload(context.Background(), req, stdOut, stdErr); err != nil {
172172
feedback.FatalError(err, feedback.ErrGeneric)
173+
} else {
174+
io := stdIOResult()
175+
feedback.PrintResult(&uploadResult{
176+
Stdout: io.Stdout,
177+
Stderr: io.Stderr,
178+
UpdatedUploadPort: res.UpdatedUploadPort,
179+
})
173180
}
174-
feedback.PrintResult(stdIOResult())
181+
}
182+
183+
type uploadResult struct {
184+
Stdout string `json:"stdout"`
185+
Stderr string `json:"stderr"`
186+
UpdatedUploadPort *rpc.Port `json:"updated_upload_port,omitempty"`
187+
}
188+
189+
func (r *uploadResult) Data() interface{} {
190+
return r
191+
}
192+
193+
func (r *uploadResult) String() string {
194+
if r.UpdatedUploadPort == nil {
195+
return ""
196+
}
197+
return tr("New upload port: %[1]s (%[2]s)", r.UpdatedUploadPort.Address, r.UpdatedUploadPort.Protocol)
175198
}

0 commit comments

Comments
 (0)