Unverified Commit e7ba99f4 authored by Luca Bianconi's avatar Luca Bianconi Committed by GitHub

[breaking] fix: remove tree config lookup (#2085)

parent 5e251e87
......@@ -136,9 +136,9 @@ func GetDefaultBuiltinLibrariesDir() string {
return filepath.Join(getDefaultArduinoDataDir(), "libraries")
}
// FindConfigFileInArgsOrWorkingDirectory returns the config file path using the
// FindConfigFileInArgs returns the config file path using the
// argument '--config-file' (if specified) or looking in the current working dir
func FindConfigFileInArgsOrWorkingDirectory(args []string) string {
func FindConfigFileInArgs(args []string) string {
// Look for '--config-file' argument
for i, arg := range args {
if arg == "--config-file" {
......@@ -147,23 +147,5 @@ func FindConfigFileInArgsOrWorkingDirectory(args []string) string {
}
}
}
// Look into current working directory
if cwd, err := paths.Getwd(); err != nil {
return ""
} else if configFile := searchConfigTree(cwd); configFile != nil {
return configFile.Join("arduino-cli.yaml").String()
}
return ""
}
func searchConfigTree(cwd *paths.Path) *paths.Path {
// go back up to root and search for the config file
for _, path := range cwd.Parents() {
if path.Join("arduino-cli.yaml").Exist() {
return path
}
}
return nil
}
......@@ -21,7 +21,6 @@ import (
"path/filepath"
"testing"
paths "github.com/arduino/go-paths-helper"
"github.com/stretchr/testify/require"
)
......@@ -39,45 +38,6 @@ func tmpDirOrDie() string {
return dir
}
func TestSearchConfigTreeNotFound(t *testing.T) {
tmp := tmpDirOrDie()
require.Empty(t, searchConfigTree(paths.New(tmp)))
}
func TestSearchConfigTreeSameFolder(t *testing.T) {
tmp := tmpDirOrDie()
defer os.RemoveAll(tmp)
_, err := os.Create(filepath.Join(tmp, "arduino-cli.yaml"))
require.Nil(t, err)
require.Equal(t, tmp, searchConfigTree(paths.New(tmp)).String())
}
func TestSearchConfigTreeInParent(t *testing.T) {
tmp := tmpDirOrDie()
defer os.RemoveAll(tmp)
target := filepath.Join(tmp, "foo", "bar")
err := os.MkdirAll(target, os.ModePerm)
require.Nil(t, err)
_, err = os.Create(filepath.Join(tmp, "arduino-cli.yaml"))
require.Nil(t, err)
require.Equal(t, tmp, searchConfigTree(paths.New(target)).String())
}
var result *paths.Path
func BenchmarkSearchConfigTree(b *testing.B) {
tmp := tmpDirOrDie()
defer os.RemoveAll(tmp)
target := filepath.Join(tmp, "foo", "bar", "baz")
os.MkdirAll(target, os.ModePerm)
var s *paths.Path
for n := 0; n < b.N; n++ {
s = searchConfigTree(paths.New(target))
}
result = s
}
func TestInit(t *testing.T) {
tmp := tmpDirOrDie()
defer os.RemoveAll(tmp)
......@@ -100,38 +60,15 @@ func TestInit(t *testing.T) {
}
func TestFindConfigFile(t *testing.T) {
configFile := FindConfigFileInArgsOrWorkingDirectory([]string{"--config-file"})
configFile := FindConfigFileInArgs([]string{"--config-file"})
require.Equal(t, "", configFile)
configFile = FindConfigFileInArgsOrWorkingDirectory([]string{"--config-file", "some/path/to/config"})
configFile = FindConfigFileInArgs([]string{"--config-file", "some/path/to/config"})
require.Equal(t, "some/path/to/config", configFile)
configFile = FindConfigFileInArgsOrWorkingDirectory([]string{"--config-file", "some/path/to/config/arduino-cli.yaml"})
configFile = FindConfigFileInArgs([]string{"--config-file", "some/path/to/config/arduino-cli.yaml"})
require.Equal(t, "some/path/to/config/arduino-cli.yaml", configFile)
configFile = FindConfigFileInArgsOrWorkingDirectory([]string{})
configFile = FindConfigFileInArgs([]string{})
require.Equal(t, "", configFile)
// Create temporary directories
tmp := tmpDirOrDie()
defer os.RemoveAll(tmp)
target := filepath.Join(tmp, "foo", "bar", "baz")
os.MkdirAll(target, os.ModePerm)
require.Nil(t, os.Chdir(target))
// Create a config file
f, err := os.Create(filepath.Join(target, "..", "..", "arduino-cli.yaml"))
require.Nil(t, err)
f.Close()
configFile = FindConfigFileInArgsOrWorkingDirectory([]string{})
require.Equal(t, filepath.Join(tmp, "foo", "arduino-cli.yaml"), configFile)
// Create another config file
f, err = os.Create(filepath.Join(target, "arduino-cli.yaml"))
require.Nil(t, err)
f.Close()
configFile = FindConfigFileInArgsOrWorkingDirectory([]string{})
require.Equal(t, filepath.Join(target, "arduino-cli.yaml"), configFile)
}
......@@ -2,6 +2,11 @@
Here you can find a list of migration guides to handle breaking changes between releases of the CLI.
## 0.32.0
Configuration file lookup in current working directory and its parents is dropped. The command line flag `--config-file`
must be specified to use an alternative configuration file from the one in the data directory.
## 0.31.0
### Added `post_install` script support for tools
......
......@@ -116,8 +116,6 @@ The configuration file must be named `arduino-cli`, with the appropriate file ex
Configuration files in the following locations are recognized by Arduino CLI:
1. Location specified by the [`--config-file`][arduino cli command reference] command line flag
1. Current working directory
1. Any parent directory of the current working directory (more immediate parents having higher precedence)
1. Arduino CLI data directory (as configured by `directories.data`)
If multiple configuration files are present, the one highest on the above list is used. Configuration files are not
......
......@@ -31,7 +31,7 @@ func main() {
os.MkdirAll(os.Args[1], 0755) // Create the output folder if it doesn't already exist
configuration.Settings = configuration.Init(configuration.FindConfigFileInArgsOrWorkingDirectory(os.Args))
configuration.Settings = configuration.Init(configuration.FindConfigFileInArgs(os.Args))
cli := cli.NewCommand()
cli.DisableAutoGenTag = true // Disable addition of auto-generated date stamp
err := doc.GenMarkdownTree(cli, os.Args[1])
......
......@@ -526,7 +526,7 @@ func compileWithExportBinariesConfig(t *testing.T, env *integrationtest.Environm
defer cli.WorkingDir().Join("arduino-cli.yaml").Remove()
// Test if arduino-cli config file written in the previous run has the `always_export_binaries` flag set.
stdout, _, err := cli.Run("config", "dump", "--format", "json")
stdout, _, err := cli.Run("config", "dump", "--format", "json", "--config-file", "arduino-cli.yaml")
require.NoError(t, err)
requirejson.Contains(t, stdout, `
{
......@@ -536,7 +536,7 @@ func compileWithExportBinariesConfig(t *testing.T, env *integrationtest.Environm
}`)
// Test compilation with export binaries env var set
_, _, err = cli.Run("compile", "-b", fqbn, sketchPath.String())
_, _, err = cli.Run("compile", "-b", fqbn, "--config-file", "arduino-cli.yaml", sketchPath.String())
require.NoError(t, err)
require.DirExists(t, sketchPath.Join("build").String())
......@@ -563,7 +563,7 @@ func compileWithInvalidUrl(t *testing.T, env *integrationtest.Environment, cli *
require.NoError(t, err)
defer cli.WorkingDir().Join("arduino-cli.yaml").Remove()
_, stderr, err := cli.Run("compile", "-b", fqbn, sketchPath.String())
_, stderr, err := cli.Run("compile", "-b", fqbn, "--config-file", "arduino-cli.yaml", sketchPath.String())
require.NoError(t, err)
require.Contains(t, string(stderr), "Error initializing instance: Loading index file: loading json index file")
expectedIndexfile := cli.DataDir().Join("package_example_index.json")
......@@ -813,10 +813,10 @@ func TestCompileWithCustomLibraries(t *testing.T) {
require.NoError(t, err)
// Init the environment explicitly
_, _, err = cli.Run("update")
_, _, err = cli.Run("update", "--config-file", "arduino-cli.yaml")
require.NoError(t, err)
_, _, err = cli.Run("core", "install", "esp8266:esp8266")
_, _, err = cli.Run("core", "install", "esp8266:esp8266", "--config-file", "arduino-cli.yaml")
require.NoError(t, err)
sketchName := "sketch_with_multiple_custom_libraries"
......@@ -825,7 +825,12 @@ func TestCompileWithCustomLibraries(t *testing.T) {
firstLib := sketchPath.Join("libraries1")
secondLib := sketchPath.Join("libraries2")
_, _, err = cli.Run("compile", "--libraries", firstLib.String(), "--libraries", secondLib.String(), "-b", fqbn, sketchPath.String())
_, _, err = cli.Run("compile", "--libraries",
firstLib.String(),
"--libraries", secondLib.String(),
"-b", fqbn,
"--config-file", "arduino-cli.yaml",
sketchPath.String())
require.NoError(t, err)
}
......@@ -839,18 +844,18 @@ func TestCompileWithArchivesAndLongPaths(t *testing.T) {
require.NoError(t, err)
// Init the environment explicitly
_, _, err = cli.Run("update")
_, _, err = cli.Run("update", "--config-file", "arduino-cli.yaml")
require.NoError(t, err)
// Install core to compile
_, _, err = cli.Run("core", "install", "esp8266:esp8266@2.7.4")
_, _, err = cli.Run("core", "install", "esp8266:esp8266@2.7.4", "--config-file", "arduino-cli.yaml")
require.NoError(t, err)
// Install test library
_, _, err = cli.Run("lib", "install", "ArduinoIoTCloud")
_, _, err = cli.Run("lib", "install", "ArduinoIoTCloud", "--config-file", "arduino-cli.yaml")
require.NoError(t, err)
stdout, _, err := cli.Run("lib", "examples", "ArduinoIoTCloud", "--format", "json")
stdout, _, err := cli.Run("lib", "examples", "ArduinoIoTCloud", "--format", "json", "--config-file", "arduino-cli.yaml")
require.NoError(t, err)
var libOutput []map[string]interface{}
err = json.Unmarshal(stdout, &libOutput)
......@@ -858,7 +863,7 @@ func TestCompileWithArchivesAndLongPaths(t *testing.T) {
sketchPath := paths.New(libOutput[0]["library"].(map[string]interface{})["install_dir"].(string))
sketchPath = sketchPath.Join("examples", "ArduinoIoTCloud-Advanced")
_, _, err = cli.Run("compile", "-b", "esp8266:esp8266:huzzah", sketchPath.String())
_, _, err = cli.Run("compile", "-b", "esp8266:esp8266:huzzah", sketchPath.String(), "--config-file", "arduino-cli.yaml")
require.NoError(t, err)
}
......@@ -908,16 +913,19 @@ func TestCompileWithFullyPrecompiledLibrary(t *testing.T) {
// https://arduino.github.io/arduino-cli/latest/library-specification/#precompiled-binaries
wd, err := paths.Getwd()
require.NoError(t, err)
_, _, err = cli.Run("lib", "install", "--zip-path", wd.Parent().Join("testdata", "Arduino_TensorFlowLite-2.1.0-ALPHA-precompiled.zip").String())
_, _, err = cli.Run("lib", "install",
"--zip-path", wd.Parent().Join("testdata", "Arduino_TensorFlowLite-2.1.0-ALPHA-precompiled.zip").String(),
"--config-file", "arduino-cli.yaml",
)
require.NoError(t, err)
sketchFolder := cli.SketchbookDir().Join("libraries", "Arduino_TensorFlowLite", "examples", "hello_world")
// Install example dependency
_, _, err = cli.Run("lib", "install", "Arduino_LSM9DS1")
_, _, err = cli.Run("lib", "install", "Arduino_LSM9DS1", "--config-file", "arduino-cli.yaml")
require.NoError(t, err)
// Compile and verify dependencies detection for fully precompiled library is skipped
stdout, _, err := cli.Run("compile", "-b", fqbn, sketchFolder.String(), "-v")
stdout, _, err := cli.Run("compile", "-b", fqbn, "--config-file", "arduino-cli.yaml", sketchFolder.String(), "-v")
require.NoError(t, err)
require.Contains(t, string(stdout), "Skipping dependencies detection for precompiled library Arduino_TensorFlowLite")
}
......
......@@ -963,12 +963,12 @@ func TestCoreIndexWithoutChecksum(t *testing.T) {
_, _, err := cli.Run("config", "init", "--dest-dir", ".")
require.NoError(t, err)
url := "https://raw.githubusercontent.com/keyboardio/ArduinoCore-GD32-Keyboardio/ae5938af2f485910729e7d27aa233032a1cb4734/package_gd32_index.json" // noqa: E501
_, _, err = cli.Run("config", "add", "board_manager.additional_urls", url)
_, _, err = cli.Run("config", "add", "board_manager.additional_urls", url, "--config-file", "arduino-cli.yaml")
require.NoError(t, err)
_, _, err = cli.Run("core", "update-index")
_, _, err = cli.Run("core", "update-index", "--config-file", "arduino-cli.yaml")
require.NoError(t, err)
_, _, err = cli.Run("core", "list", "--all")
_, _, err = cli.Run("core", "list", "--all", "--config-file", "arduino-cli.yaml")
require.NoError(t, err) // this should not make the cli crash
}
......
......@@ -620,7 +620,7 @@ func TestInstallWithGitUrl(t *testing.T) {
gitUrl := "https://github.com/arduino-libraries/WiFi101.git"
// Test git-url library install
stdout, _, err := cli.Run("lib", "install", "--git-url", gitUrl)
stdout, _, err := cli.Run("lib", "install", "--git-url", gitUrl, "--config-file", "arduino-cli.yaml")
require.NoError(t, err)
require.Contains(t, string(stdout), "--git-url and --zip-path flags allow installing untrusted files, use it at your own risk.")
......@@ -628,7 +628,7 @@ func TestInstallWithGitUrl(t *testing.T) {
require.DirExists(t, libInstallDir.String())
// Reinstall library
_, _, err = cli.Run("lib", "install", "--git-url", gitUrl)
_, _, err = cli.Run("lib", "install", "--git-url", gitUrl, "--config-file", "arduino-cli.yaml")
require.NoError(t, err)
// Verifies library remains installed
......@@ -652,16 +652,16 @@ func TestInstallWithGitUrlFragmentAsBranch(t *testing.T) {
gitUrl := "https://github.com/arduino-libraries/WiFi101.git"
// Test that a bad ref fails
_, _, err = cli.Run("lib", "install", "--git-url", gitUrl+"#x-ref-does-not-exist")
_, _, err = cli.Run("lib", "install", "--git-url", gitUrl+"#x-ref-does-not-exist", "--config-file", "arduino-cli.yaml")
require.Error(t, err)
// Verifies library is installed in expected path
_, _, err = cli.Run("lib", "install", "--git-url", gitUrl+"#0.16.0")
_, _, err = cli.Run("lib", "install", "--git-url", gitUrl+"#0.16.0", "--config-file", "arduino-cli.yaml")
require.NoError(t, err)
require.DirExists(t, libInstallDir.String())
// Reinstall library at an existing ref
_, _, err = cli.Run("lib", "install", "--git-url", gitUrl+"#master")
_, _, err = cli.Run("lib", "install", "--git-url", gitUrl+"#master", "--config-file", "arduino-cli.yaml")
require.NoError(t, err)
// Verifies library remains installed
......@@ -1129,7 +1129,7 @@ func TestInstallZipLibWithMacosMetadata(t *testing.T) {
zipPath, err := paths.New("..", "testdata", "fake-lib.zip").Abs()
require.NoError(t, err)
// Test zip-path install
stdout, _, err := cli.Run("lib", "install", "--zip-path", zipPath.String())
stdout, _, err := cli.Run("lib", "install", "--zip-path", zipPath.String(), "--config-file", "arduino-cli.yaml")
require.NoError(t, err)
require.Contains(t, string(stdout), "--git-url and --zip-path flags allow installing untrusted files, use it at your own risk.")
......@@ -1139,7 +1139,9 @@ func TestInstallZipLibWithMacosMetadata(t *testing.T) {
require.FileExists(t, libInstallDir.Join("src", "fake-lib.h").String())
// Reinstall library
_, _, err = cli.Run("lib", "install", "--zip-path", zipPath.String())
_, _, err = cli.Run("lib", "install",
"--zip-path", zipPath.String(),
"--config-file", "arduino-cli.yaml")
require.NoError(t, err)
// Verifies library remains installed
......@@ -1165,7 +1167,7 @@ func TestInstallZipInvalidLibrary(t *testing.T) {
zipPath, err := paths.New("..", "testdata", "lib-without-header.zip").Abs()
require.NoError(t, err)
// Test zip-path install
_, stderr, err := cli.Run("lib", "install", "--zip-path", zipPath.String())
_, stderr, err := cli.Run("lib", "install", "--zip-path", zipPath.String(), "--config-file", "arduino-cli.yaml")
require.Error(t, err)
require.Contains(t, string(stderr), "library not valid")
......@@ -1176,7 +1178,7 @@ func TestInstallZipInvalidLibrary(t *testing.T) {
zipPath, err = paths.New("..", "testdata", "lib-without-properties.zip").Abs()
require.NoError(t, err)
// Test zip-path install
_, stderr, err = cli.Run("lib", "install", "--zip-path", zipPath.String())
_, stderr, err = cli.Run("lib", "install", "--zip-path", zipPath.String(), "--config-file", "arduino-cli.yaml")
require.Error(t, err)
require.Contains(t, string(stderr), "library not valid")
}
......@@ -1211,7 +1213,7 @@ func TestInstallGitInvalidLibrary(t *testing.T) {
// Verifies library is not already installed
require.NoDirExists(t, libInstallDir.String())
_, stderr, err := cli.RunWithCustomEnv(envVar, "lib", "install", "--git-url", repoDir.String())
_, stderr, err := cli.RunWithCustomEnv(envVar, "lib", "install", "--git-url", repoDir.String(), "--config-file", "arduino-cli.yaml")
require.Error(t, err)
require.Contains(t, string(stderr), "library not valid")
require.NoDirExists(t, libInstallDir.String())
......@@ -1237,7 +1239,7 @@ func TestInstallGitInvalidLibrary(t *testing.T) {
// Verifies library is not already installed
require.NoDirExists(t, libInstallDir.String())
_, stderr, err = cli.RunWithCustomEnv(envVar, "lib", "install", "--git-url", repoDir.String())
_, stderr, err = cli.RunWithCustomEnv(envVar, "lib", "install", "--git-url", repoDir.String(), "--config-file", "arduino-cli.yaml")
require.Error(t, err)
require.Contains(t, string(stderr), "library not valid")
require.NoDirExists(t, libInstallDir.String())
......@@ -1358,11 +1360,11 @@ func TestInstallGitUrlAndZipPathFlagsVisibility(t *testing.T) {
_, _, err = cli.RunWithCustomEnv(envVar, "config", "init", "--dest-dir", ".")
require.NoError(t, err)
stdout, _, err = cli.Run("lib", "install", "--git-url", gitUrl)
stdout, _, err = cli.Run("lib", "install", "--git-url", gitUrl, "--config-file", "arduino-cli.yaml")
require.NoError(t, err)
require.Contains(t, string(stdout), "--git-url and --zip-path flags allow installing untrusted files, use it at your own risk.")
stdout, _, err = cli.Run("lib", "install", "--zip-path", zipPath.String())
stdout, _, err = cli.Run("lib", "install", "--zip-path", zipPath.String(), "--config-file", "arduino-cli.yaml")
require.NoError(t, err)
require.Contains(t, string(stdout), "--git-url and --zip-path flags allow installing untrusted files, use it at your own risk.")
}
......@@ -1389,7 +1391,7 @@ func TestInstallWithZipPath(t *testing.T) {
require.NoDirExists(t, libInstallDir.String())
// Test zip-path install
stdout, _, err := cli.Run("lib", "install", "--zip-path", zipPath.String())
stdout, _, err := cli.Run("lib", "install", "--zip-path", zipPath.String(), "--config-file", "arduino-cli.yaml")
require.NoError(t, err)
require.Contains(t, string(stdout), "--git-url and --zip-path flags allow installing untrusted files, use it at your own risk.")
......@@ -1405,7 +1407,7 @@ func TestInstallWithZipPath(t *testing.T) {
require.Contains(t, files, libInstallDir.Join("README.adoc"))
// Reinstall library
_, _, err = cli.Run("lib", "install", "--zip-path", zipPath.String())
_, _, err = cli.Run("lib", "install", "--zip-path", zipPath.String(), "--config-file", "arduino-cli.yaml")
require.NoError(t, err)
// Verifies library remains installed
......
......@@ -25,7 +25,7 @@ import (
)
func main() {
configuration.Settings = configuration.Init(configuration.FindConfigFileInArgsOrWorkingDirectory(os.Args))
configuration.Settings = configuration.Init(configuration.FindConfigFileInArgs(os.Args))
i18n.Init(configuration.Settings.GetString("locale"))
arduinoCmd := cli.NewCommand()
if err := arduinoCmd.Execute(); err != nil {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment