Skip to content

Commit 043e325

Browse files
Add post install script support for tools
1 parent 53a6f25 commit 043e325

File tree

2 files changed

+43
-3
lines changed

2 files changed

+43
-3
lines changed

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

+42-2
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
}
@@ -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.RunPostInstallScriptTool(toolRelease); 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

@@ -395,3 +411,27 @@ func (pme *Explorer) IsToolRequired(toolRelease *cores.ToolRelease) bool {
395411
}
396412
return false
397413
}
414+
415+
// RunPostInstallScriptTool runs the post_install.sh (or post_install.bat) script for the
416+
// specified toolRelease.
417+
func (pme *Explorer) RunPostInstallScriptTool(toolRelease *cores.ToolRelease) error {
418+
if !toolRelease.IsInstalled() {
419+
return errors.New(tr("tool not installed"))
420+
}
421+
postInstallFilename := "post_install.sh"
422+
if runtime.GOOS == "windows" {
423+
postInstallFilename = "post_install.bat"
424+
}
425+
postInstall := toolRelease.InstallDir.Join(postInstallFilename)
426+
if postInstall.Exist() && postInstall.IsNotDir() {
427+
cmd, err := executils.NewProcessFromPath(pme.GetEnvVarsForSpawnedProcess(), postInstall)
428+
if err != nil {
429+
return err
430+
}
431+
cmd.SetDirFromPath(toolRelease.InstallDir)
432+
if err := cmd.Run(); err != nil {
433+
return err
434+
}
435+
}
436+
return nil
437+
}

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

0 commit comments

Comments
 (0)