Skip to content

Commit 7115365

Browse files
[breaking] Add post install script support for tools (#2075)
* Add post install script support for tools * Add TestCoreInstallRunsToolPostInstallScript to core_test.go * Document changes in UPGRADING.md
1 parent d6196c1 commit 7115365

File tree

4 files changed

+67
-11
lines changed

4 files changed

+67
-11
lines changed

Diff for: arduino/cores/packagemanager/install_uninstall.go

+26-10
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ func (pme *Explorer) DownloadAndInstallPlatformAndTools(
102102

103103
// Install tools first
104104
for _, tool := range toolsToInstall {
105-
if err := pme.InstallTool(tool, taskCB); err != nil {
105+
if err := pme.InstallTool(tool, taskCB, skipPostInstall); err != nil {
106106
return err
107107
}
108108
}
@@ -171,7 +171,10 @@ func (pme *Explorer) DownloadAndInstallPlatformAndTools(
171171
if !skipPostInstall {
172172
log.Info("Running post_install script")
173173
taskCB(&rpc.TaskProgress{Message: tr("Configuring platform.")})
174-
if err := pme.RunPostInstallScript(platformRelease); err != nil {
174+
if !platformRelease.IsInstalled() {
175+
return errors.New(tr("platform not installed"))
176+
}
177+
if err := pme.RunPostInstallScript(platformRelease.InstallDir); err != nil {
175178
taskCB(&rpc.TaskProgress{Message: tr("WARNING cannot configure platform: %s", err)})
176179
}
177180
} else {
@@ -222,22 +225,19 @@ func (pme *Explorer) cacheInstalledJSON(platformRelease *cores.PlatformRelease)
222225
}
223226

224227
// RunPostInstallScript runs the post_install.sh (or post_install.bat) script for the
225-
// specified platformRelease.
226-
func (pme *Explorer) RunPostInstallScript(platformRelease *cores.PlatformRelease) error {
227-
if !platformRelease.IsInstalled() {
228-
return errors.New(tr("platform not installed"))
229-
}
228+
// specified platformRelease or toolRelease.
229+
func (pme *Explorer) RunPostInstallScript(installDir *paths.Path) error {
230230
postInstallFilename := "post_install.sh"
231231
if runtime.GOOS == "windows" {
232232
postInstallFilename = "post_install.bat"
233233
}
234-
postInstall := platformRelease.InstallDir.Join(postInstallFilename)
234+
postInstall := installDir.Join(postInstallFilename)
235235
if postInstall.Exist() && postInstall.IsNotDir() {
236236
cmd, err := executils.NewProcessFromPath(pme.GetEnvVarsForSpawnedProcess(), postInstall)
237237
if err != nil {
238238
return err
239239
}
240-
cmd.SetDirFromPath(platformRelease.InstallDir)
240+
cmd.SetDirFromPath(installDir)
241241
if err := cmd.Run(); err != nil {
242242
return err
243243
}
@@ -299,7 +299,7 @@ func (pme *Explorer) UninstallPlatform(platformRelease *cores.PlatformRelease, t
299299
}
300300

301301
// InstallTool installs a specific release of a tool.
302-
func (pme *Explorer) InstallTool(toolRelease *cores.ToolRelease, taskCB rpc.TaskProgressCB) error {
302+
func (pme *Explorer) InstallTool(toolRelease *cores.ToolRelease, taskCB rpc.TaskProgressCB, skipPostInstall bool) error {
303303
log := pme.log.WithField("Tool", toolRelease)
304304

305305
if toolRelease.IsInstalled() {
@@ -325,6 +325,22 @@ func (pme *Explorer) InstallTool(toolRelease *cores.ToolRelease, taskCB rpc.Task
325325
log.WithError(err).Warn("Cannot install tool")
326326
return &arduino.FailedInstallError{Message: tr("Cannot install tool %s", toolRelease), Cause: err}
327327
}
328+
if d, err := destDir.Abs(); err == nil {
329+
toolRelease.InstallDir = d
330+
} else {
331+
return err
332+
}
333+
// Perform post install
334+
if !skipPostInstall {
335+
log.Info("Running tool post_install script")
336+
taskCB(&rpc.TaskProgress{Message: tr("Configuring tool.")})
337+
if err := pme.RunPostInstallScript(toolRelease.InstallDir); err != nil {
338+
taskCB(&rpc.TaskProgress{Message: tr("WARNING cannot configure tool: %s", err)})
339+
}
340+
} else {
341+
log.Info("Skipping tool configuration.")
342+
taskCB(&rpc.TaskProgress{Message: tr("Skipping tool configuration.")})
343+
}
328344
log.Info("Tool installed")
329345
taskCB(&rpc.TaskProgress{Message: tr("%s installed", toolRelease), Completed: true})
330346

Diff for: commands/instances.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ func installTool(pm *packagemanager.PackageManager, tool *cores.ToolRelease, dow
138138
return fmt.Errorf(tr("downloading %[1]s tool: %[2]s"), tool, err)
139139
}
140140
taskCB(&rpc.TaskProgress{Completed: true})
141-
if err := pme.InstallTool(tool, taskCB); err != nil {
141+
if err := pme.InstallTool(tool, taskCB, true); err != nil {
142142
return fmt.Errorf(tr("installing %[1]s tool: %[2]s"), tool, err)
143143
}
144144
return nil

Diff for: docs/UPGRADING.md

+25
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,31 @@
22

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

5+
## 0.31.0
6+
7+
### Added `post_install` script support for tools
8+
9+
The `post_install` script now runs when a tool is correctly installed and the CLI is in "interactive" mode. This
10+
behavior can be [configured](https://arduino.github.io/arduino-cli/0.30/commands/arduino-cli_core_install/#options).
11+
12+
### golang API: methods in `github.com/arduino/arduino-cli/arduino/cores/packagemanager` changed signature
13+
14+
The following methods in `github.com/arduino/arduino-cli/arduino/cores/packagemanager`:
15+
16+
```go
17+
func (pme *Explorer) InstallTool(toolRelease *cores.ToolRelease, taskCB rpc.TaskProgressCB) error { ... }
18+
func (pme *Explorer) RunPostInstallScript(platformRelease *cores.PlatformRelease) error { ... }
19+
```
20+
21+
have changed. `InstallTool` requires the new `skipPostInstall` parameter, which must be set to `true` to skip the post
22+
install script. `RunPostInstallScript` does not require a `*cores.PlatformRelease` parameter but requires a
23+
`*paths.Path` parameter:
24+
25+
```go
26+
func (pme *Explorer) InstallTool(toolRelease *cores.ToolRelease, taskCB rpc.TaskProgressCB, skipPostInstall bool) error {...}
27+
func (pme *Explorer) RunPostInstallScript(installDir *paths.Path) error { ... }
28+
```
29+
530
## 0.30.0
631

732
### Sketch name validation

Diff for: internal/integrationtest/core/core_test.go

+15
Original file line numberDiff line numberDiff line change
@@ -992,3 +992,18 @@ func TestCoreInstallCreatesInstalledJson(t *testing.T) {
992992
sortedExpected := requirejson.Parse(t, expectedInstalledJson).Query("walk(if type == \"array\" then sort else . end)").String()
993993
require.JSONEq(t, sortedExpected, sortedInstalled)
994994
}
995+
996+
func TestCoreInstallRunsToolPostInstallScript(t *testing.T) {
997+
env, cli := integrationtest.CreateArduinoCLIWithEnvironment(t)
998+
defer env.CleanUp()
999+
1000+
url := "http://drazzy.com/package_drazzy.com_index.json"
1001+
1002+
_, _, err := cli.Run("core", "update-index", "--additional-urls", url)
1003+
require.NoError(t, err)
1004+
1005+
// Checks that the post_install script is correctly skipped on the CI
1006+
stdout, _, err := cli.Run("core", "install", "ATTinyCore:avr", "--verbose", "--additional-urls", url)
1007+
require.NoError(t, err)
1008+
require.Contains(t, string(stdout), "Skipping tool configuration.")
1009+
}

0 commit comments

Comments
 (0)