Skip to content

Commit 901fcd2

Browse files
committed
Add slice entries to projectdata for all package index components
In order to provide rule results, it's necessary to identify even completely invalid package index components. The previous behavior of skipping these components did not allow that.
1 parent f271d5f commit 901fcd2

File tree

3 files changed

+287
-20
lines changed

3 files changed

+287
-20
lines changed

Diff for: internal/project/projectdata/packageindex.go

+32-20
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package projectdata
1717

1818
import (
1919
"fmt"
20+
"strings"
2021

2122
clipackageindex "github.com/arduino/arduino-cli/arduino/cores/packageindex"
2223
"github.com/arduino/arduino-lint/internal/project/packageindex"
@@ -115,33 +116,44 @@ func getPackageIndexData(interfaceObject map[string]interface{}, pointerPrefix s
115116
}
116117

117118
for index, interfaceElement := range interfaceSlice {
118-
object, ok := interfaceElement.(map[string]interface{})
119-
if !ok {
120-
continue
119+
interfaceElementData := PackageIndexData{
120+
JSONPointer: fmt.Sprintf("%s/%s/%v", pointerPrefix, dataKey, index),
121+
Object: nil,
121122
}
122123

123-
var iD string
124-
iDSuffix, ok := object[iDKey].(string)
125-
if !ok {
126-
continue
124+
object, ok := interfaceElement.(map[string]interface{})
125+
if ok {
126+
interfaceElementData.Object = object
127127
}
128-
iD = iDPrefix + iDSuffix
129-
if versionKey != "" {
130-
iDVersion, ok := object[versionKey].(string)
128+
129+
objectID := func() string {
130+
if iDPrefix != "" && strings.HasPrefix(iDPrefix, pointerPrefix) {
131+
// Parent object uses fallback ID, so this one must even if it was possible to generate a true suffix.
132+
return interfaceElementData.JSONPointer
133+
}
134+
iD := iDPrefix
135+
136+
iDSuffix, ok := object[iDKey].(string)
131137
if !ok {
132-
continue
138+
// Use fallback ID.
139+
return interfaceElementData.JSONPointer
140+
}
141+
iD += iDSuffix
142+
143+
if versionKey != "" {
144+
iDVersion, ok := object[versionKey].(string)
145+
if !ok {
146+
// Use fallback ID.
147+
return interfaceElementData.JSONPointer
148+
}
149+
iD += "@" + iDVersion
133150
}
134-
iD = iD + "@" + iDVersion
151+
152+
return iD
135153
}
154+
interfaceElementData.ID = objectID()
136155

137-
data = append(
138-
data,
139-
PackageIndexData{
140-
ID: iD,
141-
JSONPointer: fmt.Sprintf("%s/%s/%v", pointerPrefix, dataKey, index),
142-
Object: object,
143-
},
144-
)
156+
data = append(data, interfaceElementData)
145157
}
146158

147159
return data

Diff for: internal/project/projectdata/packageindex_test.go

+75
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,81 @@ func TestInitializeForPackageIndex(t *testing.T) {
117117
},
118118
},
119119
},
120+
{
121+
testName: "Missing IDs",
122+
path: packageIndexTestDataPath.Join("missing-ids", "package_foo_index.json"),
123+
packageIndexAssertion: assert.NotNil,
124+
packageIndexLoadErrorAssertion: assert.Nil,
125+
packageIndexCLILoadErrorAssertion: assert.Nil,
126+
packageIndexPackagesAssertion: assert.NotNil,
127+
packageIndexPackagesDataAssertion: []PackageIndexData{
128+
{
129+
ID: "/packages/0",
130+
JSONPointer: "/packages/0",
131+
},
132+
{
133+
ID: "foopackager2",
134+
JSONPointer: "/packages/1",
135+
},
136+
},
137+
packageIndexPlatformsAssertion: assert.NotNil,
138+
packageIndexPlatformsDataAssertion: []PackageIndexData{
139+
{
140+
ID: "/packages/0/platforms/0",
141+
JSONPointer: "/packages/0/platforms/0",
142+
},
143+
{
144+
ID: "/packages/0/platforms/1",
145+
JSONPointer: "/packages/0/platforms/1",
146+
},
147+
{
148+
ID: "/packages/1/platforms/0",
149+
JSONPointer: "/packages/1/platforms/0",
150+
},
151+
{
152+
ID: "/packages/1/platforms/1",
153+
JSONPointer: "/packages/1/platforms/1",
154+
},
155+
},
156+
packageIndexToolsAssertion: assert.NotNil,
157+
packageIndexToolsDataAssertion: []PackageIndexData{
158+
{
159+
ID: "/packages/1/tools/0",
160+
JSONPointer: "/packages/1/tools/0",
161+
},
162+
{
163+
ID: "/packages/1/tools/1",
164+
JSONPointer: "/packages/1/tools/1",
165+
},
166+
{
167+
ID: "foopackager2:[email protected]",
168+
JSONPointer: "/packages/1/tools/2",
169+
},
170+
},
171+
packageIndexSystemsAssertion: assert.NotNil,
172+
packageIndexSystemsDataAssertion: []PackageIndexData{
173+
{
174+
ID: "/packages/1/tools/0/systems/0",
175+
JSONPointer: "/packages/1/tools/0/systems/0",
176+
},
177+
{
178+
ID: "/packages/1/tools/0/systems/1",
179+
JSONPointer: "/packages/1/tools/0/systems/1",
180+
},
181+
{
182+
ID: "/packages/1/tools/1/systems/0",
183+
JSONPointer: "/packages/1/tools/1/systems/0",
184+
},
185+
{
186+
ID: "/packages/1/tools/1/systems/1",
187+
JSONPointer: "/packages/1/tools/1/systems/1",
188+
},
189+
{
190+
ID: "/packages/1/tools/2/systems/0",
191+
JSONPointer: "/packages/1/tools/2/systems/0",
192+
},
193+
},
194+
},
120195
{
121196
testName: "Invalid package index",
122197
path: packageIndexTestDataPath.Join("invalid-package-index", "package_foo_index.json"),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
{
2+
"packages": [
3+
{
4+
"maintainer": "Jane Developer",
5+
"websiteURL": "https://github.com/janedeveloper/myboard",
6+
"email": "[email protected]",
7+
"help": {
8+
"online": "http://example.com/forum/myboard"
9+
},
10+
"platforms": [
11+
{
12+
"name": "My Board",
13+
"architecture": "avr",
14+
"version": "1.0.0",
15+
"category": "Contributed",
16+
"help": {
17+
"online": "http://example.com/forum/myboard"
18+
},
19+
"url": "https://janedeveloper.github.io/myboard/myboard-1.0.0.zip",
20+
"archiveFileName": "myboard-1.0.0.zip",
21+
"checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1",
22+
"size": "15005",
23+
"boards": [{ "name": "My Board" }, { "name": "My Board Pro" }],
24+
"toolsDependencies": [
25+
{
26+
"packager": "arduino",
27+
"name": "avr-gcc",
28+
"version": "4.8.1-arduino5"
29+
},
30+
{
31+
"packager": "arduino",
32+
"name": "avrdude",
33+
"version": "6.0.1-arduino5"
34+
}
35+
]
36+
},
37+
{
38+
"name": "My Board",
39+
"architecture": "avr",
40+
"version": "1.0.1",
41+
"category": "Contributed",
42+
"help": {
43+
"online": "http://example.com/forum/myboard"
44+
},
45+
"url": "https://janedeveloper.github.io/myboard/myboard-1.0.1.zip",
46+
"archiveFileName": "myboard-1.0.1.zip",
47+
"checksum": "SHA-256:9c86ee28a7ce9fe33e8b07ec643316131e0031b0d22e63bb398902a5fdadbca9",
48+
"size": "15125",
49+
"boards": [{ "name": "My Board" }, { "name": "My Board Pro" }],
50+
"toolsDependencies": [
51+
{
52+
"packager": "arduino",
53+
"name": "avr-gcc",
54+
"version": "4.8.1-arduino5"
55+
},
56+
{
57+
"packager": "arduino",
58+
"name": "avrdude",
59+
"version": "6.0.1-arduino5"
60+
}
61+
]
62+
}
63+
],
64+
"tools": []
65+
},
66+
{
67+
"name": "foopackager2",
68+
"maintainer": "Jane Developer",
69+
"websiteURL": "https://github.com/janedeveloper/myboard",
70+
"email": "[email protected]",
71+
"help": {
72+
"online": "http://example.com/forum/myboard"
73+
},
74+
"platforms": [
75+
{
76+
"name": "My Board",
77+
"version": "2.0.0",
78+
"category": "Contributed",
79+
"help": {
80+
"online": "http://example.com/forum/myboard"
81+
},
82+
"url": "https://janedeveloper.github.io/myboard/myboard-1.0.0.zip",
83+
"archiveFileName": "myboard-1.0.0.zip",
84+
"checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1",
85+
"size": "15005",
86+
"boards": [{ "name": "My Board" }, { "name": "My Board Pro" }],
87+
"toolsDependencies": [
88+
{
89+
"packager": "arduino",
90+
"name": "avr-gcc",
91+
"version": "4.8.1-arduino5"
92+
},
93+
{
94+
"packager": "arduino",
95+
"name": "avrdude",
96+
"version": "6.0.1-arduino5"
97+
}
98+
]
99+
},
100+
{
101+
"name": "My Board",
102+
"architecture": "mbed",
103+
"category": "Contributed",
104+
"help": {
105+
"online": "http://example.com/forum/myboard"
106+
},
107+
"url": "https://janedeveloper.github.io/myboard/myboard-1.0.1.zip",
108+
"archiveFileName": "myboard-1.0.1.zip",
109+
"checksum": "SHA-256:9c86ee28a7ce9fe33e8b07ec643316131e0031b0d22e63bb398902a5fdadbca9",
110+
"size": "15125",
111+
"boards": [{ "name": "My Board" }, { "name": "My Board Pro" }],
112+
"toolsDependencies": [
113+
{
114+
"packager": "arduino",
115+
"name": "avr-gcc",
116+
"version": "4.8.1-arduino5"
117+
},
118+
{
119+
"packager": "arduino",
120+
"name": "avrdude",
121+
"version": "6.0.1-arduino5"
122+
}
123+
]
124+
}
125+
],
126+
"tools": [
127+
{
128+
"version": "0.10.0-arduino1-static",
129+
"systems": [
130+
{
131+
"host": "i386-apple-darwin11",
132+
"url": "http://downloads.arduino.cc/arduino.org/OpenOCD-0.10.0-nrf52-osx-static.tar.gz",
133+
"archiveFileName": "OpenOCD-0.10.0-nrf52-osx-static.tar.gz",
134+
"size": "1529841",
135+
"checksum": "SHA-256:46bd02c1d42c5d94c4936e4d4a0ff29697b621840be9a6f882e316203122049d"
136+
},
137+
{
138+
"host": "x86_64-linux-gnu",
139+
"url": "http://downloads.arduino.cc/arduino.org/OpenOCD-0.10.0-nrf52-linux64-static.tar.gz",
140+
"archiveFileName": "OpenOCD-0.10.0-nrf52-linux64-static.tar.gz",
141+
"size": "1777984",
142+
"checksum": "SHA-256:1c9ae77930dd7377d8c13f84abe7307b67fdcd6da74cc1ce269a79e138e7a00a"
143+
}
144+
]
145+
},
146+
{
147+
"name": "CMSIS",
148+
"systems": [
149+
{
150+
"host": "arm-linux-gnueabihf",
151+
"url": "http://example.com",
152+
"archiveFileName": "CMSIS-4.0.0.tar.bz2",
153+
"checksum": "SHA-256:7d637d2d7a0c6bacc22065848a201db2fff124268e4a56868260d0f472b4bbb7",
154+
"size": "17642623"
155+
},
156+
{
157+
"host": "i686-mingw32",
158+
"url": "http://example.com",
159+
"archiveFileName": "CMSIS-4.0.0.tar.bz2",
160+
"checksum": "SHA-256:7d637d2d7a0c6bacc22065848a201db2fff124268e4a56868260d0f472b4bbb7",
161+
"size": "17642623"
162+
}
163+
]
164+
},
165+
{
166+
"name": "bossac",
167+
"version": "1.9.1-arduino2",
168+
"systems": [
169+
{
170+
"url": "http://downloads.arduino.cc/tools/bossac-1.9.1-arduino2-linuxaarch64.tar.gz",
171+
"archiveFileName": "bossac-1.9.1-arduino2-linuxaarch64.tar.gz",
172+
"checksum": "SHA-256:c167fa0ea223966f4d21f5592da3888bcbfbae385be6c5c4e41f8abff35f5cb1",
173+
"size": "442853"
174+
}
175+
]
176+
}
177+
]
178+
}
179+
]
180+
}

0 commit comments

Comments
 (0)