Skip to content

Commit 7a15631

Browse files
committed
Moved installPlatform into a packagamanger method
1 parent 59b9710 commit 7a15631

File tree

3 files changed

+118
-116
lines changed

3 files changed

+118
-116
lines changed

arduino/cores/packagemanager/install_uninstall.go

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,122 @@ import (
2929
"github.com/pkg/errors"
3030
)
3131

32+
// DownloadAndInstallPlatformAndTools runs a full installation process for the given platform and tools.
33+
// This methods taks care of downloading missing archives, install/upgrade platforms and tools, and
34+
// remove the previously installed platform/tools that are no more needed after the upgrade.
35+
func (pm *PackageManager) DownloadAndInstallPlatformAndTools(
36+
platformRelease *cores.PlatformRelease, requiredTools []*cores.ToolRelease,
37+
downloadCB rpc.DownloadProgressCB, taskCB rpc.TaskProgressCB,
38+
skipPostInstall bool) error {
39+
log := pm.Log.WithField("platform", platformRelease)
40+
41+
// Prerequisite checks before install
42+
toolsToInstall := []*cores.ToolRelease{}
43+
for _, tool := range requiredTools {
44+
if tool.IsInstalled() {
45+
log.WithField("tool", tool).Warn("Tool already installed")
46+
taskCB(&rpc.TaskProgress{Name: tr("Tool %s already installed", tool), Completed: true})
47+
} else {
48+
toolsToInstall = append(toolsToInstall, tool)
49+
}
50+
}
51+
52+
// Package download
53+
taskCB(&rpc.TaskProgress{Name: tr("Downloading packages")})
54+
for _, tool := range toolsToInstall {
55+
if err := pm.DownloadToolRelease(tool, nil, downloadCB); err != nil {
56+
return err
57+
}
58+
}
59+
if err := pm.DownloadPlatformRelease(platformRelease, nil, downloadCB); err != nil {
60+
return err
61+
}
62+
taskCB(&rpc.TaskProgress{Completed: true})
63+
64+
// Install tools first
65+
for _, tool := range toolsToInstall {
66+
if err := pm.InstallTool(tool, taskCB); err != nil {
67+
return err
68+
}
69+
}
70+
71+
installed := pm.GetInstalledPlatformRelease(platformRelease.Platform)
72+
installedTools := []*cores.ToolRelease{}
73+
if installed == nil {
74+
// No version of this platform is installed
75+
log.Info("Installing platform")
76+
taskCB(&rpc.TaskProgress{Name: tr("Installing platform %s", platformRelease)})
77+
} else {
78+
// A platform with a different version is already installed
79+
log.Info("Replacing platform " + installed.String())
80+
taskCB(&rpc.TaskProgress{Name: tr("Replacing platform %[1]s with %[2]s", installed, platformRelease)})
81+
platformRef := &PlatformReference{
82+
Package: platformRelease.Platform.Package.Name,
83+
PlatformArchitecture: platformRelease.Platform.Architecture,
84+
PlatformVersion: installed.Version,
85+
}
86+
87+
// Get a list of tools used by the currently installed platform version.
88+
// This must be done so tools used by the currently installed version are
89+
// removed if not used also by the newly installed version.
90+
var err error
91+
_, installedTools, err = pm.FindPlatformReleaseDependencies(platformRef)
92+
if err != nil {
93+
return &arduino.NotFoundError{Message: tr("Can't find dependencies for platform %s", platformRef), Cause: err}
94+
}
95+
}
96+
97+
// Install
98+
if err := pm.InstallPlatform(platformRelease); err != nil {
99+
log.WithError(err).Error("Cannot install platform")
100+
return &arduino.FailedInstallError{Message: tr("Cannot install platform"), Cause: err}
101+
}
102+
103+
// If upgrading remove previous release
104+
if installed != nil {
105+
uninstallErr := pm.UninstallPlatform(installed, taskCB)
106+
107+
// In case of error try to rollback
108+
if uninstallErr != nil {
109+
log.WithError(uninstallErr).Error("Error upgrading platform.")
110+
taskCB(&rpc.TaskProgress{Message: tr("Error upgrading platform: %s", uninstallErr)})
111+
112+
// Rollback
113+
if err := pm.UninstallPlatform(platformRelease, taskCB); err != nil {
114+
log.WithError(err).Error("Error rolling-back changes.")
115+
taskCB(&rpc.TaskProgress{Message: tr("Error rolling-back changes: %s", err)})
116+
}
117+
118+
return &arduino.FailedInstallError{Message: tr("Cannot upgrade platform"), Cause: uninstallErr}
119+
}
120+
121+
// Uninstall unused tools
122+
for _, tool := range installedTools {
123+
taskCB(&rpc.TaskProgress{Name: tr("Uninstalling %s, tool is no more required", tool)})
124+
if !pm.IsToolRequired(tool) {
125+
pm.UninstallTool(tool, taskCB)
126+
}
127+
}
128+
129+
}
130+
131+
// Perform post install
132+
if !skipPostInstall {
133+
log.Info("Running post_install script")
134+
taskCB(&rpc.TaskProgress{Message: tr("Configuring platform.")})
135+
if err := pm.RunPostInstallScript(platformRelease); err != nil {
136+
taskCB(&rpc.TaskProgress{Message: tr("WARNING cannot configure platform: %s", err)})
137+
}
138+
} else {
139+
log.Info("Skipping platform configuration.")
140+
taskCB(&rpc.TaskProgress{Message: tr("Skipping platform configuration.")})
141+
}
142+
143+
log.Info("Platform installed")
144+
taskCB(&rpc.TaskProgress{Message: tr("Platform %s installed", platformRelease), Completed: true})
145+
return nil
146+
}
147+
32148
// InstallPlatform installs a specific release of a platform.
33149
func (pm *PackageManager) InstallPlatform(platformRelease *cores.PlatformRelease) error {
34150
destDir := pm.PackagesDir.Join(

commands/core/install.go

Lines changed: 1 addition & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"fmt"
2121

2222
"github.com/arduino/arduino-cli/arduino"
23-
"github.com/arduino/arduino-cli/arduino/cores"
2423
"github.com/arduino/arduino-cli/arduino/cores/packagemanager"
2524
"github.com/arduino/arduino-cli/commands"
2625
rpc "github.com/arduino/arduino-cli/rpc/cc/arduino/cli/commands/v1"
@@ -64,7 +63,7 @@ func PlatformInstall(ctx context.Context, req *rpc.PlatformInstallRequest,
6463
}
6564
}
6665

67-
if err := installPlatform(pm, platformRelease, tools, downloadCB, taskCB, req.GetSkipPostInstall()); err != nil {
66+
if err := pm.DownloadAndInstallPlatformAndTools(platformRelease, tools, downloadCB, taskCB, req.GetSkipPostInstall()); err != nil {
6867
return nil, err
6968
}
7069

@@ -74,116 +73,3 @@ func PlatformInstall(ctx context.Context, req *rpc.PlatformInstallRequest,
7473

7574
return &rpc.PlatformInstallResponse{}, nil
7675
}
77-
78-
func installPlatform(pm *packagemanager.PackageManager,
79-
platformRelease *cores.PlatformRelease, requiredTools []*cores.ToolRelease,
80-
downloadCB rpc.DownloadProgressCB, taskCB rpc.TaskProgressCB,
81-
skipPostInstall bool) error {
82-
log := pm.Log.WithField("platform", platformRelease)
83-
84-
// Prerequisite checks before install
85-
toolsToInstall := []*cores.ToolRelease{}
86-
for _, tool := range requiredTools {
87-
if tool.IsInstalled() {
88-
log.WithField("tool", tool).Warn("Tool already installed")
89-
taskCB(&rpc.TaskProgress{Name: tr("Tool %s already installed", tool), Completed: true})
90-
} else {
91-
toolsToInstall = append(toolsToInstall, tool)
92-
}
93-
}
94-
95-
// Package download
96-
taskCB(&rpc.TaskProgress{Name: tr("Downloading packages")})
97-
for _, tool := range toolsToInstall {
98-
if err := pm.DownloadToolRelease(tool, nil, downloadCB); err != nil {
99-
return err
100-
}
101-
}
102-
if err := pm.DownloadPlatformRelease(platformRelease, nil, downloadCB); err != nil {
103-
return err
104-
}
105-
taskCB(&rpc.TaskProgress{Completed: true})
106-
107-
// Install tools first
108-
for _, tool := range toolsToInstall {
109-
if err := pm.InstallTool(tool, taskCB); err != nil {
110-
return err
111-
}
112-
}
113-
114-
installed := pm.GetInstalledPlatformRelease(platformRelease.Platform)
115-
installedTools := []*cores.ToolRelease{}
116-
if installed == nil {
117-
// No version of this platform is installed
118-
log.Info("Installing platform")
119-
taskCB(&rpc.TaskProgress{Name: tr("Installing platform %s", platformRelease)})
120-
} else {
121-
// A platform with a different version is already installed
122-
log.Info("Replacing platform " + installed.String())
123-
taskCB(&rpc.TaskProgress{Name: tr("Replacing platform %[1]s with %[2]s", installed, platformRelease)})
124-
platformRef := &packagemanager.PlatformReference{
125-
Package: platformRelease.Platform.Package.Name,
126-
PlatformArchitecture: platformRelease.Platform.Architecture,
127-
PlatformVersion: installed.Version,
128-
}
129-
130-
// Get a list of tools used by the currently installed platform version.
131-
// This must be done so tools used by the currently installed version are
132-
// removed if not used also by the newly installed version.
133-
var err error
134-
_, installedTools, err = pm.FindPlatformReleaseDependencies(platformRef)
135-
if err != nil {
136-
return &arduino.NotFoundError{Message: tr("Can't find dependencies for platform %s", platformRef), Cause: err}
137-
}
138-
}
139-
140-
// Install
141-
if err := pm.InstallPlatform(platformRelease); err != nil {
142-
log.WithError(err).Error("Cannot install platform")
143-
return &arduino.FailedInstallError{Message: tr("Cannot install platform"), Cause: err}
144-
}
145-
146-
// If upgrading remove previous release
147-
if installed != nil {
148-
uninstallErr := pm.UninstallPlatform(installed, taskCB)
149-
150-
// In case of error try to rollback
151-
if uninstallErr != nil {
152-
log.WithError(uninstallErr).Error("Error upgrading platform.")
153-
taskCB(&rpc.TaskProgress{Message: tr("Error upgrading platform: %s", uninstallErr)})
154-
155-
// Rollback
156-
if err := pm.UninstallPlatform(platformRelease, taskCB); err != nil {
157-
log.WithError(err).Error("Error rolling-back changes.")
158-
taskCB(&rpc.TaskProgress{Message: tr("Error rolling-back changes: %s", err)})
159-
}
160-
161-
return &arduino.FailedInstallError{Message: tr("Cannot upgrade platform"), Cause: uninstallErr}
162-
}
163-
164-
// Uninstall unused tools
165-
for _, tool := range installedTools {
166-
taskCB(&rpc.TaskProgress{Name: tr("Uninstalling %s, tool is no more required", tool)})
167-
if !pm.IsToolRequired(tool) {
168-
pm.UninstallTool(tool, taskCB)
169-
}
170-
}
171-
172-
}
173-
174-
// Perform post install
175-
if !skipPostInstall {
176-
log.Info("Running post_install script")
177-
taskCB(&rpc.TaskProgress{Message: tr("Configuring platform.")})
178-
if err := pm.RunPostInstallScript(platformRelease); err != nil {
179-
taskCB(&rpc.TaskProgress{Message: tr("WARNING cannot configure platform: %s", err)})
180-
}
181-
} else {
182-
log.Info("Skipping platform configuration.")
183-
taskCB(&rpc.TaskProgress{Message: tr("Skipping platform configuration.")})
184-
}
185-
186-
log.Info("Platform installed")
187-
taskCB(&rpc.TaskProgress{Message: tr("Platform %s installed", platformRelease), Completed: true})
188-
return nil
189-
}

commands/core/upgrade.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ func upgradePlatform(pm *packagemanager.PackageManager, platformRef *packagemana
7474
if err != nil {
7575
return &arduino.PlatformNotFoundError{Platform: platformRef.String()}
7676
}
77-
if err := installPlatform(pm, platformRelease, tools, downloadCB, taskCB, skipPostInstall); err != nil {
77+
if err := pm.DownloadAndInstallPlatformAndTools(platformRelease, tools, downloadCB, taskCB, skipPostInstall); err != nil {
7878
return err
7979
}
8080

0 commit comments

Comments
 (0)