Skip to content

Commit 733c487

Browse files
Merge remote-tracking branch 'cmaglie/lib_caching_tests' into lib_caching
2 parents c78921a + fe44665 commit 733c487

File tree

3 files changed

+485
-19
lines changed

3 files changed

+485
-19
lines changed

internal/arduino/libraries/libraries.go

+376
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,11 @@
1616
package libraries
1717

1818
import (
19+
"encoding/binary"
1920
"errors"
2021
"fmt"
22+
"io"
23+
"path/filepath"
2124

2225
"github.com/arduino/arduino-cli/internal/arduino/cores"
2326
"github.com/arduino/arduino-cli/internal/arduino/globals"
@@ -90,6 +93,379 @@ func (library *Library) String() string {
9093
return library.Name + "@" + library.Version.String()
9194
}
9295

96+
func (library *Library) MarshalBinary(out io.Writer, prefix *paths.Path) error {
97+
writeString := func(in string) error {
98+
inBytes := []byte(in)
99+
if err := binary.Write(out, binary.NativeEndian, uint16(len(inBytes))); err != nil {
100+
return err
101+
}
102+
_, err := out.Write(inBytes)
103+
return err
104+
}
105+
writeStringArray := func(in []string) error {
106+
if err := binary.Write(out, binary.NativeEndian, uint16(len(in))); err != nil {
107+
return err
108+
}
109+
for _, i := range in {
110+
if err := writeString(i); err != nil {
111+
return err
112+
}
113+
}
114+
return nil
115+
}
116+
writeMap := func(in map[string]bool) error {
117+
if err := binary.Write(out, binary.NativeEndian, uint16(len(in))); err != nil {
118+
return err
119+
}
120+
for k, v := range in {
121+
if err := writeString(k); err != nil {
122+
return err
123+
}
124+
if err := binary.Write(out, binary.NativeEndian, v); err != nil {
125+
return err
126+
}
127+
}
128+
return nil
129+
}
130+
writeProperties := func(in *properties.Map) error {
131+
var keys []string
132+
if in != nil {
133+
keys = in.Keys()
134+
}
135+
if err := binary.Write(out, binary.NativeEndian, uint16(len(keys))); err != nil {
136+
return err
137+
}
138+
for _, k := range keys {
139+
v := in.Get(k)
140+
if err := writeString(k); err != nil {
141+
return err
142+
}
143+
if err := writeString(v); err != nil {
144+
return err
145+
}
146+
}
147+
return nil
148+
}
149+
writePath := func(in *paths.Path) error {
150+
if in == nil {
151+
return writeString("")
152+
} else if inside, err := in.IsInsideDir(prefix); err != nil {
153+
return err
154+
} else if !inside {
155+
return writeString(in.String())
156+
} else if p, err := in.RelFrom(prefix); err != nil {
157+
return err
158+
} else {
159+
return writeString(p.String())
160+
}
161+
}
162+
writePathList := func(in []*paths.Path) error {
163+
if err := binary.Write(out, binary.NativeEndian, uint16(len(in))); err != nil {
164+
return err
165+
}
166+
for _, p := range in {
167+
if err := writePath(p); err != nil {
168+
return err
169+
}
170+
}
171+
return nil
172+
}
173+
if err := writeString(library.Name); err != nil {
174+
return err
175+
}
176+
if err := writeString(library.Author); err != nil {
177+
return err
178+
}
179+
if err := writeString(library.Maintainer); err != nil {
180+
return err
181+
}
182+
if err := writeString(library.Sentence); err != nil {
183+
return err
184+
}
185+
if err := writeString(library.Paragraph); err != nil {
186+
return err
187+
}
188+
if err := writeString(library.Website); err != nil {
189+
return err
190+
}
191+
if err := writeString(library.Category); err != nil {
192+
return err
193+
}
194+
if err := writeStringArray(library.Architectures); err != nil {
195+
return err
196+
}
197+
if err := writeStringArray(library.Types); err != nil {
198+
return err
199+
}
200+
if err := writePath(library.InstallDir); err != nil {
201+
return err
202+
}
203+
if err := writeString(library.DirName); err != nil {
204+
return err
205+
}
206+
if err := writePath(library.SourceDir); err != nil {
207+
return err
208+
}
209+
if err := writePath(library.UtilityDir); err != nil {
210+
return err
211+
}
212+
if err := binary.Write(out, binary.NativeEndian, int32(library.Location)); err != nil {
213+
return err
214+
}
215+
// library.ContainerPlatform *cores.PlatformRelease `json:""`
216+
if err := binary.Write(out, binary.NativeEndian, int32(library.Layout)); err != nil {
217+
return err
218+
}
219+
if err := binary.Write(out, binary.NativeEndian, library.DotALinkage); err != nil {
220+
return err
221+
}
222+
if err := binary.Write(out, binary.NativeEndian, library.Precompiled); err != nil {
223+
return err
224+
}
225+
if err := binary.Write(out, binary.NativeEndian, library.PrecompiledWithSources); err != nil {
226+
return err
227+
}
228+
if err := writeString(library.LDflags); err != nil {
229+
return err
230+
}
231+
if err := binary.Write(out, binary.NativeEndian, library.IsLegacy); err != nil {
232+
return err
233+
}
234+
if err := binary.Write(out, binary.NativeEndian, library.InDevelopment); err != nil {
235+
return err
236+
}
237+
if err := writeString(library.Version.String()); err != nil {
238+
return err
239+
}
240+
if err := writeString(library.License); err != nil {
241+
return err
242+
}
243+
if err := writePathList(library.Examples); err != nil {
244+
return err
245+
}
246+
if err := writeStringArray(library.declaredHeaders); err != nil {
247+
return err
248+
}
249+
if err := writeStringArray(library.sourceHeaders); err != nil {
250+
return err
251+
}
252+
if err := writeMap(library.CompatibleWith); err != nil {
253+
return err
254+
}
255+
if err := writeProperties(library.Properties); err != nil {
256+
return err
257+
}
258+
259+
return nil
260+
}
261+
262+
func (library *Library) UnmarshalBinary(in io.Reader, prefix *paths.Path) error {
263+
readString := func() (string, error) {
264+
var len uint16
265+
if err := binary.Read(in, binary.NativeEndian, &len); err != nil {
266+
return "", err
267+
}
268+
res := make([]byte, len)
269+
if _, err := in.Read(res); err != nil {
270+
return "", err
271+
}
272+
return string(res), nil
273+
}
274+
readStringArray := func() ([]string, error) {
275+
var len uint16
276+
if err := binary.Read(in, binary.NativeEndian, &len); err != nil {
277+
return nil, err
278+
}
279+
if len == 0 {
280+
return nil, nil
281+
}
282+
res := make([]string, len)
283+
for i := range res {
284+
var err error
285+
res[i], err = readString()
286+
if err != nil {
287+
return nil, err
288+
}
289+
}
290+
return res, nil
291+
}
292+
readMap := func() (map[string]bool, error) {
293+
var len uint16
294+
if err := binary.Read(in, binary.NativeEndian, &len); err != nil {
295+
return nil, err
296+
}
297+
res := map[string]bool{}
298+
for range len {
299+
k, err := readString()
300+
if err != nil {
301+
return nil, err
302+
}
303+
var v bool
304+
if err := binary.Read(in, binary.NativeEndian, &v); err != nil {
305+
return nil, err
306+
}
307+
res[k] = v
308+
}
309+
return res, nil
310+
}
311+
readPath := func() (*paths.Path, error) {
312+
if p, err := readString(); err != nil {
313+
return nil, err
314+
} else if p == "" {
315+
return nil, nil
316+
} else if filepath.IsAbs(p) {
317+
return paths.New(p), nil
318+
} else {
319+
return prefix.Join(p), nil
320+
}
321+
}
322+
readPathList := func() (paths.PathList, error) {
323+
var len uint16
324+
if err := binary.Read(in, binary.NativeEndian, &len); err != nil {
325+
return nil, err
326+
}
327+
list := paths.NewPathList()
328+
for range len {
329+
if p, err := readPath(); err != nil {
330+
return nil, err
331+
} else {
332+
list.Add(p)
333+
}
334+
}
335+
return list, nil
336+
}
337+
readProperties := func() (*properties.Map, error) {
338+
var len uint16
339+
if err := binary.Read(in, binary.NativeEndian, &len); err != nil {
340+
return nil, err
341+
}
342+
props := properties.NewMap()
343+
for range len {
344+
if k, err := readString(); err != nil {
345+
return nil, err
346+
} else if v, err := readString(); err != nil {
347+
return nil, err
348+
} else {
349+
props.Set(k, v)
350+
}
351+
}
352+
return props, nil
353+
}
354+
var err error
355+
library.Name, err = readString()
356+
if err != nil {
357+
return err
358+
}
359+
library.Author, err = readString()
360+
if err != nil {
361+
return err
362+
}
363+
library.Maintainer, err = readString()
364+
if err != nil {
365+
return err
366+
}
367+
library.Sentence, err = readString()
368+
if err != nil {
369+
return err
370+
}
371+
library.Paragraph, err = readString()
372+
if err != nil {
373+
return err
374+
}
375+
library.Website, err = readString()
376+
if err != nil {
377+
return err
378+
}
379+
library.Category, err = readString()
380+
if err != nil {
381+
return err
382+
}
383+
library.Architectures, err = readStringArray()
384+
if err != nil {
385+
return err
386+
}
387+
library.Types, err = readStringArray()
388+
if err != nil {
389+
return err
390+
}
391+
library.InstallDir, err = readPath()
392+
if err != nil {
393+
return err
394+
}
395+
library.DirName, err = readString()
396+
if err != nil {
397+
return err
398+
}
399+
library.SourceDir, err = readPath()
400+
if err != nil {
401+
return err
402+
}
403+
library.UtilityDir, err = readPath()
404+
if err != nil {
405+
return err
406+
}
407+
var location int32
408+
if err := binary.Read(in, binary.NativeEndian, &location); err != nil {
409+
return err
410+
}
411+
library.Location = LibraryLocation(location)
412+
// library.ContainerPlatform *cores.PlatformRelease `json:""`
413+
var layout int32
414+
if err := binary.Read(in, binary.NativeEndian, &layout); err != nil {
415+
return err
416+
}
417+
library.Layout = LibraryLayout(layout)
418+
if err := binary.Read(in, binary.NativeEndian, &library.DotALinkage); err != nil {
419+
return err
420+
}
421+
if err := binary.Read(in, binary.NativeEndian, &library.Precompiled); err != nil {
422+
return err
423+
}
424+
if err := binary.Read(in, binary.NativeEndian, &library.PrecompiledWithSources); err != nil {
425+
return err
426+
}
427+
library.LDflags, err = readString()
428+
if err != nil {
429+
return err
430+
}
431+
if err := binary.Read(in, binary.NativeEndian, &library.IsLegacy); err != nil {
432+
return err
433+
}
434+
if err := binary.Read(in, binary.NativeEndian, &library.InDevelopment); err != nil {
435+
return err
436+
}
437+
version, err := readString()
438+
if err != nil {
439+
return err
440+
}
441+
library.Version = semver.MustParse(version)
442+
library.License, err = readString()
443+
if err != nil {
444+
return err
445+
}
446+
library.Examples, err = readPathList()
447+
if err != nil {
448+
return err
449+
}
450+
library.declaredHeaders, err = readStringArray()
451+
if err != nil {
452+
return err
453+
}
454+
library.sourceHeaders, err = readStringArray()
455+
if err != nil {
456+
return err
457+
}
458+
library.CompatibleWith, err = readMap()
459+
if err != nil {
460+
return err
461+
}
462+
library.Properties, err = readProperties()
463+
if err != nil {
464+
return err
465+
}
466+
return nil
467+
}
468+
93469
// ToRPCLibrary converts this library into an rpc.Library
94470
func (library *Library) ToRPCLibrary() (*rpc.Library, error) {
95471
pathOrEmpty := func(p *paths.Path) string {

0 commit comments

Comments
 (0)