Skip to content

[breaking] gRPC Compile and BoardDetails now returns expanded build properties by default #2184

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions arduino/utils/url.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ package utils
import (
"net/url"
"runtime"

"github.com/arduino/go-properties-orderedmap"
)

// URLParse parses a raw URL string and handles local files URLs depending on the platform
Expand All @@ -33,3 +35,17 @@ func URLParse(rawURL string) (*url.URL, error) {
}
return URL, nil
}

// ExpandBuildProperties expands the build properties placeholders in the slice of properties.
func ExpandBuildProperties(props []string) ([]string, error) {
expanded, err := properties.LoadFromSlice(props)
if err != nil {
return nil, err
}
expandedProps := []string{}
for _, k := range expanded.Keys() {
v := expanded.Get(k)
expandedProps = append(expandedProps, k+"="+expanded.ExpandPropsInString(v))
}
return expandedProps, nil
}
4 changes: 4 additions & 0 deletions commands/board/details.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (

"github.com/arduino/arduino-cli/arduino"
"github.com/arduino/arduino-cli/arduino/cores"
"github.com/arduino/arduino-cli/arduino/utils"
"github.com/arduino/arduino-cli/commands"
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
)
Expand Down Expand Up @@ -59,6 +60,9 @@ func Details(ctx context.Context, req *rpc.BoardDetailsRequest) (*rpc.BoardDetai
v := boardProperties.Get(k)
details.BuildProperties = append(details.BuildProperties, k+"="+v)
}
if !req.GetDoNotExpandBuildProperties() {
details.BuildProperties, _ = utils.ExpandBuildProperties(details.BuildProperties)
}

