diff --git a/arduino/cores/cores.go b/arduino/cores/cores.go index 495c4a4a07a..6bf0634d86a 100644 --- a/arduino/cores/cores.go +++ b/arduino/cores/cores.go @@ -47,6 +47,7 @@ type PlatformRelease struct { Programmers map[string]*properties.Map `json:"-"` Menus *properties.Map `json:"-"` InstallDir *paths.Path `json:"-"` + IsIDEBundled bool `json:"-"` } // BoardManifest contains information about a board. These metadata are usually diff --git a/arduino/cores/packagemanager/loader.go b/arduino/cores/packagemanager/loader.go index 771eef2e945..f2ed7ff1a17 100644 --- a/arduino/cores/packagemanager/loader.go +++ b/arduino/cores/packagemanager/loader.go @@ -179,6 +179,7 @@ func (pm *PackageManager) loadPlatforms(targetPackage *cores.Package, packageDir } // check if package_bundled_index.json exists + isIDEBundled := false packageBundledIndexPath := packageDir.Parent().Join("package_index_bundled.json") if packageBundledIndexPath.Exist() { // particular case: ARCHITECTURE/boards.txt with package_bundled_index.json @@ -204,6 +205,8 @@ func (pm *PackageManager) loadPlatforms(targetPackage *cores.Package, packageDir } else { version = tmpPlatformRelease.Version } + + isIDEBundled = true } platform := targetPackage.GetOrCreatePlatform(architecture) @@ -211,6 +214,10 @@ func (pm *PackageManager) loadPlatforms(targetPackage *cores.Package, packageDir if err != nil { return fmt.Errorf("loading platform release: %s", err) } + release.IsIDEBundled = isIDEBundled + if isIDEBundled { + pm.Log.Infof("Package is built-in") + } if err := pm.loadPlatformRelease(release, platformPath); err != nil { return fmt.Errorf("loading platform release: %s", err) } diff --git a/arduino/cores/packagemanager/package_manager.go b/arduino/cores/packagemanager/package_manager.go index 5d0e62a4cf9..3d4a2b33d55 100644 --- a/arduino/cores/packagemanager/package_manager.go +++ b/arduino/cores/packagemanager/package_manager.go @@ -323,16 +323,34 @@ func (tr *ToolReleaseActions) Get() (*cores.ToolRelease, error) { // GetInstalledPlatformRelease returns the PlatformRelease installed (it is chosen) func (pm *PackageManager) GetInstalledPlatformRelease(platform *cores.Platform) *cores.PlatformRelease { + pm.Log.Infof("Selecting installed platform release for %s", platform) releases := platform.GetAllInstalled() if len(releases) == 0 { return nil } + + log := func(msg string, pl *cores.PlatformRelease) { + pm.Log.WithField("bundle", pl.IsIDEBundled). + WithField("version", pl.Version). + WithField("managed", pm.IsManagedPlatformRelease(pl)). + Infof("%s: %s", msg, pl) + } + best := releases[0] bestIsManaged := pm.IsManagedPlatformRelease(best) + log("current best", best) + for _, candidate := range releases[1:] { candidateIsManaged := pm.IsManagedPlatformRelease(candidate) + log("candidate", candidate) + // TODO: Disentangle this algorithm and make it more straightforward if bestIsManaged == candidateIsManaged { - if candidate.Version.GreaterThan(best.Version) { + if best.IsIDEBundled == candidate.IsIDEBundled { + if candidate.Version.GreaterThan(best.Version) { + best = candidate + } + } + if best.IsIDEBundled && !candidate.IsIDEBundled { best = candidate } } @@ -340,6 +358,7 @@ func (pm *PackageManager) GetInstalledPlatformRelease(platform *cores.Platform) best = candidate bestIsManaged = true } + log("current best", best) } return best }