Skip to content

Commit 840c703

Browse files
committed
Created packagemanager.Explorer to query PackageManager data
The Explorer object can be see as a read-only "view" to the underlying PackageManager: we may ask the PackageManager to create an Explorer on itself. The returned explorer will held a read-lock on the PackageManager until it's disposed. This architecture should prevent unwanted changes on the PackageManager while it's being used, and viceversa, when the PackageManager is updated it should be guaranteed that no Explorers are reading it.
1 parent 3001ca5 commit 840c703

39 files changed

+599
-431
lines changed

Diff for: arduino/cores/packagemanager/download.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func (platform *PlatformReference) String() string {
4444
// FindPlatform returns the Platform matching the PlatformReference or nil if not found.
4545
// The PlatformVersion field of the reference is ignored.
4646
func (pm *PackageManager) FindPlatform(ref *PlatformReference) *cores.Platform {
47-
targetPackage, ok := pm.Packages[ref.Package]
47+
targetPackage, ok := pm.packages[ref.Package]
4848
if !ok {
4949
return nil
5050
}
@@ -71,7 +71,7 @@ func (pm *PackageManager) FindPlatformRelease(ref *PlatformReference) *cores.Pla
7171
// FindPlatformReleaseDependencies takes a PlatformReference and returns a set of items to download and
7272
// a set of outputs for non existing platforms.
7373
func (pm *PackageManager) FindPlatformReleaseDependencies(item *PlatformReference) (*cores.PlatformRelease, []*cores.ToolRelease, error) {
74-
targetPackage, exists := pm.Packages[item.Package]
74+
targetPackage, exists := pm.packages[item.Package]
7575
if !exists {
7676
return nil, nil, fmt.Errorf(tr("package %s not found"), item.Package)
7777
}
@@ -94,22 +94,22 @@ func (pm *PackageManager) FindPlatformReleaseDependencies(item *PlatformReferenc
9494
}
9595

9696
// replaces "latest" with latest version too
97-
toolDeps, err := pm.Packages.GetPlatformReleaseToolDependencies(release)
97+
toolDeps, err := pm.packages.GetPlatformReleaseToolDependencies(release)
9898
if err != nil {
9999
return nil, nil, fmt.Errorf(tr("getting tool dependencies for platform %[1]s: %[2]s"), release.String(), err)
100100
}
101101

102102
// discovery dependencies differ from normal tool since we always want to use the latest
103103
// available version for the platform package
104-
discoveryDependencies, err := pm.Packages.GetPlatformReleaseDiscoveryDependencies(release)
104+
discoveryDependencies, err := pm.packages.GetPlatformReleaseDiscoveryDependencies(release)
105105
if err != nil {
106106
return nil, nil, fmt.Errorf(tr("getting discovery dependencies for platform %[1]s: %[2]s"), release.String(), err)
107107
}
108108
toolDeps = append(toolDeps, discoveryDependencies...)
109109

110110
// monitor dependencies differ from normal tool since we always want to use the latest
111111
// available version for the platform package
112-
monitorDependencies, err := pm.Packages.GetPlatformReleaseMonitorDependencies(release)
112+
monitorDependencies, err := pm.packages.GetPlatformReleaseMonitorDependencies(release)
113113
if err != nil {
114114
return nil, nil, fmt.Errorf(tr("getting monitor dependencies for platform %[1]s: %[2]s"), release.String(), err)
115115
}

Diff for: arduino/cores/packagemanager/identify.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@ import (
2222

2323
// IdentifyBoard returns a list of boards whose identification properties match the
2424
// provided ones.
25-
func (pm *PackageManager) IdentifyBoard(idProps *properties.Map) []*cores.Board {
25+
func (pme *Explorer) IdentifyBoard(idProps *properties.Map) []*cores.Board {
2626
if idProps.Size() == 0 {
2727
return []*cores.Board{}
2828
}
2929
foundBoards := []*cores.Board{}
30-
for _, board := range pm.InstalledBoards() {
30+
for _, board := range pme.InstalledBoards() {
3131
if board.IsBoardMatchingIDProperties(idProps) {
3232
foundBoards = append(foundBoards, board)
3333
}

Diff for: arduino/cores/packagemanager/install_uninstall.go

+23-23
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import (
3232
// DownloadAndInstallPlatformUpgrades runs a full installation process to upgrade the given platform.
3333
// This method takes care of downloading missing archives, upgrading platforms and tools, and
3434
// removing the previously installed platform/tools that are no longer needed after the upgrade.
35-
func (pm *PackageManager) DownloadAndInstallPlatformUpgrades(
35+
func (pme *Explorer) DownloadAndInstallPlatformUpgrades(
3636
platformRef *PlatformReference,
3737
downloadCB rpc.DownloadProgressCB,
3838
taskCB rpc.TaskProgressCB,
@@ -43,11 +43,11 @@ func (pm *PackageManager) DownloadAndInstallPlatformUpgrades(
4343
}
4444

4545
// Search the latest version for all specified platforms
46-
platform := pm.FindPlatform(platformRef)
46+
platform := pme.FindPlatform(platformRef)
4747
if platform == nil {
4848
return &arduino.PlatformNotFoundError{Platform: platformRef.String()}
4949
}
50-
installed := pm.GetInstalledPlatformRelease(platform)
50+
installed := pme.GetInstalledPlatformRelease(platform)
5151
if installed == nil {
5252
return &arduino.PlatformNotFoundError{Platform: platformRef.String()}
5353
}
@@ -57,11 +57,11 @@ func (pm *PackageManager) DownloadAndInstallPlatformUpgrades(
5757
}
5858
platformRef.PlatformVersion = latest.Version
5959

60-
platformRelease, tools, err := pm.FindPlatformReleaseDependencies(platformRef)
60+
platformRelease, tools, err := pme.FindPlatformReleaseDependencies(platformRef)
6161
if err != nil {
6262
return &arduino.PlatformNotFoundError{Platform: platformRef.String()}
6363
}
64-
if err := pm.DownloadAndInstallPlatformAndTools(platformRelease, tools, downloadCB, taskCB, skipPostInstall); err != nil {
64+
if err := pme.DownloadAndInstallPlatformAndTools(platformRelease, tools, downloadCB, taskCB, skipPostInstall); err != nil {
6565
return err
6666
}
6767

@@ -71,11 +71,11 @@ func (pm *PackageManager) DownloadAndInstallPlatformUpgrades(
7171
// DownloadAndInstallPlatformAndTools runs a full installation process for the given platform and tools.
7272
// This method takes care of downloading missing archives, installing/upgrading platforms and tools, and
7373
// removing the previously installed platform/tools that are no longer needed after the upgrade.
74-
func (pm *PackageManager) DownloadAndInstallPlatformAndTools(
74+
func (pme *Explorer) DownloadAndInstallPlatformAndTools(
7575
platformRelease *cores.PlatformRelease, requiredTools []*cores.ToolRelease,
7676
downloadCB rpc.DownloadProgressCB, taskCB rpc.TaskProgressCB,
7777
skipPostInstall bool) error {
78-
log := pm.log.WithField("platform", platformRelease)
78+
log := pme.log.WithField("platform", platformRelease)
7979

8080
// Prerequisite checks before install
8181
toolsToInstall := []*cores.ToolRelease{}
@@ -91,23 +91,23 @@ func (pm *PackageManager) DownloadAndInstallPlatformAndTools(
9191
// Package download
9292
taskCB(&rpc.TaskProgress{Name: tr("Downloading packages")})
9393
for _, tool := range toolsToInstall {
94-
if err := pm.DownloadToolRelease(tool, nil, downloadCB); err != nil {
94+
if err := pme.DownloadToolRelease(tool, nil, downloadCB); err != nil {
9595
return err
9696
}
9797
}
98-
if err := pm.DownloadPlatformRelease(platformRelease, nil, downloadCB); err != nil {
98+
if err := pme.DownloadPlatformRelease(platformRelease, nil, downloadCB); err != nil {
9999
return err
100100
}
101101
taskCB(&rpc.TaskProgress{Completed: true})
102102

103103
// Install tools first
104104
for _, tool := range toolsToInstall {
105-
if err := pm.InstallTool(tool, taskCB); err != nil {
105+
if err := pme.InstallTool(tool, taskCB); err != nil {
106106
return err
107107
}
108108
}
109109

110-
installed := pm.GetInstalledPlatformRelease(platformRelease.Platform)
110+
installed := pme.GetInstalledPlatformRelease(platformRelease.Platform)
111111
installedTools := []*cores.ToolRelease{}
112112
if installed == nil {
113113
// No version of this platform is installed
@@ -127,29 +127,29 @@ func (pm *PackageManager) DownloadAndInstallPlatformAndTools(
127127
// This must be done so tools used by the currently installed version are
128128
// removed if not used also by the newly installed version.
129129
var err error
130-
_, installedTools, err = pm.FindPlatformReleaseDependencies(platformRef)
130+
_, installedTools, err = pme.FindPlatformReleaseDependencies(platformRef)
131131
if err != nil {
132132
return &arduino.NotFoundError{Message: tr("Can't find dependencies for platform %s", platformRef), Cause: err}
133133
}
134134
}
135135

136136
// Install
137-
if err := pm.InstallPlatform(platformRelease); err != nil {
137+
if err := pme.InstallPlatform(platformRelease); err != nil {
138138
log.WithError(err).Error("Cannot install platform")
139139
return &arduino.FailedInstallError{Message: tr("Cannot install platform"), Cause: err}
140140
}
141141

142142
// If upgrading remove previous release
143143
if installed != nil {
144-
uninstallErr := pm.UninstallPlatform(installed, taskCB)
144+
uninstallErr := pme.UninstallPlatform(installed, taskCB)
145145

146146
// In case of error try to rollback
147147
if uninstallErr != nil {
148148
log.WithError(uninstallErr).Error("Error upgrading platform.")
149149
taskCB(&rpc.TaskProgress{Message: tr("Error upgrading platform: %s", uninstallErr)})
150150

151151
// Rollback
152-
if err := pm.UninstallPlatform(platformRelease, taskCB); err != nil {
152+
if err := pme.UninstallPlatform(platformRelease, taskCB); err != nil {
153153
log.WithError(err).Error("Error rolling-back changes.")
154154
taskCB(&rpc.TaskProgress{Message: tr("Error rolling-back changes: %s", err)})
155155
}
@@ -160,8 +160,8 @@ func (pm *PackageManager) DownloadAndInstallPlatformAndTools(
160160
// Uninstall unused tools
161161
for _, tool := range installedTools {
162162
taskCB(&rpc.TaskProgress{Name: tr("Uninstalling %s, tool is no more required", tool)})
163-
if !pm.IsToolRequired(tool) {
164-
pm.UninstallTool(tool, taskCB)
163+
if !pme.IsToolRequired(tool) {
164+
pme.UninstallTool(tool, taskCB)
165165
}
166166
}
167167

@@ -171,7 +171,7 @@ func (pm *PackageManager) DownloadAndInstallPlatformAndTools(
171171
if !skipPostInstall {
172172
log.Info("Running post_install script")
173173
taskCB(&rpc.TaskProgress{Message: tr("Configuring platform.")})
174-
if err := pm.RunPostInstallScript(platformRelease); err != nil {
174+
if err := pme.RunPostInstallScript(platformRelease); err != nil {
175175
taskCB(&rpc.TaskProgress{Message: tr("WARNING cannot configure platform: %s", err)})
176176
}
177177
} else {
@@ -223,7 +223,7 @@ func (pm *PackageManager) cacheInstalledJSON(platformRelease *cores.PlatformRele
223223

224224
// RunPostInstallScript runs the post_install.sh (or post_install.bat) script for the
225225
// specified platformRelease.
226-
func (pm *PackageManager) RunPostInstallScript(platformRelease *cores.PlatformRelease) error {
226+
func (pme *Explorer) RunPostInstallScript(platformRelease *cores.PlatformRelease) error {
227227
if !platformRelease.IsInstalled() {
228228
return errors.New(tr("platform not installed"))
229229
}
@@ -233,7 +233,7 @@ func (pm *PackageManager) RunPostInstallScript(platformRelease *cores.PlatformRe
233233
}
234234
postInstall := platformRelease.InstallDir.Join(postInstallFilename)
235235
if postInstall.Exist() && postInstall.IsNotDir() {
236-
cmd, err := executils.NewProcessFromPath(pm.GetEnvVarsForSpawnedProcess(), postInstall)
236+
cmd, err := executils.NewProcessFromPath(pme.GetEnvVarsForSpawnedProcess(), postInstall)
237237
if err != nil {
238238
return err
239239
}
@@ -382,11 +382,11 @@ func (pm *PackageManager) UninstallTool(toolRelease *cores.ToolRelease, taskCB r
382382

383383
// IsToolRequired returns true if any of the installed platforms requires the toolRelease
384384
// passed as parameter
385-
func (pm *PackageManager) IsToolRequired(toolRelease *cores.ToolRelease) bool {
385+
func (pme *Explorer) IsToolRequired(toolRelease *cores.ToolRelease) bool {
386386
// Search in all installed platforms
387-
for _, targetPackage := range pm.Packages {
387+
for _, targetPackage := range pme.packages {
388388
for _, platform := range targetPackage.Platforms {
389-
if platformRelease := pm.GetInstalledPlatformRelease(platform); platformRelease != nil {
389+
if platformRelease := pme.GetInstalledPlatformRelease(platform); platformRelease != nil {
390390
if platformRelease.RequiresToolRelease(toolRelease) {
391391
return true
392392
}

Diff for: arduino/cores/packagemanager/loader.go

+18-18
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func (pm *Builder) LoadHardwareFromDirectory(path *paths.Path) []error {
8181
if p, err := properties.LoadFromPath(globalPlatformTxt); err != nil {
8282
pm.log.WithError(err).Errorf("Error loading properties.")
8383
} else {
84-
pm.CustomGlobalProperties.Merge(p)
84+
pm.packagesCustomGlobalProperties.Merge(p)
8585
}
8686
}
8787

@@ -121,7 +121,7 @@ func (pm *Builder) LoadHardwareFromDirectory(path *paths.Path) []error {
121121
architectureParentPath = packagerPath
122122
}
123123

124-
targetPackage := pm.Packages.GetOrCreatePackage(packager)
124+
targetPackage := pm.packages.GetOrCreatePackage(packager)
125125
merr = append(merr, pm.loadPlatforms(targetPackage, architectureParentPath)...)
126126

127127
// Check if we have tools to load, the directory structure is as follows:
@@ -133,7 +133,7 @@ func (pm *Builder) LoadHardwareFromDirectory(path *paths.Path) []error {
133133
}
134134
// If the Package does not contain Platforms or Tools we remove it since does not contain anything valuable
135135
if len(targetPackage.Platforms) == 0 && len(targetPackage.Tools) == 0 {
136-
delete(pm.Packages, packager)
136+
delete(pm.packages, packager)
137137
}
138138
}
139139

@@ -706,7 +706,7 @@ func (pm *Builder) LoadToolsFromBundleDirectory(toolsPath *paths.Path) error {
706706
}
707707

708708
for packager, toolsData := range all.FirstLevelOf() {
709-
targetPackage := pm.Packages.GetOrCreatePackage(packager)
709+
targetPackage := pm.packages.GetOrCreatePackage(packager)
710710

711711
for toolName, toolVersion := range toolsData.AsMap() {
712712
tool := targetPackage.GetOrCreateTool(toolName)
@@ -718,7 +718,7 @@ func (pm *Builder) LoadToolsFromBundleDirectory(toolsPath *paths.Path) error {
718718
}
719719
} else {
720720
// otherwise load the tools inside the unnamed package
721-
unnamedPackage := pm.Packages.GetOrCreatePackage("")
721+
unnamedPackage := pm.packages.GetOrCreatePackage("")
722722
pm.LoadToolsFromPackageDir(unnamedPackage, toolsPath)
723723
}
724724
return nil
@@ -729,18 +729,18 @@ func (pm *Builder) LoadToolsFromBundleDirectory(toolsPath *paths.Path) error {
729729
// * A PluggableDiscovery instance can't be created
730730
// * Tools required by the PlatformRelease cannot be found
731731
// * Command line to start PluggableDiscovery has malformed or mismatched quotes
732-
func (pm *PackageManager) LoadDiscoveries() []error {
732+
func (pme *Explorer) LoadDiscoveries() []error {
733733
var merr []error
734-
for _, platform := range pm.InstalledPlatformReleases() {
735-
merr = append(merr, pm.loadDiscoveries(platform)...)
734+
for _, platform := range pme.InstalledPlatformReleases() {
735+
merr = append(merr, pme.loadDiscoveries(platform)...)
736736
}
737-
merr = append(merr, pm.loadBuiltinDiscoveries()...)
737+
merr = append(merr, pme.loadBuiltinDiscoveries()...)
738738
return merr
739739
}
740740

741741
// loadDiscovery loads the discovery tool with id, if it cannot be found a non-nil status is returned
742-
func (pm *PackageManager) loadDiscovery(id string) error {
743-
tool := pm.GetTool(id)
742+
func (pme *Explorer) loadDiscovery(id string) error {
743+
tool := pme.GetTool(id)
744744
if tool == nil {
745745
return errors.New(tr("discovery %s not found", id))
746746
}
@@ -750,22 +750,22 @@ func (pm *PackageManager) loadDiscovery(id string) error {
750750
}
751751
discoveryPath := toolRelease.InstallDir.Join(tool.Name).String()
752752
d := discovery.New(id, discoveryPath)
753-
pm.discoveryManager.Add(d)
753+
pme.discoveryManager.Add(d)
754754
return nil
755755
}
756756

757757
// loadBuiltinDiscoveries loads the discovery tools that are part of the builtin package
758-
func (pm *PackageManager) loadBuiltinDiscoveries() []error {
758+
func (pme *Explorer) loadBuiltinDiscoveries() []error {
759759
var merr []error
760760
for _, id := range []string{"builtin:serial-discovery", "builtin:mdns-discovery"} {
761-
if err := pm.loadDiscovery(id); err != nil {
761+
if err := pme.loadDiscovery(id); err != nil {
762762
merr = append(merr, err)
763763
}
764764
}
765765
return merr
766766
}
767767

768-
func (pm *PackageManager) loadDiscoveries(release *cores.PlatformRelease) []error {
768+
func (pme *Explorer) loadDiscoveries(release *cores.PlatformRelease) []error {
769769
var merr []error
770770
discoveryProperties := release.Properties.SubTree("pluggable_discovery")
771771

@@ -784,7 +784,7 @@ func (pm *PackageManager) loadDiscoveries(release *cores.PlatformRelease) []erro
784784
//
785785
// If both indexed and unindexed properties are found the unindexed are ignored
786786
for _, id := range discoveryProperties.ExtractSubIndexLists("required") {
787-
if err := pm.loadDiscovery(id); err != nil {
787+
if err := pme.loadDiscovery(id); err != nil {
788788
merr = append(merr, err)
789789
}
790790
}
@@ -799,7 +799,7 @@ func (pm *PackageManager) loadDiscoveries(release *cores.PlatformRelease) []erro
799799
var tools []*cores.ToolRelease
800800
if len(discoveryIDs) > 0 {
801801
var err error
802-
tools, err = pm.FindToolsRequiredFromPlatformRelease(release)
802+
tools, err = pme.FindToolsRequiredFromPlatformRelease(release)
803803
if err != nil {
804804
merr = append(merr, err)
805805
}
@@ -827,7 +827,7 @@ func (pm *PackageManager) loadDiscoveries(release *cores.PlatformRelease) []erro
827827
merr = append(merr, err)
828828
} else {
829829
d := discovery.New(discoveryID, cmdArgs...)
830-
pm.discoveryManager.Add(d)
830+
pme.discoveryManager.Add(d)
831831
}
832832
}
833833

0 commit comments

Comments
 (0)