Skip to content

Commit fbeb271

Browse files
authored
fix: redirect postinstall script output to runtime output (arduino#2090)
1 parent eece582 commit fbeb271

File tree

2 files changed

+66
-9
lines changed

2 files changed

+66
-9
lines changed

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

+28-9
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package packagemanager
1717

1818
import (
19+
"bytes"
1920
"encoding/json"
2021
"fmt"
2122
"runtime"
@@ -174,9 +175,13 @@ func (pme *Explorer) DownloadAndInstallPlatformAndTools(
174175
if !platformRelease.IsInstalled() {
175176
return errors.New(tr("platform not installed"))
176177
}
177-
if err := pme.RunPostInstallScript(platformRelease.InstallDir); err != nil {
178-
taskCB(&rpc.TaskProgress{Message: tr("WARNING cannot configure platform: %s", err)})
178+
stdout, stderr, err := pme.RunPostInstallScript(platformRelease.InstallDir)
179+
skipEmptyMessageTaskProgressCB(taskCB)(&rpc.TaskProgress{Message: string(stdout), Completed: true})
180+
skipEmptyMessageTaskProgressCB(taskCB)(&rpc.TaskProgress{Message: string(stderr), Completed: true})
181+
if err != nil {
182+
taskCB(&rpc.TaskProgress{Message: tr("WARNING cannot configure platform: %s", err), Completed: true})
179183
}
184+
180185
} else {
181186
log.Info("Skipping platform configuration.")
182187
taskCB(&rpc.TaskProgress{Message: tr("Skipping platform configuration.")})
@@ -226,7 +231,7 @@ func (pme *Explorer) cacheInstalledJSON(platformRelease *cores.PlatformRelease)
226231

227232
// RunPostInstallScript runs the post_install.sh (or post_install.bat) script for the
228233
// specified platformRelease or toolRelease.
229-
func (pme *Explorer) RunPostInstallScript(installDir *paths.Path) error {
234+
func (pme *Explorer) RunPostInstallScript(installDir *paths.Path) ([]byte, []byte, error) {
230235
postInstallFilename := "post_install.sh"
231236
if runtime.GOOS == "windows" {
232237
postInstallFilename = "post_install.bat"
@@ -235,14 +240,16 @@ func (pme *Explorer) RunPostInstallScript(installDir *paths.Path) error {
235240
if postInstall.Exist() && postInstall.IsNotDir() {
236241
cmd, err := executils.NewProcessFromPath(pme.GetEnvVarsForSpawnedProcess(), postInstall)
237242
if err != nil {
238-
return err
243+
return []byte{}, []byte{}, err
239244
}
245+
cmdStdout, cmdStderr := bytes.NewBuffer([]byte{}), bytes.NewBuffer([]byte{})
246+
cmd.RedirectStdoutTo(cmdStdout)
247+
cmd.RedirectStderrTo(cmdStderr)
240248
cmd.SetDirFromPath(installDir)
241-
if err := cmd.Run(); err != nil {
242-
return err
243-
}
249+
err = cmd.Run()
250+
return cmdStdout.Bytes(), cmdStderr.Bytes(), err
244251
}
245-
return nil
252+
return []byte{}, []byte{}, nil
246253
}
247254

248255
// IsManagedPlatformRelease returns true if the PlatforRelease is managed by the PackageManager
@@ -335,7 +342,10 @@ func (pme *Explorer) InstallTool(toolRelease *cores.ToolRelease, taskCB rpc.Task
335342
if !skipPostInstall {
336343
log.Info("Running tool post_install script")
337344
taskCB(&rpc.TaskProgress{Message: tr("Configuring tool.")})
338-
if err := pme.RunPostInstallScript(toolRelease.InstallDir); err != nil {
345+
stdout, stderr, err := pme.RunPostInstallScript(toolRelease.InstallDir)
346+
skipEmptyMessageTaskProgressCB(taskCB)(&rpc.TaskProgress{Message: string(stdout)})
347+
skipEmptyMessageTaskProgressCB(taskCB)(&rpc.TaskProgress{Message: string(stderr)})
348+
if err != nil {
339349
taskCB(&rpc.TaskProgress{Message: tr("WARNING cannot configure tool: %s", err)})
340350
}
341351
} else {
@@ -412,3 +422,12 @@ func (pme *Explorer) IsToolRequired(toolRelease *cores.ToolRelease) bool {
412422
}
413423
return false
414424
}
425+
426+
func skipEmptyMessageTaskProgressCB(taskCB rpc.TaskProgressCB) rpc.TaskProgressCB {
427+
return func(msg *rpc.TaskProgress) {
428+
if msg != nil && len(msg.Message) == 0 {
429+
return
430+
}
431+
taskCB(msg)
432+
}
433+
}

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

+38
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import (
1919
"fmt"
2020
"net/url"
2121
"os"
22+
"runtime"
23+
"strings"
2224
"testing"
2325

2426
"github.com/arduino/arduino-cli/arduino/cores"
@@ -639,3 +641,39 @@ func TestLegacyPackageConversionToPluggableDiscovery(t *testing.T) {
639641
require.Equal(t, `"{network_cmd}" -address {upload.port.address} -port {upload.port.properties.port} -sketch "{build.path}/{build.project_name}.hex" -upload {upload.port.properties.endpoint_upload} -sync {upload.port.properties.endpoint_sync} -reset {upload.port.properties.endpoint_reset} -sync_exp {upload.port.properties.sync_return}`, platformProps.Get("tools.avrdude__pluggable_network.upload.pattern"))
640642
}
641643
}
644+
645+
func TestRunPostInstall(t *testing.T) {
646+
pmb := packagemanager.NewBuilder(nil, nil, nil, nil, "test")
647+
pm := pmb.Build()
648+
pme, release := pm.NewExplorer()
649+
defer release()
650+
651+
// prepare dummy post install script
652+
dir := paths.New(t.TempDir())
653+
654+
var scriptPath *paths.Path
655+
var err error
656+
if runtime.GOOS == "windows" {
657+
scriptPath = dir.Join("post_install.bat")
658+
659+
err = scriptPath.WriteFile([]byte(
660+
`@echo off
661+
echo sent in stdout
662+
echo sent in stderr 1>&2`))
663+
} else {
664+
scriptPath = dir.Join("post_install.sh")
665+
err = scriptPath.WriteFile([]byte(
666+
`#!/bin/sh
667+
echo "sent in stdout"
668+
echo "sent in stderr" 1>&2`))
669+
}
670+
require.NoError(t, err)
671+
err = os.Chmod(scriptPath.String(), 0777)
672+
require.NoError(t, err)
673+
stdout, stderr, err := pme.RunPostInstallScript(dir)
674+
require.NoError(t, err)
675+
676+
// `HasPrefix` because windows seem to add a trailing space at the end
677+
require.Equal(t, "sent in stdout", strings.Trim(string(stdout), "\n\r "))
678+
require.Equal(t, "sent in stderr", strings.Trim(string(stderr), "\n\r "))
679+
}

0 commit comments

Comments
 (0)