Skip to content

Optimization: skip Init() when no library or platform was installed #1663

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
May 12, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
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
26 changes: 14 additions & 12 deletions commands/core/install.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,15 @@ func PlatformInstall(ctx context.Context, req *rpc.PlatformInstallRequest,
return nil, &arduino.PlatformNotFoundError{Platform: ref.String(), Cause: err}
}

err = installPlatform(pm, platform, tools, downloadCB, taskCB, req.GetSkipPostInstall())
didInstall, err := installPlatform(pm, platform, tools, downloadCB, taskCB, req.GetSkipPostInstall())
if err != nil {
return nil, err
}

if err := commands.Init(&rpc.InitRequest{Instance: req.Instance}, nil); err != nil {
return nil, err
if didInstall {
if err := commands.Init(&rpc.InitRequest{Instance: req.Instance}, nil); err != nil {
return nil, err
}
}

return &rpc.PlatformInstallResponse{}, nil
Expand All @@ -64,14 +66,14 @@ func PlatformInstall(ctx context.Context, req *rpc.PlatformInstallRequest,
func installPlatform(pm *packagemanager.PackageManager,
platformRelease *cores.PlatformRelease, requiredTools []*cores.ToolRelease,
downloadCB rpc.DownloadProgressCB, taskCB rpc.TaskProgressCB,
skipPostInstall bool) error {
skipPostInstall bool) (bool, error) {
log := pm.Log.WithField("platform", platformRelease)

// Prerequisite checks before install
if platformRelease.IsInstalled() {
log.Warn("Platform already installed")
taskCB(&rpc.TaskProgress{Name: tr("Platform %s already installed", platformRelease), Completed: true})
return nil
return false, nil
}
toolsToInstall := []*cores.ToolRelease{}
for _, tool := range requiredTools {
Expand All @@ -87,18 +89,18 @@ func installPlatform(pm *packagemanager.PackageManager,
taskCB(&rpc.TaskProgress{Name: tr("Downloading packages")})
for _, tool := range toolsToInstall {
if err := downloadTool(pm, tool, downloadCB); err != nil {
return err
return false, err
}
}
if err := downloadPlatform(pm, platformRelease, downloadCB); err != nil {
return err
return false, err
}
taskCB(&rpc.TaskProgress{Completed: true})

// Install tools first
for _, tool := range toolsToInstall {
if err := commands.InstallToolRelease(pm, tool, taskCB); err != nil {
return err
return false, err
}
}

Expand All @@ -124,14 +126,14 @@ func installPlatform(pm *packagemanager.PackageManager,
var err error
_, installedTools, err = pm.FindPlatformReleaseDependencies(platformRef)
if err != nil {
return &arduino.NotFoundError{Message: tr("Can't find dependencies for platform %s", platformRef), Cause: err}
return false, &arduino.NotFoundError{Message: tr("Can't find dependencies for platform %s", platformRef), Cause: err}
}
}

// Install
if err := pm.InstallPlatform(platformRelease); err != nil {
log.WithError(err).Error("Cannot install platform")
return &arduino.FailedInstallError{Message: tr("Cannot install platform"), Cause: err}
return false, &arduino.FailedInstallError{Message: tr("Cannot install platform"), Cause: err}
}

// If upgrading remove previous release
Expand All @@ -149,7 +151,7 @@ func installPlatform(pm *packagemanager.PackageManager,
taskCB(&rpc.TaskProgress{Message: tr("Error rolling-back changes: %s", err)})
}

return &arduino.FailedInstallError{Message: tr("Cannot upgrade platform"), Cause: uninstallErr}
return false, &arduino.FailedInstallError{Message: tr("Cannot upgrade platform"), Cause: uninstallErr}
}

// Uninstall unused tools
Expand All @@ -175,5 +177,5 @@ func installPlatform(pm *packagemanager.PackageManager,

log.Info("Platform installed")
taskCB(&rpc.TaskProgress{Message: tr("Platform %s installed", platformRelease), Completed: true})
return nil
return true, nil
}
2 changes: 1 addition & 1 deletion commands/core/upgrade.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ func upgradePlatform(pm *packagemanager.PackageManager, platformRef *packagemana
if err != nil {
return &arduino.PlatformNotFoundError{Platform: platformRef.String()}
}
if err := installPlatform(pm, platformRelease, tools, downloadCB, taskCB, skipPostInstall); err != nil {
if _, err := installPlatform(pm, platformRelease, tools, downloadCB, taskCB, skipPostInstall); err != nil {
return err
}

Expand Down
17 changes: 13 additions & 4 deletions commands/lib/install.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ func LibraryInstall(ctx context.Context, req *rpc.LibraryInstallRequest, downloa
}
}

didInstall := false
for _, lib := range toInstall {
libRelease, err := findLibraryIndexRelease(lm, &rpc.LibraryInstallRequest{
Name: lib.Name,
Expand All @@ -78,13 +79,21 @@ func LibraryInstall(ctx context.Context, req *rpc.LibraryInstallRequest, downloa
}

if err := installLibrary(lm, libRelease, taskCB); err != nil {
return err
if errors.Is(err, librariesmanager.ErrAlreadyInstalled) {
continue
} else {
return err
}
}
didInstall = true
}

if err := commands.Init(&rpc.InitRequest{Instance: req.Instance}, nil); err != nil {
return err
if didInstall {
if err := commands.Init(&rpc.InitRequest{Instance: req.Instance}, nil); err != nil {
return err
}
}

return nil
}

Expand All @@ -94,7 +103,7 @@ func installLibrary(lm *librariesmanager.LibrariesManager, libRelease *libraries
libPath, libReplaced, err := lm.InstallPrerequisiteCheck(libRelease)
if errors.Is(err, librariesmanager.ErrAlreadyInstalled) {
taskCB(&rpc.TaskProgress{Message: tr("Already installed %s", libRelease), Completed: true})
return nil
return err
}

if err != nil {
Expand Down
6 changes: 5 additions & 1 deletion commands/lib/upgrade.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
package lib

import (
"errors"

"github.com/arduino/arduino-cli/arduino"
"github.com/arduino/arduino-cli/arduino/libraries/librariesmanager"
"github.com/arduino/arduino-cli/commands"
Expand Down Expand Up @@ -65,7 +67,9 @@ func upgrade(lm *librariesmanager.LibrariesManager, libs []*installedLib, downlo
// Go through the list and install them
for _, lib := range libs {
if err := installLibrary(lm, lib.Available, taskCB); err != nil {
return err
if !errors.Is(err, librariesmanager.ErrAlreadyInstalled) {
return err
}
}
}

Expand Down