@@ -32,15 +32,17 @@ package json_package_index
3232import (
3333 "encoding/json"
3434 "errors"
35- "github.com/blang/semver"
3635 "io/ioutil"
3736 "net/http"
3837 "os"
3938 "path/filepath"
4039 "strings"
4140
41+ "github.com/blang/semver"
42+
4243 "github.com/arduino/arduino-builder/constants"
4344 _ "github.com/arduino/arduino-builder/i18n"
45+ "github.com/arduino/arduino-builder/types"
4446 properties "github.com/arduino/go-properties-map"
4547)
4648
@@ -52,14 +54,14 @@ type core struct {
5254 Name string `json:"archiveFileName"`
5355 Checksum string `json:"checksum"`
5456 destination string
57+ installed bool
5558 Dependencies []struct {
5659 Packager string `json:"packager"`
5760 Name string `json:"name"`
5861 Version string `json:"version"`
5962 } `json:"toolsDependencies"`
6063 CoreDependencies []struct {
6164 Packager string `json:"packager"`
62- Name string `json:"name"`
6365 } `json:"coreDependencies"`
6466}
6567
@@ -99,9 +101,10 @@ var systems = map[string]string{
99101
100102var globalProperties map [string ]properties.Map
101103
102- func PackageIndexFoldersToPropertiesMap (folders []string ) (map [string ]properties.Map , error ) {
104+ func PackageIndexFoldersToPropertiesMap (packages * types. Packages , folders []string ) (map [string ]properties.Map , error ) {
103105
104106 var paths []string
107+
105108 for _ , folder := range folders {
106109 folder , err := filepath .Abs (folder )
107110 if err != nil {
@@ -114,15 +117,15 @@ func PackageIndexFoldersToPropertiesMap(folders []string) (map[string]properties
114117 }
115118 }
116119 }
117- return PackageIndexesToPropertiesMap (paths )
120+ return PackageIndexesToPropertiesMap (packages , paths )
118121}
119122
120- func PackageIndexesToPropertiesMap (urls []string ) (map [string ]properties.Map , error ) {
123+ func PackageIndexesToPropertiesMap (packages * types. Packages , urls []string ) (map [string ]properties.Map , error ) {
121124
122125 globalProperties = make (map [string ]properties.Map )
123126 coreDependencyMap := make (map [string ]string )
124127
125- data , err := PackageIndexesToGlobalIndex (urls )
128+ data , err := PackageIndexesToGlobalIndex (packages , urls )
126129
127130 for _ , p := range data .Packages {
128131 for _ , a := range p .Platforms {
@@ -137,32 +140,32 @@ func PackageIndexesToPropertiesMap(urls []string) (map[string]properties.Map, er
137140 }
138141 for _ , coredep := range a .CoreDependencies {
139142 // inherit all the tools from latest coredep
140- version , err := findLatestCore (data , coredep .Packager , coredep .Name )
141143 if err == nil {
142144 coreDependencyMap [p .Name + ":" + a .Architecture + ":" + a .Version ] =
143- coredep .Packager + ":" + coredep . Name + ":" + version
145+ coredep .Packager + ":" + a . Architecture
144146 }
145147 }
146148 globalProperties [p .Name + ":" + a .Architecture + ":" + a .Version ] = localProperties .Clone ()
147149 }
148150 }
149151
150152 for idx , parentCore := range coreDependencyMap {
151- if (globalProperties [parentCore ]) != nil {
152- globalProperties [idx ] = globalProperties [parentCore ].Clone ()
153+ version , err := findLatestInstalledCore (data , strings .Split (parentCore , ":" )[0 ], strings .Split (parentCore , ":" )[1 ])
154+ if err == nil {
155+ globalProperties [idx ] = globalProperties [parentCore + ":" + version ].Clone ()
153156 }
154157 }
155158
156159 return globalProperties , err
157160}
158161
159- func findLatestCore (data index , Packager string , Name string ) (string , error ) {
162+ func findLatestInstalledCore (data index , Packager string , Name string ) (string , error ) {
160163 latest , _ := semver .Make ("0.0.0" )
161164 for _ , p := range data .Packages {
162165 for _ , a := range p .Platforms {
163166 if p .Name == Packager && a .Architecture == Name {
164167 test , _ := semver .Make (a .Version )
165- if test .GT (latest ) {
168+ if test .GT (latest ) && a . installed {
166169 latest = test
167170 }
168171 }
@@ -178,9 +181,9 @@ func findLatestCore(data index, Packager string, Name string) (string, error) {
178181 return latest .String (), err
179182}
180183
181- func PackageIndexesToGlobalIndex (urls []string ) (index , error ) {
184+ func PackageIndexesToGlobalIndex (packages * types. Packages , urls []string ) (index , error ) {
182185
183- // firststub of arduino-pdpm
186+ // first stub of arduino-pdpm
184187 var data index
185188 var err error
186189
@@ -211,5 +214,29 @@ func PackageIndexesToGlobalIndex(urls []string) (index, error) {
211214 data .Packages = append (data .Packages , entry )
212215 }
213216 }
217+
218+ for i , p := range data .Packages {
219+ for j , a := range p .Platforms {
220+ if packages != nil && packages .Packages [p .Name ] != nil &&
221+ packages .Packages [p .Name ].Platforms [a .Architecture ] != nil &&
222+ packages .Packages [p .Name ].Platforms [a .Architecture ].Properties ["version" ] == a .Version {
223+ data .Packages [i ].Platforms [j ].installed = true
224+ }
225+ }
226+ }
227+
214228 return data , err
215229}
230+
231+ func CompareVersions (fv string , sv string ) int {
232+ v1 , _ := semver .Make (fv )
233+ v2 , _ := semver .Make (sv )
234+ if v1 .EQ (v2 ) {
235+ return 0
236+ }
237+ if v1 .GT (v2 ) {
238+ return 1
239+ } else {
240+ return - 1
241+ }
242+ }
0 commit comments