details.DebuggingSupported = boardProperties.ContainsKey("debug.executable") ||
boardPlatform.Properties.ContainsKey("debug.executable") ||
Expand Down
4 changes: 4 additions & 0 deletions commands/compile/compile.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (
bldr "github.com/arduino/arduino-cli/arduino/builder"
"github.com/arduino/arduino-cli/arduino/cores"
"github.com/arduino/arduino-cli/arduino/sketch"
"github.com/arduino/arduino-cli/arduino/utils"
"github.com/arduino/arduino-cli/buildcache"
"github.com/arduino/arduino-cli/commands"
"github.com/arduino/arduino-cli/configuration"
Expand Down Expand Up @@ -233,6 +234,9 @@ func Compile(ctx context.Context, req *rpc.CompileRequest, outStream, errStream
for _, key := range keys {
r.BuildProperties = append(r.BuildProperties, key+"="+buildProperties.Get(key))
}
if !req.GetDoNotExpandBuildProperties() {
r.BuildProperties, _ = utils.ExpandBuildProperties(r.BuildProperties)
}
}()

if req.GetShowProperties() {
Expand Down
30 changes: 30 additions & 0 deletions docs/UPGRADING.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,36 @@

Here you can find a list of migration guides to handle breaking changes between releases of the CLI.

## 0.33.0

### gRPC `cc.arduino.cli.commands.v1.Compile` command now return expanded build_properties by default.

The gRPC `cc.arduino.cli.commands.v1.Compile` command now return expanded `build_properties` by default. If you want the
**un**expanded `build_properties` you must set to `true` the field `do_not_expand_build_properties` in the
`CompileRequest`.

### `compile --show-properties` now return the expanded build properties.

The command `compile --show-properties` now returns the **expanded** build properties, with the variable placeholders
replaced with their current value. If you need the **un**expanded build properties you must change the command line to
`compile --show-properties=unexpanded`.

Before:

```
$ arduino-cli board details -b arduino:avr:uno --show-properties | grep ^tools.avrdude.path
tools.avrdude.path={runtime.tools.avrdude.path}
```

Now:

```
$ arduino-cli board details -b arduino:avr:uno --show-properties | grep ^tools.avrdude.path
tools.avrdude.path=/home/megabug/.arduino15/packages/arduino/tools/avrdude/6.3.0-arduino17
$ arduino-cli board details -b arduino:avr:uno --show-properties=unexpanded | grep ^tools.avrdude.path
tools.avrdude.path={runtime.tools.avrdude.path}
```

## 0.32.2

### golang API: method `github.com/arduino/arduino-cli/arduino/cores/Board.GetBuildProperties` changed signature
Expand Down
4 changes: 2 additions & 2 deletions internal/cli/arguments/show_properties.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ func (p *ShowProperties) Get() (ShowPropertiesMode, error) {
func (p *ShowProperties) AddToCommand(command *cobra.Command) {
command.Flags().StringVar(&p.arg,
"show-properties", "disabled",
tr(`Show build properties. The properties are returned exactly as they are defined. Use "--show-properties=expanded" to replace placeholders with context values.`),
tr(`Show build properties. The properties are expanded, use "--show-properties=unexpanded" if you want them exactly as they are defined.`),
)
command.Flags().Lookup("show-properties").NoOptDefVal = "unexpanded" // default if the flag is present with no value
command.Flags().Lookup("show-properties").NoOptDefVal = "expanded" // default if the flag is present with no value
}
10 changes: 3 additions & 7 deletions internal/cli/board/details.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import (

"github.com/arduino/arduino-cli/commands/board"
"github.com/arduino/arduino-cli/internal/cli/arguments"
"github.com/arduino/arduino-cli/internal/cli/compile"
"github.com/arduino/arduino-cli/internal/cli/feedback"
"github.com/arduino/arduino-cli/internal/cli/instance"
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
Expand Down Expand Up @@ -66,17 +65,14 @@ func runDetailsCommand(fqbn string, showFullDetails, listProgrammers bool, showP
feedback.Fatal(err.Error(), feedback.ErrBadArgument)
}
res, err := board.Details(context.Background(), &rpc.BoardDetailsRequest{
Instance: inst,
Fqbn: fqbn,
Instance: inst,
Fqbn: fqbn,
DoNotExpandBuildProperties: showPropertiesMode == arguments.ShowPropertiesUnexpanded,
})
if err != nil {
feedback.Fatal(tr("Error getting board details: %v", err), feedback.ErrGeneric)
}

if showPropertiesMode == arguments.ShowPropertiesExpanded {
res.BuildProperties, _ = compile.ExpandBuildProperties(res.GetBuildProperties())
}

feedback.PrintResult(detailsResult{
details: res,
listProgrammers: listProgrammers,
Expand Down
20 changes: 1 addition & 19 deletions internal/cli/compile/compile.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ import (
"github.com/arduino/arduino-cli/table"
"github.com/arduino/arduino-cli/version"
"github.com/arduino/go-paths-helper"
"github.com/arduino/go-properties-orderedmap"
"github.com/fatih/color"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
Expand Down Expand Up @@ -231,6 +230,7 @@ func runCompileCommand(cmd *cobra.Command, args []string) {
SignKey: signKey,
EncryptKey: encryptKey,
SkipLibrariesDiscovery: skipLibrariesDiscovery,
DoNotExpandBuildProperties: showProperties == arguments.ShowPropertiesUnexpanded,
}
compileRes, compileError := compile.Compile(context.Background(), compileRequest, stdOut, stdErr, nil)
if compileError == nil && uploadAfterCompile {
Expand Down Expand Up @@ -365,27 +365,9 @@ func runCompileCommand(cmd *cobra.Command, args []string) {
}
feedback.FatalResult(res, feedback.ErrGeneric)
}
if showProperties == arguments.ShowPropertiesExpanded {
res.BuilderResult.BuildProperties, _ = ExpandBuildProperties(res.BuilderResult.GetBuildProperties())
// ignore error, it should never fail
}
feedback.PrintResult(res)
}

// ExpandBuildProperties expands the build properties placeholders in the slice of properties.
func ExpandBuildProperties(props []string) ([]string, error) {
expanded, err := properties.LoadFromSlice(props)
if err != nil {
return nil, err
}
expandedProps := []string{}
for _, k := range expanded.Keys() {
v := expanded.Get(k)
expandedProps = append(expandedProps, k+"="+expanded.ExpandPropsInString(v))
}
return expandedProps, nil
}

type compileResult struct {
CompilerOut string `json:"compiler_out"`
CompilerErr string `json:"compiler_err"`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,25 +41,25 @@ func TestCompileShowProperties(t *testing.T) {
bareMinimum := cli.CopySketch("bare_minimum")

// Test --show-properties output is clean
// properties are not expanded
// properties are expanded
stdout, stderr, err := cli.Run("compile", "--fqbn", "arduino:avr:uno", "-v", "--show-properties", bareMinimum.String())
require.NoError(t, err)
props, err := properties.LoadFromBytes(stdout)
require.NoError(t, err, "Output must be a clean property list")
require.Empty(t, stderr)
require.True(t, props.ContainsKey("archive_file_path"))
require.Contains(t, props.Get("archive_file_path"), "{build.path}")
require.NotContains(t, props.Get("archive_file_path"), "{build.path}")

// Test --show-properties --format JSON output is clean
// properties are not expanded
// properties are expanded
stdout, stderr, err = cli.Run("compile", "--fqbn", "arduino:avr:uno", "-v", "--show-properties", "--format", "json", bareMinimum.String())
require.NoError(t, err)
require.Empty(t, stderr)
props, err = properties.LoadFromSlice(
requireCompileResponseJson(t, stdout).BuilderResult.GetBuildProperties())
require.NoError(t, err)
require.True(t, props.ContainsKey("archive_file_path"))
require.Contains(t, props.Get("archive_file_path"), "{build.path}")
require.NotContains(t, props.Get("archive_file_path"), "{build.path}")

// Test --show-properties output is clean, with a wrong FQBN
stdout, stderr, err = cli.Run("compile", "--fqbn", "arduino:avr:unoa", "-v", "--show-properties", bareMinimum.String())
Expand Down
Loading