Skip to content

Commit e9fc24e

Browse files
committed
Make package_index library aware of installed cores
The coreDependency resolution will search for most recent installed core. The test has been moved to allow populating the context
1 parent 0e8efc1 commit e9fc24e

File tree

4 files changed

+78
-30
lines changed

4 files changed

+78
-30
lines changed

src/arduino.cc/builder/add_missing_build_properties_from_parent_platform_txt_files.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func (s *OverridePropertiesWithJsonInfo) Run(ctx *types.Context) error {
5757

5858
if ctx.JsonFolders != nil {
5959

60-
jsonProperties, err := json_package_index.PackageIndexFoldersToPropertiesMap(ctx.JsonFolders)
60+
jsonProperties, err := json_package_index.PackageIndexFoldersToPropertiesMap(ctx.Hardware, ctx.JsonFolders)
6161

6262
if err != nil {
6363
// doesn't matter, log the broken package in verbose mode

src/arduino.cc/builder/test/add_build_board_property_if_missing_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import (
3333
"arduino.cc/builder"
3434
"arduino.cc/builder/constants"
3535
"arduino.cc/builder/types"
36+
"arduino.cc/json_package_index"
3637
"github.com/stretchr/testify/require"
3738
"path/filepath"
3839
"testing"
@@ -95,3 +96,35 @@ func TestAddBuildBoardPropertyIfMissingNotMissing(t *testing.T) {
9596
require.Equal(t, "atmega2560", targetBoard.Properties[constants.BUILD_PROPERTIES_BUILD_MCU])
9697
require.Equal(t, "AVR_MEGA2560", targetBoard.Properties[constants.BUILD_PROPERTIES_BUILD_BOARD])
9798
}
99+
100+
func TestCoreDependencyProperty(t *testing.T) {
101+
var paths []string
102+
path, _ := filepath.Abs(filepath.Join("..", "..", "json_package_index", "testdata"))
103+
paths = append(paths, path)
104+
105+
DownloadCoresAndToolsAndLibraries(t)
106+
107+
ctx := &types.Context{
108+
HardwareFolders: []string{filepath.Join("..", "hardware"), "hardware", "downloaded_hardware"},
109+
}
110+
111+
commands := []types.Command{
112+
&builder.HardwareLoader{},
113+
}
114+
115+
for _, command := range commands {
116+
err := command.Run(ctx)
117+
NoError(t, err)
118+
}
119+
120+
p, err := json_package_index.PackageIndexFoldersToPropertiesMap(ctx.Hardware, paths)
121+
require.NoError(t, err)
122+
123+
version := ctx.Hardware.Packages["arduino"].Platforms["avr"].Properties["version"]
124+
125+
if json_package_index.CompareVersions(version, "1.6.12") >= 0 {
126+
require.Equal(t, "{runtime.tools.avr-gcc-4.9.2-atmel3.5.3-arduino2.path}", p["attiny:avr:1.0.2"]["runtime.tools.avr-gcc.path"])
127+
} else {
128+
require.Equal(t, "{runtime.tools.avr-gcc-4.8.1-arduino5.path}", p["attiny:avr:1.0.2"]["runtime.tools.avr-gcc.path"])
129+
}
130+
}

src/arduino.cc/json_package_index/package_index.go

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ package json_package_index
3232
import (
3333
"arduino.cc/builder/constants"
3434
_ "arduino.cc/builder/i18n"
35+
"arduino.cc/builder/types"
3536
"arduino.cc/properties"
3637
"encoding/json"
3738
"errors"
@@ -51,14 +52,14 @@ type core struct {
5152
Name string `json:"archiveFileName"`
5253
Checksum string `json:"checksum"`
5354
destination string
55+
installed bool
5456
Dependencies []struct {
5557
Packager string `json:"packager"`
5658
Name string `json:"name"`
5759
Version string `json:"version"`
5860
} `json:"toolsDependencies"`
5961
CoreDependencies []struct {
6062
Packager string `json:"packager"`
61-
Name string `json:"name"`
6263
} `json:"coreDependencies"`
6364
}
6465

@@ -98,9 +99,10 @@ var systems = map[string]string{
9899

99100
var globalProperties map[string]properties.Map
100101

101-
func PackageIndexFoldersToPropertiesMap(folders []string) (map[string]properties.Map, error) {
102+
func PackageIndexFoldersToPropertiesMap(packages *types.Packages, folders []string) (map[string]properties.Map, error) {
102103

103104
var paths []string
105+
104106
for _, folder := range folders {
105107
folder, err := filepath.Abs(folder)
106108
if err != nil {
@@ -113,15 +115,15 @@ func PackageIndexFoldersToPropertiesMap(folders []string) (map[string]properties
113115
}
114116
}
115117
}
116-
return PackageIndexesToPropertiesMap(paths)
118+
return PackageIndexesToPropertiesMap(packages, paths)
117119
}
118120

119-
func PackageIndexesToPropertiesMap(urls []string) (map[string]properties.Map, error) {
121+
func PackageIndexesToPropertiesMap(packages *types.Packages, urls []string) (map[string]properties.Map, error) {
120122

121123
globalProperties = make(map[string]properties.Map)
122124
coreDependencyMap := make(map[string]string)
123125

124-
data, err := PackageIndexesToGlobalIndex(urls)
126+
data, err := PackageIndexesToGlobalIndex(packages, urls)
125127

126128
for _, p := range data.Packages {
127129
for _, a := range p.Platforms {
@@ -136,32 +138,32 @@ func PackageIndexesToPropertiesMap(urls []string) (map[string]properties.Map, er
136138
}
137139
for _, coredep := range a.CoreDependencies {
138140
// inherit all the tools from latest coredep
139-
version, err := findLatestCore(data, coredep.Packager, coredep.Name)
140141
if err == nil {
141142
coreDependencyMap[p.Name+":"+a.Architecture+":"+a.Version] =
142-
coredep.Packager + ":" + coredep.Name + ":" + version
143+
coredep.Packager + ":" + a.Architecture
143144
}
144145
}
145146
globalProperties[p.Name+":"+a.Architecture+":"+a.Version] = localProperties.Clone()
146147
}
147148
}
148149

149150
for idx, parentCore := range coreDependencyMap {
150-
if (globalProperties[parentCore]) != nil {
151-
globalProperties[idx] = globalProperties[parentCore].Clone()
151+
version, err := findLatestInstalledCore(data, strings.Split(parentCore, ":")[0], strings.Split(parentCore, ":")[1])
152+
if err == nil {
153+
globalProperties[idx] = globalProperties[parentCore+":"+version].Clone()
152154
}
153155
}
154156

155157
return globalProperties, err
156158
}
157159

158-
func findLatestCore(data index, Packager string, Name string) (string, error) {
160+
func findLatestInstalledCore(data index, Packager string, Name string) (string, error) {
159161
latest, _ := semver.Make("0.0.0")
160162
for _, p := range data.Packages {
161163
for _, a := range p.Platforms {
162164
if p.Name == Packager && a.Architecture == Name {
163165
test, _ := semver.Make(a.Version)
164-
if test.GT(latest) {
166+
if test.GT(latest) && a.installed {
165167
latest = test
166168
}
167169
}
@@ -177,9 +179,9 @@ func findLatestCore(data index, Packager string, Name string) (string, error) {
177179
return latest.String(), err
178180
}
179181

180-
func PackageIndexesToGlobalIndex(urls []string) (index, error) {
182+
func PackageIndexesToGlobalIndex(packages *types.Packages, urls []string) (index, error) {
181183

182-
// firststub of arduino-pdpm
184+
// first stub of arduino-pdpm
183185
var data index
184186
var err error
185187

@@ -210,5 +212,29 @@ func PackageIndexesToGlobalIndex(urls []string) (index, error) {
210212
data.Packages = append(data.Packages, entry)
211213
}
212214
}
215+
216+
for i, p := range data.Packages {
217+
for j, a := range p.Platforms {
218+
if packages != nil && packages.Packages[p.Name] != nil &&
219+
packages.Packages[p.Name].Platforms[a.Architecture] != nil &&
220+
packages.Packages[p.Name].Platforms[a.Architecture].Properties["version"] == a.Version {
221+
data.Packages[i].Platforms[j].installed = true
222+
}
223+
}
224+
}
225+
213226
return data, err
214227
}
228+
229+
func CompareVersions(fv string, sv string) int {
230+
v1, _ := semver.Make(fv)
231+
v2, _ := semver.Make(sv)
232+
if v1.EQ(v2) {
233+
return 0
234+
}
235+
if v1.GT(v2) {
236+
return 1
237+
} else {
238+
return -1
239+
}
240+
}
Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
package json_package_index
22

33
import (
4+
"github.com/stretchr/testify/require"
45
"path/filepath"
56
"testing"
6-
7-
"github.com/stretchr/testify/require"
87
)
98

109
func TestPropertiesPackageIndex(t *testing.T) {
1110

1211
var paths []string
1312
paths = append(paths, filepath.Join("testdata", "package_index.json"))
1413

15-
p, err := PackageIndexesToPropertiesMap(paths)
14+
p, err := PackageIndexesToPropertiesMap(nil, paths)
1615

1716
require.NoError(t, err)
1817

@@ -25,7 +24,7 @@ func TestPropertiesPackageIndexRemote(t *testing.T) {
2524
paths = append(paths, filepath.Join("testdata", "package_index.json"))
2625
paths = append(paths, "http://downloads.arduino.cc/packages/package_arduino.cc_linux_index.json")
2726

28-
p, err := PackageIndexesToPropertiesMap(paths)
27+
p, err := PackageIndexesToPropertiesMap(nil, paths)
2928

3029
require.NoError(t, err)
3130

@@ -38,7 +37,7 @@ func TestPackageIndexToGlobalIndex(t *testing.T) {
3837
var paths []string
3938
paths = append(paths, filepath.Join("testdata", "package_index.json"))
4039

41-
p, err := PackageIndexesToGlobalIndex(paths)
40+
p, err := PackageIndexesToGlobalIndex(nil, paths)
4241
require.NoError(t, err)
4342

4443
require.Equal(t, "Arduino", p.Packages[0].Maintainer)
@@ -48,18 +47,8 @@ func TestPackageIndexFoldersToPropertiesMap(t *testing.T) {
4847
var paths []string
4948
paths = append(paths, "testdata")
5049

51-
p, err := PackageIndexFoldersToPropertiesMap(paths)
50+
p, err := PackageIndexFoldersToPropertiesMap(nil, paths)
5251
require.NoError(t, err)
5352

5453
require.Equal(t, "{runtime.tools.avr-gcc-4.9.2-atmel3.5.3-arduino2.path}", p["arduino:avr:1.6.12"]["runtime.tools.avr-gcc.path"])
5554
}
56-
57-
func TestCoreDependencyProperty(t *testing.T) {
58-
var paths []string
59-
paths = append(paths, "testdata")
60-
61-
p, err := PackageIndexFoldersToPropertiesMap(paths)
62-
require.NoError(t, err)
63-
64-
require.Equal(t, "{runtime.tools.avr-gcc-4.9.2-atmel3.5.3-arduino2.path}", p["attiny:avr:1.0.2"]["runtime.tools.avr-gcc.path"])
65-
}

0 commit comments

Comments
 (0)