Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Add post install script support for tools
  • Loading branch information
MatteoPologruto committed Feb 20, 2023
commit f9d139aa373e7aa91903b1051d57c208d06ee3c0
36 changes: 26 additions & 10 deletions arduino/cores/packagemanager/install_uninstall.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ func (pme *Explorer) DownloadAndInstallPlatformAndTools(

// Install tools first
for _, tool := range toolsToInstall {
if err := pme.InstallTool(tool, taskCB); err != nil {
if err := pme.InstallTool(tool, taskCB, skipPostInstall); err != nil {
return err
}
}
Expand Down Expand Up @@ -171,7 +171,10 @@ func (pme *Explorer) DownloadAndInstallPlatformAndTools(
if !skipPostInstall {
log.Info("Running post_install script")
taskCB(&rpc.TaskProgress{Message: tr("Configuring platform.")})
if err := pme.RunPostInstallScript(platformRelease); err != nil {
if !platformRelease.IsInstalled() {
return errors.New(tr("platform not installed"))
}
if err := pme.RunPostInstallScript(platformRelease.InstallDir); err != nil {
taskCB(&rpc.TaskProgress{Message: tr("WARNING cannot configure platform: %s", err)})
}
} else {
Expand Down Expand Up @@ -222,22 +225,19 @@ func (pme *Explorer) cacheInstalledJSON(platformRelease *cores.PlatformRelease)
}

// RunPostInstallScript runs the post_install.sh (or post_install.bat) script for the
// specified platformRelease.
func (pme *Explorer) RunPostInstallScript(platformRelease *cores.PlatformRelease) error {
if !platformRelease.IsInstalled() {
return errors.New(tr("platform not installed"))
}
// specified platformRelease or toolRelease.
func (pme *Explorer) RunPostInstallScript(installDir *paths.Path) error {
postInstallFilename := "post_install.sh"
if runtime.GOOS == "windows" {
postInstallFilename = "post_install.bat"
}
postInstall := platformRelease.InstallDir.Join(postInstallFilename)
postInstall := installDir.Join(postInstallFilename)
if postInstall.Exist() && postInstall.IsNotDir() {
cmd, err := executils.NewProcessFromPath(pme.GetEnvVarsForSpawnedProcess(), postInstall)
if err != nil {
return err
}
cmd.SetDirFromPath(platformRelease.InstallDir)
cmd.SetDirFromPath(installDir)
if err := cmd.Run(); err != nil {
return err
}
Expand Down Expand Up @@ -299,7 +299,7 @@ func (pme *Explorer) UninstallPlatform(platformRelease *cores.PlatformRelease, t
}

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

if toolRelease.IsInstalled() {
Expand All @@ -325,6 +325,22 @@ func (pme *Explorer) InstallTool(toolRelease *cores.ToolRelease, taskCB rpc.Task
log.WithError(err).Warn("Cannot install tool")
return &arduino.FailedInstallError{Message: tr("Cannot install tool %s", toolRelease), Cause: err}
}
if d, err := destDir.Abs(); err == nil {
toolRelease.InstallDir = d
} else {
return err
}
// Perform post install
if !skipPostInstall {
log.Info("Running tool post_install script")
taskCB(&rpc.TaskProgress{Message: tr("Configuring tool.")})
if err := pme.RunPostInstallScript(toolRelease.InstallDir); err != nil {
taskCB(&rpc.TaskProgress{Message: tr("WARNING cannot configure tool: %s", err)})
}
} else {
log.Info("Skipping tool configuration.")
taskCB(&rpc.TaskProgress{Message: tr("Skipping tool configuration.")})
}
log.Info("Tool installed")
taskCB(&rpc.TaskProgress{Message: tr("%s installed", toolRelease), Completed: true})

Expand Down
2 changes: 1 addition & 1 deletion commands/instances.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ func installTool(pm *packagemanager.PackageManager, tool *cores.ToolRelease, dow
return fmt.Errorf(tr("downloading %[1]s tool: %[2]s"), tool, err)
}
taskCB(&rpc.TaskProgress{Completed: true})
if err := pme.InstallTool(tool, taskCB); err != nil {
if err := pme.InstallTool(tool, taskCB, true); err != nil {
return fmt.Errorf(tr("installing %[1]s tool: %[2]s"), tool, err)
}
return nil
Expand Down