Skip to content

Commit ebbe936

Browse files
Luca BianconiBikappa
Luca Bianconi
authored andcommitted
feat: allow to show compilation properties without providing a sketch
1 parent 71a8576 commit ebbe936

File tree

6 files changed

+76
-40
lines changed

6 files changed

+76
-40
lines changed

Diff for: commands/compile/compile.go

+48-31
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,14 @@ func Compile(ctx context.Context, req *rpc.CompileRequest, outStream, errStream
7373
return nil, &arduino.MissingSketchPathError{}
7474
}
7575
sketchPath := paths.New(req.GetSketchPath())
76-
sk, err := sketch.New(sketchPath)
77-
if err != nil {
78-
return nil, &arduino.CantOpenSketchError{Cause: err}
76+
builderCtx := &types.Context{}
77+
builderCtx.PackageManager = pme
78+
if pme.GetProfile() != nil {
79+
builderCtx.LibrariesManager = lm
7980
}
8081

82+
sk, newSketchErr := sketch.New(sketchPath)
83+
8184
fqbnIn := req.GetFqbn()
8285
if fqbnIn == "" && sk != nil {
8386
fqbnIn = sk.GetDefaultFQBN()
@@ -111,13 +114,23 @@ func Compile(ctx context.Context, req *rpc.CompileRequest, outStream, errStream
111114
securityKeysOverride = append(securityKeysOverride, "build.keys.keychain="+req.KeysKeychain, "build.keys.sign_key="+req.GetSignKey(), "build.keys.encrypt_key="+req.EncryptKey)
112115
}
113116

114-
builderCtx := &types.Context{}
115-
builderCtx.PackageManager = pme
116-
if pme.GetProfile() != nil {
117-
builderCtx.LibrariesManager = lm
118-
}
119117
builderCtx.UseCachedLibrariesResolution = req.GetSkipLibrariesDiscovery()
120118
builderCtx.FQBN = fqbn
119+
defer func() {
120+
appendBuildProperties(r, builderCtx)
121+
}()
122+
r = &rpc.CompileResponse{}
123+
if newSketchErr != nil {
124+
if req.GetShowProperties() {
125+
// Just get build properties and exit
126+
compileErr := builder.RunParseHardware(builderCtx)
127+
if compileErr != nil {
128+
compileErr = &arduino.CompileFailedError{Message: compileErr.Error()}
129+
}
130+
return r, compileErr
131+
}
132+
return nil, &arduino.CantOpenSketchError{Cause: err}
133+
}
121134
builderCtx.Sketch = sk
122135
builderCtx.ProgressCB = progressCB
123136

@@ -187,7 +200,6 @@ func Compile(ctx context.Context, req *rpc.CompileRequest, outStream, errStream
187200
builderCtx.OnlyUpdateCompilationDatabase = req.GetCreateCompilationDatabaseOnly()
188201
builderCtx.SourceOverride = req.GetSourceOverride()
189202

190-
r = &rpc.CompileResponse{}
191203
defer func() {
192204
if p := builderCtx.BuildPath; p != nil {
193205
r.BuildPath = p.String()
@@ -200,18 +212,6 @@ func Compile(ctx context.Context, req *rpc.CompileRequest, outStream, errStream
200212
}
201213
}()
202214

203-
defer func() {
204-
buildProperties := builderCtx.BuildProperties
205-
if buildProperties == nil {
206-
return
207-
}
208-
keys := buildProperties.Keys()
209-
sort.Strings(keys)
210-
for _, key := range keys {
211-
r.BuildProperties = append(r.BuildProperties, key+"="+buildProperties.Get(key))
212-
}
213-
}()
214-
215215
if req.GetShowProperties() {
216216
// Just get build properties and exit
217217
compileErr := builder.RunParseHardware(builderCtx)
@@ -231,16 +231,7 @@ func Compile(ctx context.Context, req *rpc.CompileRequest, outStream, errStream
231231
}
232232

233233
defer func() {
234-
importedLibs := []*rpc.Library{}
235-
for _, lib := range builderCtx.ImportedLibraries {
236-
rpcLib, err := lib.ToRPCLibrary()
237-
if err != nil {
238-
msg := tr("Error getting information for library %s", lib.Name) + ": " + err.Error() + "\n"
239-
errStream.Write([]byte(msg))
240-
}
241-
importedLibs = append(importedLibs, rpcLib)
242-
}
243-
r.UsedLibraries = importedLibs
234+
appendUserLibraries(r, builderCtx, errStream)
244235
}()
245236

246237
// if it's a regular build, go on...
@@ -309,6 +300,32 @@ func Compile(ctx context.Context, req *rpc.CompileRequest, outStream, errStream
309300
return r, nil
310301
}
311302

303+
func appendUserLibraries(r *rpc.CompileResponse, builderCtx *types.Context, errStream io.Writer) {
304+
importedLibs := []*rpc.Library{}
305+
for _, lib := range builderCtx.ImportedLibraries {
306+
rpcLib, err := lib.ToRPCLibrary()
307+
if err != nil {
308+
msg := tr("Error getting information for library %s", lib.Name) + ": " + err.Error() + "\n"
309+
errStream.Write([]byte(msg))
310+
}
311+
importedLibs = append(importedLibs, rpcLib)
312+
}
313+
r.UsedLibraries = importedLibs
314+
}
315+
316+
func appendBuildProperties(r *rpc.CompileResponse, builderCtx *types.Context) bool {
317+
buildProperties := builderCtx.BuildProperties
318+
if buildProperties == nil {
319+
return true
320+
}
321+
keys := buildProperties.Keys()
322+
sort.Strings(keys)
323+
for _, key := range keys {
324+
r.BuildProperties = append(r.BuildProperties, key+"="+buildProperties.Get(key))
325+
}
326+
return false
327+
}
328+
312329
// maybePurgeBuildCache runs the build files cache purge if the policy conditions are met.
313330
func maybePurgeBuildCache() {
314331

Diff for: internal/cli/arguments/sketch.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,13 @@ func InitSketchPath(path string) (sketchPath *paths.Path) {
4343
}
4444

4545
// NewSketch is a helper function useful to create a sketch instance
46-
func NewSketch(sketchPath *paths.Path) *sketch.Sketch {
46+
func NewSketch(sketchPath *paths.Path) (*sketch.Sketch, error) {
47+
return sketch.New(sketchPath)
48+
}
49+
50+
// MustNewSketch is a helper function useful to create a sketch instance, exits if the
51+
// initialization fails
52+
func MustNewSketch(sketchPath *paths.Path) *sketch.Sketch {
4753
sketch, err := sketch.New(sketchPath)
4854
if err != nil {
4955
feedback.Fatal(tr("Error opening sketch: %v", err), feedback.ErrGeneric)

Diff for: internal/cli/board/attach.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func initAttachCommand() *cobra.Command {
5050

5151
func runAttachCommand(path string, port *arguments.Port, fqbn string) {
5252
sketchPath := arguments.InitSketchPath(path)
53-
sk := arguments.NewSketch(sketchPath)
53+
sk := arguments.MustNewSketch(sketchPath)
5454

5555
var currentPort *boardAttachPortResult
5656
if currentAddress, currentProtocol := sk.GetDefaultPortAddressAndProtocol(); currentAddress != "" {

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

+16-6
Original file line numberDiff line numberDiff line change
@@ -180,14 +180,29 @@ func runCompileCommand(cmd *cobra.Command, args []string) {
180180
feedback.Fatal(tr("You cannot use the %s flag while compiling with a profile.", "--library"), feedback.ErrBadArgument)
181181
}
182182
}
183+
showPropertiesM, err := parseShowPropertiesMode(showProperties)
184+
if err != nil {
185+
feedback.Fatal(tr("Error parsing --show-properties flag: %v", err), feedback.ErrGeneric)
186+
}
183187

184188
path := ""
185189
if len(args) > 0 {
186190
path = args[0]
187191
}
188192

189193
sketchPath := arguments.InitSketchPath(path)
190-
sk := arguments.NewSketch(sketchPath)
194+
sk, err := arguments.NewSketch(sketchPath)
195+
196+
if err != nil {
197+
showPropertiesWithEmptySketchPath := path == "" && showPropertiesM != showPropertiesModeDisabled
198+
if showPropertiesWithEmptySketchPath {
199+
// properties were requested and no sketch path was provided
200+
// let's use an empty sketch struct and hope for the best
201+
sk = nil
202+
} else {
203+
feedback.Fatal(tr("Error opening sketch: %v", err), feedback.ErrGeneric)
204+
}
205+
}
191206

192207
inst, profile := instance.CreateAndInitWithProfile(profileArg.Get(), sketchPath)
193208
if fqbnArg.String() == "" {
@@ -215,11 +230,6 @@ func runCompileCommand(cmd *cobra.Command, args []string) {
215230
overrides = o.Overrides
216231
}
217232

218-
showPropertiesM, err := parseShowPropertiesMode(showProperties)
219-
if err != nil {
220-
feedback.Fatal(tr("Error parsing --show-properties flag: %v", err), feedback.ErrGeneric)
221-
}
222-
223233
var stdOut, stdErr io.Writer
224234
var stdIORes func() *feedback.OutputStreamsResult
225235
if showPropertiesM != showPropertiesModeDisabled {

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func runDebugCommand(command *cobra.Command, args []string) {
7575
}
7676

7777
sketchPath := arguments.InitSketchPath(path)
78-
sk := arguments.NewSketch(sketchPath)
78+
sk := arguments.MustNewSketch(sketchPath)
7979
fqbn, port := arguments.CalculateFQBNAndPort(&portArgs, &fqbnArg, instance, sk)
8080
debugConfigRequested := &dbg.DebugConfigRequest{
8181
Instance: instance,

Diff for: legacy/builder/fail_if_buildpath_equals_sketchpath.go

+3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ import (
2323
type FailIfBuildPathEqualsSketchPath struct{}
2424

2525
func (s *FailIfBuildPathEqualsSketchPath) Run(ctx *types.Context) error {
26+
if ctx.BuildPath == nil || ctx.Sketch == nil {
27+
return nil
28+
}
2629
buildPath := ctx.BuildPath.Canonical()
2730
sketchPath := ctx.Sketch.FullPath.Canonical()
2831
if buildPath.EqualsTo(sketchPath) {

0 commit comments

Comments
 (0)