@@ -32,6 +32,7 @@ package json_package_index
3232import (
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
99100var 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+ }
0 commit comments