Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit90c46fb

Browse files
cmagliealessio-perugini
authored andcommitted
Cache library scan results
1 parent3eecf20 commit90c46fb

File tree

2 files changed

+300
-17
lines changed

2 files changed

+300
-17
lines changed

‎internal/arduino/libraries/libraries.go‎

Lines changed: 231 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,11 @@
1616
package libraries
1717

1818
import (
19+
"bytes"
20+
"encoding/binary"
1921
"errors"
2022
"fmt"
23+
"io"
2124

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

96+
func (library*Library)MarshalBinary() []byte {
97+
buffer:=bytes.NewBuffer(make([]byte,0,4096))
98+
writeString:=func(instring) {
99+
inBytes:= []byte(in)
100+
binary.Write(buffer,binary.NativeEndian,uint16(len(inBytes)))
101+
buffer.Write(inBytes)
102+
}
103+
writeStringArray:=func(in []string) {
104+
binary.Write(buffer,binary.NativeEndian,uint16(len(in)))
105+
for_,i:=rangein {
106+
writeString(i)
107+
}
108+
}
109+
writeMap:=func(inmap[string]bool) {
110+
binary.Write(buffer,binary.NativeEndian,uint16(len(in)))
111+
fork,v:=rangein {
112+
writeString(k)
113+
binary.Write(buffer,binary.NativeEndian,v)
114+
}
115+
}
116+
writePath:=func(in*paths.Path) {
117+
ifin==nil {
118+
writeString("")
119+
}else {
120+
writeString(in.String())
121+
}
122+
}
123+
writeString(library.Name)
124+
writeString(library.Author)
125+
writeString(library.Maintainer)
126+
writeString(library.Sentence)
127+
writeString(library.Paragraph)
128+
writeString(library.Website)
129+
writeString(library.Category)
130+
writeStringArray(library.Architectures)
131+
writeStringArray(library.Types)
132+
writePath(library.InstallDir)
133+
writeString(library.DirName)
134+
writePath(library.SourceDir)
135+
writePath(library.UtilityDir)
136+
binary.Write(buffer,binary.NativeEndian,int32(library.Location))
137+
// library.ContainerPlatform *cores.PlatformRelease `json:""`
138+
binary.Write(buffer,binary.NativeEndian,int32(library.Layout))
139+
binary.Write(buffer,binary.NativeEndian,library.DotALinkage)
140+
binary.Write(buffer,binary.NativeEndian,library.Precompiled)
141+
binary.Write(buffer,binary.NativeEndian,library.PrecompiledWithSources)
142+
writeString(library.LDflags)
143+
binary.Write(buffer,binary.NativeEndian,library.IsLegacy)
144+
binary.Write(buffer,binary.NativeEndian,library.InDevelopment)
145+
writeString(library.Version.String())
146+
writeString(library.License)
147+
//writeStringArray(library.Properties.AsSlice())
148+
writeStringArray(library.Examples.AsStrings())
149+
writeStringArray(library.declaredHeaders)
150+
writeStringArray(library.sourceHeaders)
151+
writeMap(library.CompatibleWith)
152+
returnbuffer.Bytes()
153+
}
154+
155+
func (library*Library)UnmarshalBinary(in io.Reader)error {
156+
readString:=func() (string,error) {
157+
varlenuint16
158+
iferr:=binary.Read(in,binary.NativeEndian,&len);err!=nil {
159+
return"",err
160+
}
161+
res:=make([]byte,len)
162+
if_,err:=in.Read(res);err!=nil {
163+
return"",err
164+
}
165+
returnstring(res),nil
166+
}
167+
readStringArray:=func() ([]string,error) {
168+
varlenuint16
169+
iferr:=binary.Read(in,binary.NativeEndian,&len);err!=nil {
170+
returnnil,err
171+
}
172+
res:=make([]string,len)
173+
fori:=rangeres {
174+
varerrerror
175+
res[i],err=readString()
176+
iferr!=nil {
177+
returnnil,err
178+
}
179+
}
180+
returnres,nil
181+
}
182+
readMap:=func() (map[string]bool,error) {
183+
varlenuint16
184+
iferr:=binary.Read(in,binary.NativeEndian,&len);err!=nil {
185+
returnnil,err
186+
}
187+
res:=map[string]bool{}
188+
fori:=uint16(0);i<len;i++ {
189+
k,err:=readString()
190+
iferr!=nil {
191+
returnnil,err
192+
}
193+
varvbool
194+
iferr:=binary.Read(in,binary.NativeEndian,&v);err!=nil {
195+
returnnil,err
196+
}
197+
res[k]=v
198+
}
199+
returnres,nil
200+
}
201+
varerrerror
202+
library.Name,err=readString()
203+
iferr!=nil {
204+
returnerr
205+
}
206+
library.Author,err=readString()
207+
iferr!=nil {
208+
returnerr
209+
}
210+
library.Maintainer,err=readString()
211+
iferr!=nil {
212+
returnerr
213+
}
214+
library.Sentence,err=readString()
215+
iferr!=nil {
216+
returnerr
217+
}
218+
library.Paragraph,err=readString()
219+
iferr!=nil {
220+
returnerr
221+
}
222+
library.Website,err=readString()
223+
iferr!=nil {
224+
returnerr
225+
}
226+
library.Category,err=readString()
227+
iferr!=nil {
228+
returnerr
229+
}
230+
library.Architectures,err=readStringArray()
231+
iferr!=nil {
232+
returnerr
233+
}
234+
library.Types,err=readStringArray()
235+
iferr!=nil {
236+
returnerr
237+
}
238+
installDir,err:=readString()
239+
iferr!=nil {
240+
returnerr
241+
}
242+
library.InstallDir=paths.New(installDir)
243+
library.DirName,err=readString()
244+
iferr!=nil {
245+
returnerr
246+
}
247+
sourceDir,err:=readString()
248+
library.SourceDir=paths.New(sourceDir)
249+
iferr!=nil {
250+
returnerr
251+
}
252+
utilityDir,err:=readString()
253+
iferr!=nil {
254+
returnerr
255+
}
256+
library.UtilityDir=paths.New(utilityDir)
257+
varlocationint32
258+
iferr:=binary.Read(in,binary.NativeEndian,&location);err!=nil {
259+
returnerr
260+
}
261+
library.Location=LibraryLocation(location)
262+
// library.ContainerPlatform *cores.PlatformRelease `json:""`
263+
varlayoutint32
264+
iferr:=binary.Read(in,binary.NativeEndian,&layout);err!=nil {
265+
returnerr
266+
}
267+
library.Layout=LibraryLayout(layout)
268+
iferr:=binary.Read(in,binary.NativeEndian,&library.DotALinkage);err!=nil {
269+
returnerr
270+
}
271+
iferr:=binary.Read(in,binary.NativeEndian,&library.Precompiled);err!=nil {
272+
returnerr
273+
}
274+
iferr:=binary.Read(in,binary.NativeEndian,&library.PrecompiledWithSources);err!=nil {
275+
returnerr
276+
}
277+
library.LDflags,err=readString()
278+
iferr!=nil {
279+
returnerr
280+
}
281+
iferr:=binary.Read(in,binary.NativeEndian,&library.IsLegacy);err!=nil {
282+
returnerr
283+
}
284+
iferr:=binary.Read(in,binary.NativeEndian,&library.InDevelopment);err!=nil {
285+
returnerr
286+
}
287+
version,err:=readString()
288+
iferr!=nil {
289+
returnerr
290+
}
291+
library.Version=semver.MustParse(version)
292+
library.License,err=readString()
293+
iferr!=nil {
294+
returnerr
295+
}
296+
// props, err := readStringArray()
297+
// if err != nil {
298+
// return err
299+
// }
300+
// library.Properties, err = properties.LoadFromSlice(props)
301+
// if err != nil {
302+
// return err
303+
// }
304+
examples,err:=readStringArray()
305+
iferr!=nil {
306+
returnerr
307+
}
308+
library.Examples=paths.NewPathList(examples...)
309+
library.declaredHeaders,err=readStringArray()
310+
iferr!=nil {
311+
returnerr
312+
}
313+
library.sourceHeaders,err=readStringArray()
314+
iferr!=nil {
315+
returnerr
316+
}
317+
library.CompatibleWith,err=readMap()
318+
iferr!=nil {
319+
returnerr
320+
}
321+
returnnil
322+
}
323+
93324
// ToRPCLibrary converts this library into an rpc.Library
94325
func (library*Library)ToRPCLibrary() (*rpc.Library,error) {
95326
pathOrEmpty:=func(p*paths.Path)string {

‎internal/arduino/libraries/librariesmanager/librariesmanager.go‎

Lines changed: 69 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package librariesmanager
1717

1818
import (
19+
"encoding/binary"
1920
"errors"
2021
"fmt"
2122
"os"
@@ -201,30 +202,81 @@ func (lm *LibrariesManager) loadLibrariesFromDir(librariesDir *LibrariesDir) []*
201202

202203
librariesDir.scanned=true
203204

204-
varlibDirs paths.PathList
205-
iflibrariesDir.IsSingleLibrary {
206-
libDirs.Add(librariesDir.Path)
205+
varloadedLibs []*libraries.Library
206+
ifcacheFilePath:=librariesDir.Path.Join("libraries-loader-cache");cacheFilePath.Exist() {
207+
logrus.WithField("file",cacheFilePath).Info("Using library cache")
208+
209+
// Load lib cache
210+
cache,err:=cacheFilePath.Open()
211+
iferr!=nil {
212+
s:=status.Newf(codes.FailedPrecondition,"reading lib cache %[1]s: %[2]s",cacheFilePath,err)
213+
returnappend(statuses,s)
214+
}
215+
defercache.Close()
216+
varnint32
217+
iferr:=binary.Read(cache,binary.NativeEndian,&n);err!=nil {
218+
s:=status.Newf(codes.FailedPrecondition,"reading lib cache %[1]s: %[2]s",cacheFilePath,err)
219+
returnappend(statuses,s)
220+
}
221+
loadedLibs=make([]*libraries.Library,n)
222+
fori:=rangeloadedLibs {
223+
varlib libraries.Library
224+
iferr:=lib.UnmarshalBinary(cache);err!=nil {
225+
s:=status.Newf(codes.FailedPrecondition,"reading lib cache %[1]s: %[2]s",cacheFilePath,err)
226+
returnappend(statuses,s)
227+
}
228+
loadedLibs[i]=&lib
229+
}
207230
}else {
208-
d,err:=librariesDir.Path.ReadDir()
209-
ifos.IsNotExist(err) {
210-
returnstatuses
231+
varlibDirs paths.PathList
232+
iflibrariesDir.IsSingleLibrary {
233+
libDirs.Add(librariesDir.Path)
234+
}else {
235+
d,err:=librariesDir.Path.ReadDir()
236+
ifos.IsNotExist(err) {
237+
returnstatuses
238+
}
239+
iferr!=nil {
240+
s:=status.Newf(codes.FailedPrecondition,i18n.Tr("reading dir %[1]s: %[2]s",librariesDir.Path,err))
241+
returnappend(statuses,s)
242+
}
243+
d.FilterDirs()
244+
d.FilterOutHiddenFiles()
245+
libDirs=d
211246
}
247+
248+
for_,libDir:=rangelibDirs {
249+
library,err:=libraries.Load(libDir,librariesDir.Location)
250+
iferr!=nil {
251+
s:=status.Newf(codes.Internal,i18n.Tr("loading library from %[1]s: %[2]s",libDir,err))
252+
statuses=append(statuses,s)
253+
continue
254+
}
255+
loadedLibs=append(loadedLibs,library)
256+
}
257+
258+
// Write lib cache
259+
cache,err:=cacheFilePath.Create()
212260
iferr!=nil {
213-
s:=status.New(codes.FailedPrecondition,i18n.Tr("reading dir %[1]s: %[2]s",librariesDir.Path,err))
261+
s:=status.Newf(codes.FailedPrecondition,"writing lib cache %[1]s: %[2]s",cacheFilePath,err)
262+
returnappend(statuses,s)
263+
}
264+
defercache.Close()
265+
iferr:=binary.Write(cache,binary.NativeEndian,int32(len(loadedLibs)));err!=nil {
266+
cacheFilePath.Remove()
267+
s:=status.Newf(codes.FailedPrecondition,"writing lib cache %[1]s: %[2]s",cacheFilePath,err)
214268
returnappend(statuses,s)
215269
}
216-
d.FilterDirs()
217-
d.FilterOutHiddenFiles()
218-
libDirs=d
270+
for_,lib:=rangeloadedLibs {
271+
if_,err:=cache.Write(lib.MarshalBinary());err!=nil {
272+
cacheFilePath.Remove()
273+
s:=status.Newf(codes.FailedPrecondition,"writing lib cache %[1]s: %[2]s",cacheFilePath,err)
274+
returnappend(statuses,s)
275+
}
276+
}
219277
}
220278

221-
for_,libDir:=rangelibDirs {
222-
library,err:=libraries.Load(libDir,librariesDir.Location)
223-
iferr!=nil {
224-
s:=status.New(codes.Internal,i18n.Tr("loading library from %[1]s: %[2]s",libDir,err))
225-
statuses=append(statuses,s)
226-
continue
227-
}
279+
for_,library:=rangeloadedLibs {
228280
library.ContainerPlatform=librariesDir.PlatformRelease
229281
alternatives:=lm.libraries[library.Name]
230282
alternatives.Add(library)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp