diff --git a/internal/project/projectdata/packageindex.go b/internal/project/projectdata/packageindex.go index a47bfd0f..32548e11 100644 --- a/internal/project/projectdata/packageindex.go +++ b/internal/project/projectdata/packageindex.go @@ -17,6 +17,7 @@ package projectdata import ( "fmt" + "strings" clipackageindex "github.com/arduino/arduino-cli/arduino/cores/packageindex" "github.com/arduino/arduino-lint/internal/project/packageindex" @@ -115,33 +116,44 @@ func getPackageIndexData(interfaceObject map[string]interface{}, pointerPrefix s } for index, interfaceElement := range interfaceSlice { - object, ok := interfaceElement.(map[string]interface{}) - if !ok { - continue + interfaceElementData := PackageIndexData{ + JSONPointer: fmt.Sprintf("%s/%s/%v", pointerPrefix, dataKey, index), + Object: nil, } - var iD string - iDSuffix, ok := object[iDKey].(string) - if !ok { - continue + object, ok := interfaceElement.(map[string]interface{}) + if ok { + interfaceElementData.Object = object } - iD = iDPrefix + iDSuffix - if versionKey != "" { - iDVersion, ok := object[versionKey].(string) + + objectID := func() string { + if iDPrefix != "" && strings.HasPrefix(iDPrefix, pointerPrefix) { + // Parent object uses fallback ID, so this one must even if it was possible to generate a true suffix. + return interfaceElementData.JSONPointer + } + iD := iDPrefix + + iDSuffix, ok := object[iDKey].(string) if !ok { - continue + // Use fallback ID. + return interfaceElementData.JSONPointer + } + iD += iDSuffix + + if versionKey != "" { + iDVersion, ok := object[versionKey].(string) + if !ok { + // Use fallback ID. + return interfaceElementData.JSONPointer + } + iD += "@" + iDVersion } - iD = iD + "@" + iDVersion + + return iD } + interfaceElementData.ID = objectID() - data = append( - data, - PackageIndexData{ - ID: iD, - JSONPointer: fmt.Sprintf("%s/%s/%v", pointerPrefix, dataKey, index), - Object: object, - }, - ) + data = append(data, interfaceElementData) } return data diff --git a/internal/project/projectdata/packageindex_test.go b/internal/project/projectdata/packageindex_test.go index d3fc0696..ff81d4e8 100644 --- a/internal/project/projectdata/packageindex_test.go +++ b/internal/project/projectdata/packageindex_test.go @@ -117,6 +117,81 @@ func TestInitializeForPackageIndex(t *testing.T) { }, }, }, + { + testName: "Missing IDs", + path: packageIndexTestDataPath.Join("missing-ids", "package_foo_index.json"), + packageIndexAssertion: assert.NotNil, + packageIndexLoadErrorAssertion: assert.Nil, + packageIndexCLILoadErrorAssertion: assert.Nil, + packageIndexPackagesAssertion: assert.NotNil, + packageIndexPackagesDataAssertion: []PackageIndexData{ + { + ID: "/packages/0", + JSONPointer: "/packages/0", + }, + { + ID: "foopackager2", + JSONPointer: "/packages/1", + }, + }, + packageIndexPlatformsAssertion: assert.NotNil, + packageIndexPlatformsDataAssertion: []PackageIndexData{ + { + ID: "/packages/0/platforms/0", + JSONPointer: "/packages/0/platforms/0", + }, + { + ID: "/packages/0/platforms/1", + JSONPointer: "/packages/0/platforms/1", + }, + { + ID: "/packages/1/platforms/0", + JSONPointer: "/packages/1/platforms/0", + }, + { + ID: "/packages/1/platforms/1", + JSONPointer: "/packages/1/platforms/1", + }, + }, + packageIndexToolsAssertion: assert.NotNil, + packageIndexToolsDataAssertion: []PackageIndexData{ + { + ID: "/packages/1/tools/0", + JSONPointer: "/packages/1/tools/0", + }, + { + ID: "/packages/1/tools/1", + JSONPointer: "/packages/1/tools/1", + }, + { + ID: "foopackager2:bossac@1.9.1-arduino2", + JSONPointer: "/packages/1/tools/2", + }, + }, + packageIndexSystemsAssertion: assert.NotNil, + packageIndexSystemsDataAssertion: []PackageIndexData{ + { + ID: "/packages/1/tools/0/systems/0", + JSONPointer: "/packages/1/tools/0/systems/0", + }, + { + ID: "/packages/1/tools/0/systems/1", + JSONPointer: "/packages/1/tools/0/systems/1", + }, + { + ID: "/packages/1/tools/1/systems/0", + JSONPointer: "/packages/1/tools/1/systems/0", + }, + { + ID: "/packages/1/tools/1/systems/1", + JSONPointer: "/packages/1/tools/1/systems/1", + }, + { + ID: "/packages/1/tools/2/systems/0", + JSONPointer: "/packages/1/tools/2/systems/0", + }, + }, + }, { testName: "Invalid package index", path: packageIndexTestDataPath.Join("invalid-package-index", "package_foo_index.json"), diff --git a/internal/project/projectdata/testdata/packageindexes/missing-ids/package_foo_index.json b/internal/project/projectdata/testdata/packageindexes/missing-ids/package_foo_index.json new file mode 100644 index 00000000..516f758f --- /dev/null +++ b/internal/project/projectdata/testdata/packageindexes/missing-ids/package_foo_index.json @@ -0,0 +1,180 @@ +{ + "packages": [ + { + "maintainer": "Jane Developer", + "websiteURL": "https://github.com/janedeveloper/myboard", + "email": "jane@example.com", + "help": { + "online": "http://example.com/forum/myboard" + }, + "platforms": [ + { + "name": "My Board", + "architecture": "avr", + "version": "1.0.0", + "category": "Contributed", + "help": { + "online": "http://example.com/forum/myboard" + }, + "url": "https://janedeveloper.github.io/myboard/myboard-1.0.0.zip", + "archiveFileName": "myboard-1.0.0.zip", + "checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1", + "size": "15005", + "boards": [{ "name": "My Board" }, { "name": "My Board Pro" }], + "toolsDependencies": [ + { + "packager": "arduino", + "name": "avr-gcc", + "version": "4.8.1-arduino5" + }, + { + "packager": "arduino", + "name": "avrdude", + "version": "6.0.1-arduino5" + } + ] + }, + { + "name": "My Board", + "architecture": "avr", + "version": "1.0.1", + "category": "Contributed", + "help": { + "online": "http://example.com/forum/myboard" + }, + "url": "https://janedeveloper.github.io/myboard/myboard-1.0.1.zip", + "archiveFileName": "myboard-1.0.1.zip", + "checksum": "SHA-256:9c86ee28a7ce9fe33e8b07ec643316131e0031b0d22e63bb398902a5fdadbca9", + "size": "15125", + "boards": [{ "name": "My Board" }, { "name": "My Board Pro" }], + "toolsDependencies": [ + { + "packager": "arduino", + "name": "avr-gcc", + "version": "4.8.1-arduino5" + }, + { + "packager": "arduino", + "name": "avrdude", + "version": "6.0.1-arduino5" + } + ] + } + ], + "tools": [] + }, + { + "name": "foopackager2", + "maintainer": "Jane Developer", + "websiteURL": "https://github.com/janedeveloper/myboard", + "email": "jane@example.com", + "help": { + "online": "http://example.com/forum/myboard" + }, + "platforms": [ + { + "name": "My Board", + "version": "2.0.0", + "category": "Contributed", + "help": { + "online": "http://example.com/forum/myboard" + }, + "url": "https://janedeveloper.github.io/myboard/myboard-1.0.0.zip", + "archiveFileName": "myboard-1.0.0.zip", + "checksum": "SHA-256:ec3ff8a1dc96d3ba6f432b9b837a35fd4174a34b3d2927de1d51010e8b94f9f1", + "size": "15005", + "boards": [{ "name": "My Board" }, { "name": "My Board Pro" }], + "toolsDependencies": [ + { + "packager": "arduino", + "name": "avr-gcc", + "version": "4.8.1-arduino5" + }, + { + "packager": "arduino", + "name": "avrdude", + "version": "6.0.1-arduino5" + } + ] + }, + { + "name": "My Board", + "architecture": "mbed", + "category": "Contributed", + "help": { + "online": "http://example.com/forum/myboard" + }, + "url": "https://janedeveloper.github.io/myboard/myboard-1.0.1.zip", + "archiveFileName": "myboard-1.0.1.zip", + "checksum": "SHA-256:9c86ee28a7ce9fe33e8b07ec643316131e0031b0d22e63bb398902a5fdadbca9", + "size": "15125", + "boards": [{ "name": "My Board" }, { "name": "My Board Pro" }], + "toolsDependencies": [ + { + "packager": "arduino", + "name": "avr-gcc", + "version": "4.8.1-arduino5" + }, + { + "packager": "arduino", + "name": "avrdude", + "version": "6.0.1-arduino5" + } + ] + } + ], + "tools": [ + { + "version": "0.10.0-arduino1-static", + "systems": [ + { + "host": "i386-apple-darwin11", + "url": "http://downloads.arduino.cc/arduino.org/OpenOCD-0.10.0-nrf52-osx-static.tar.gz", + "archiveFileName": "OpenOCD-0.10.0-nrf52-osx-static.tar.gz", + "size": "1529841", + "checksum": "SHA-256:46bd02c1d42c5d94c4936e4d4a0ff29697b621840be9a6f882e316203122049d" + }, + { + "host": "x86_64-linux-gnu", + "url": "http://downloads.arduino.cc/arduino.org/OpenOCD-0.10.0-nrf52-linux64-static.tar.gz", + "archiveFileName": "OpenOCD-0.10.0-nrf52-linux64-static.tar.gz", + "size": "1777984", + "checksum": "SHA-256:1c9ae77930dd7377d8c13f84abe7307b67fdcd6da74cc1ce269a79e138e7a00a" + } + ] + }, + { + "name": "CMSIS", + "systems": [ + { + "host": "arm-linux-gnueabihf", + "url": "http://example.com", + "archiveFileName": "CMSIS-4.0.0.tar.bz2", + "checksum": "SHA-256:7d637d2d7a0c6bacc22065848a201db2fff124268e4a56868260d0f472b4bbb7", + "size": "17642623" + }, + { + "host": "i686-mingw32", + "url": "http://example.com", + "archiveFileName": "CMSIS-4.0.0.tar.bz2", + "checksum": "SHA-256:7d637d2d7a0c6bacc22065848a201db2fff124268e4a56868260d0f472b4bbb7", + "size": "17642623" + } + ] + }, + { + "name": "bossac", + "version": "1.9.1-arduino2", + "systems": [ + { + "url": "http://downloads.arduino.cc/tools/bossac-1.9.1-arduino2-linuxaarch64.tar.gz", + "archiveFileName": "bossac-1.9.1-arduino2-linuxaarch64.tar.gz", + "checksum": "SHA-256:c167fa0ea223966f4d21f5592da3888bcbfbae385be6c5c4e41f8abff35f5cb1", + "size": "442853" + } + ] + } + ] + } + ] +}