Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit fbeb271

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

File tree

2 files changed

+66
-9
lines changed

2 files changed

+66
-9
lines changed

‎arduino/cores/packagemanager/install_uninstall.go‎

Lines changed: 28 additions & 9 deletions
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+
}

‎arduino/cores/packagemanager/package_manager_test.go‎

Lines changed: 38 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /