diff --git a/commands/core/install.go b/commands/core/install.go index a150e71be15..4ee03deabe0 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 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 { @@ -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 20c88e5707b..a0c391bfbb5 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 } diff --git a/commands/lib/install.go b/commands/lib/install.go index 205738e6f29..15d7f3a177f 100644 --- a/commands/lib/install.go +++ b/commands/lib/install.go @@ -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, @@ -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 } @@ -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 { diff --git a/commands/lib/upgrade.go b/commands/lib/upgrade.go index 41aef204265..c31897364f0 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 + } } }