From a6df2c3207ea234bcf5396199545cf6bca367076 Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Mon, 14 Feb 2022 13:51:33 +0100 Subject: [PATCH 1/2] Optimization: skip commands.Init() when no library was installed --- commands/lib/install.go | 17 +++++++++++++---- commands/lib/upgrade.go | 6 +++++- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/commands/lib/install.go b/commands/lib/install.go index 5be44ca8ec7..553e05280ef 100644 --- a/commands/lib/install.go +++ b/commands/lib/install.go @@ -65,6 +65,7 @@ func LibraryInstall(ctx context.Context, req *rpc.LibraryInstallRequest, } } + didInstall := false for _, lib := range toInstall { libRelease, err := findLibraryIndexRelease(lm, &rpc.LibraryInstallRequest{ Name: lib.Name, @@ -79,13 +80,21 @@ func LibraryInstall(ctx context.Context, req *rpc.LibraryInstallRequest, } 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 } @@ -95,7 +104,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 { diff --git a/commands/lib/upgrade.go b/commands/lib/upgrade.go index 3f6c83662e7..2cbd77141fe 100644 --- a/commands/lib/upgrade.go +++ b/commands/lib/upgrade.go @@ -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" @@ -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 + } } } From d8c932959634808f834b8fc5e6f48f03a0e6164c Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Mon, 14 Feb 2022 13:57:37 +0100 Subject: [PATCH 2/2] Optimization: skip commands.Init() when no platform was installed --- commands/core/install.go | 26 ++++++++++++++------------ commands/core/upgrade.go | 2 +- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/commands/core/install.go b/commands/core/install.go index 185e687bee4..4cede5106fd 100644 --- a/commands/core/install.go +++ b/commands/core/install.go @@ -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 @@ -64,14 +66,14 @@ func PlatformInstall(ctx context.Context, req *rpc.PlatformInstallRequest, func installPlatform(pm *packagemanager.PackageManager, platformRelease *cores.PlatformRelease, requiredTools []*cores.ToolRelease, downloadCB commands.DownloadProgressCB, taskCB commands.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 { @@ -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 } } @@ -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 @@ -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 @@ -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 } diff --git a/commands/core/upgrade.go b/commands/core/upgrade.go index d83fca8c10b..aa3c86ec42f 100644 --- a/commands/core/upgrade.go +++ b/commands/core/upgrade.go @@ -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 }