Skip to content

Commit 9fed559

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 1d604b8 commit 9fed559

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
@@ -80,7 +80,7 @@ func (pm *Builder) LoadHardwareFromDirectory(path *paths.Path) []error {
8080
if p, err := properties.LoadFromPath(globalPlatformTxt); err != nil {
8181
pm.log.WithError(err).Errorf("Error loading properties.")
8282
} else {
83-
pm.CustomGlobalProperties.Merge(p)
83+
pm.packagesCustomGlobalProperties.Merge(p)
8484
}
8585
}
8686

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

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

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

@@ -701,7 +701,7 @@ func (pm *Builder) LoadToolsFromBundleDirectory(toolsPath *paths.Path) error {
701701
}
702702

703703
for packager, toolsData := range all.FirstLevelOf() {
704-
targetPackage := pm.Packages.GetOrCreatePackage(packager)
704+
targetPackage := pm.packages.GetOrCreatePackage(packager)
705705

706706
for toolName, toolVersion := range toolsData.AsMap() {
707707
tool := targetPackage.GetOrCreateTool(toolName)
@@ -713,7 +713,7 @@ func (pm *Builder) LoadToolsFromBundleDirectory(toolsPath *paths.Path) error {
713713
}
714714
} else {
715715
// otherwise load the tools inside the unnamed package
716-
unnamedPackage := pm.Packages.GetOrCreatePackage("")
716+
unnamedPackage := pm.packages.GetOrCreatePackage("")
717717
pm.LoadToolsFromPackageDir(unnamedPackage, toolsPath)
718718
}
719719
return nil
@@ -724,18 +724,18 @@ func (pm *Builder) LoadToolsFromBundleDirectory(toolsPath *paths.Path) error {
724724
// * A PluggableDiscovery instance can't be created
725725
// * Tools required by the PlatformRelease cannot be found
726726
// * Command line to start PluggableDiscovery has malformed or mismatched quotes
727-
func (pm *PackageManager) LoadDiscoveries() []error {
727+
func (pme *Explorer) LoadDiscoveries() []error {
728728
var merr []error
729-
for _, platform := range pm.InstalledPlatformReleases() {
730-
merr = append(merr, pm.loadDiscoveries(platform)...)
729+
for _, platform := range pme.InstalledPlatformReleases() {
730+
merr = append(merr, pme.loadDiscoveries(platform)...)
731731
}
732-
merr = append(merr, pm.loadBuiltinDiscoveries()...)
732+
merr = append(merr, pme.loadBuiltinDiscoveries()...)
733733
return merr
734734
}
735735

736736
// loadDiscovery loads the discovery tool with id, if it cannot be found a non-nil status is returned
737-
func (pm *PackageManager) loadDiscovery(id string) error {
738-
tool := pm.GetTool(id)
737+
func (pme *Explorer) loadDiscovery(id string) error {
738+
tool := pme.GetTool(id)
739739
if tool == nil {
740740
return errors.New(tr("discovery %s not found", id))
741741
}
@@ -745,22 +745,22 @@ func (pm *PackageManager) loadDiscovery(id string) error {
745745
}
746746
discoveryPath := toolRelease.InstallDir.Join(tool.Name).String()
747747
d := discovery.New(id, discoveryPath)
748-
pm.discoveryManager.Add(d)
748+
pme.discoveryManager.Add(d)
749749
return nil
750750
}
751751

752752
// loadBuiltinDiscoveries loads the discovery tools that are part of the builtin package
753-
func (pm *PackageManager) loadBuiltinDiscoveries() []error {
753+
func (pme *Explorer) loadBuiltinDiscoveries() []error {
754754
var merr []error
755755
for _, id := range []string{"builtin:serial-discovery", "builtin:mdns-discovery"} {
756-
if err := pm.loadDiscovery(id); err != nil {
756+
if err := pme.loadDiscovery(id); err != nil {
757757
merr = append(merr, err)
758758
}
759759
}
760760
return merr
761761
}
762762

763-
func (pm *PackageManager) loadDiscoveries(release *cores.PlatformRelease) []error {
763+
func (pme *Explorer) loadDiscoveries(release *cores.PlatformRelease) []error {
764764
var merr []error
765765
discoveryProperties := release.Properties.SubTree("pluggable_discovery")
766766

@@ -779,7 +779,7 @@ func (pm *PackageManager) loadDiscoveries(release *cores.PlatformRelease) []erro
779779
//
780780
// If both indexed and unindexed properties are found the unindexed are ignored
781781
for _, id := range discoveryProperties.ExtractSubIndexLists("required") {
782-
if err := pm.loadDiscovery(id); err != nil {
782+
if err := pme.loadDiscovery(id); err != nil {
783783
merr = append(merr, err)
784784
}
785785
}
@@ -794,7 +794,7 @@ func (pm *PackageManager) loadDiscoveries(release *cores.PlatformRelease) []erro
794794
var tools []*cores.ToolRelease
795795
if len(discoveryIDs) > 0 {
796796
var err error
797-
tools, err = pm.FindToolsRequiredFromPlatformRelease(release)
797+
tools, err = pme.FindToolsRequiredFromPlatformRelease(release)
798798
if err != nil {
799799
merr = append(merr, err)
800800
}
@@ -822,7 +822,7 @@ func (pm *PackageManager) loadDiscoveries(release *cores.PlatformRelease) []erro
822822
merr = append(merr, err)
823823
} else {
824824
d := discovery.New(discoveryID, cmdArgs...)
825-
pm.discoveryManager.Add(d)
825+
pme.discoveryManager.Add(d)
826826
}
827827
}
828828

0 commit comments

Comments
 (0)