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

Commit 157e08d

Browse files
committed
Added support for git-libraries in profiles
1 parent e07a41b commit 157e08d

File tree

4 files changed

+112
-10
lines changed

4 files changed

+112
-10
lines changed

‎commands/instances.go‎

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,39 @@ func (s *arduinoCoreServerImpl) Init(req *rpc.InitRequest, stream rpc.ArduinoCor
386386
continue
387387
}
388388

389+
if libraryRef.GitURL != nil {
390+
uid := libraryRef.InternalUniqueIdentifier()
391+
libRoot := s.settings.ProfilesCacheDir().Join(uid)
392+
libDir := libRoot.Join(libraryRef.Library)
393+
394+
if !libDir.IsDir() {
395+
// Clone repo and install
396+
tmpDir, err := librariesmanager.CloneLibraryGitRepository(ctx, libraryRef.GitURL.String())
397+
if err != nil {
398+
taskCallback(&rpc.TaskProgress{Name: i18n.Tr("Error downloading library %s", libraryRef)})
399+
e := &cmderrors.FailedLibraryInstallError{Cause: err}
400+
responseError(e.GRPCStatus())
401+
continue
402+
}
403+
defer tmpDir.RemoveAll()
404+
405+
// Install library into profile cache
406+
if err := tmpDir.CopyDirTo(libDir); err != nil {
407+
taskCallback(&rpc.TaskProgress{Name: i18n.Tr("Error installing library %s", libraryRef)})
408+
e := &cmderrors.FailedLibraryInstallError{Cause: fmt.Errorf("copying library to profile cache: %w", err)}
409+
responseError(e.GRPCStatus())
410+
continue
411+
}
412+
}
413+
414+
lmb.AddLibrariesDir(librariesmanager.LibrariesDir{
415+
Path: libDir,
416+
Location: libraries.Profile,
417+
IsSingleLibrary: true,
418+
})
419+
continue
420+
}
421+
389422
uid := libraryRef.InternalUniqueIdentifier()
390423
libRoot := s.settings.ProfilesCacheDir().Join(uid)
391424
libDir := libRoot.Join(libraryRef.Library)

‎internal/arduino/sketch/profiles.go‎

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"errors"
2222
"fmt"
2323
"net/url"
24+
"path/filepath"
2425
"regexp"
2526
"strings"
2627

@@ -325,23 +326,39 @@ func (p *ProfilePlatformReference) UnmarshalYAML(unmarshal func(interface{}) err
325326
// ProfileLibraryReference is a reference to a library
326327
type ProfileLibraryReference struct {
327328
Library string
328-
InstallDir *paths.Path
329329
Version *semver.Version
330+
InstallDir *paths.Path
331+
GitURL *url.URL
330332
}
331333

332334
// UnmarshalYAML decodes a ProfileLibraryReference from YAML source.
333335
func (l *ProfileLibraryReference) UnmarshalYAML(unmarshal func(interface{}) error) error {
334336
var dataMap map[string]any
335337
if err := unmarshal(&dataMap); err == nil {
336-
if installDir, ok := dataMap["dir"]; !ok {
337-
return errors.New(i18n.Tr("invalid library reference: %s", dataMap))
338-
} else if installDir, ok := installDir.(string); !ok {
339-
return fmt.Errorf("%s: %s", i18n.Tr("invalid library reference: %s"), dataMap)
340-
} else {
341-
l.InstallDir = paths.New(installDir)
342-
l.Library = l.InstallDir.Base()
343-
return nil
338+
if installDir, ok := dataMap["dir"]; ok {
339+
if installDir, ok := installDir.(string); !ok {
340+
return fmt.Errorf("%s: %s", i18n.Tr("invalid library reference: %s"), dataMap)
341+
} else {
342+
l.InstallDir = paths.New(installDir)
343+
l.Library = l.InstallDir.Base()
344+
return nil
345+
}
346+
}
347+
if gitUrl, ok := dataMap["git"]; ok {
348+
if gitUrlStr, ok := gitUrl.(string); !ok {
349+
return fmt.Errorf("%s: %s", i18n.Tr("invalid git library reference: %s"), dataMap)
350+
} else if parsedUrl, err := url.Parse(gitUrlStr); err != nil {
351+
return fmt.Errorf("%s: %w", i18n.Tr("invalid git library URL:"), err)
352+
} else {
353+
l.GitURL = parsedUrl
354+
if l.Library = filepath.Base(parsedUrl.Path); l.Library == "" {
355+
l.Library = "lib"
356+
}
357+
l.Library = strings.TrimSuffix(l.Library, ".git")
358+
return nil
359+
}
344360
}
361+
return errors.New(i18n.Tr("invalid library reference: %s", dataMap))
345362
}
346363

347364
var data string
@@ -364,12 +381,18 @@ func (l *ProfileLibraryReference) AsYaml() string {
364381
if l.InstallDir != nil {
365382
return fmt.Sprintf(" - dir: %s\n", l.InstallDir)
366383
}
384+
if l.GitURL != nil {
385+
return fmt.Sprintf(" - git: %s\n", l.GitURL)
386+
}
367387
return fmt.Sprintf(" - %s (%s)\n", l.Library, l.Version)
368388
}
369389

370390
func (l *ProfileLibraryReference) String() string {
371391
if l.InstallDir != nil {
372-
return fmt.Sprintf("%s@dir:%s", l.Library, l.InstallDir)
392+
return "@dir:" + l.InstallDir.String()
393+
}
394+
if l.GitURL != nil {
395+
return "@git:" + l.GitURL.String()
373396
}
374397
return fmt.Sprintf("%s@%s", l.Library, l.Version)
375398
}
@@ -378,6 +401,16 @@ func (l *ProfileLibraryReference) String() string {
378401
func (l *ProfileLibraryReference) InternalUniqueIdentifier() string {
379402
f.Assert(l.InstallDir == nil,
380403
"InternalUniqueIdentifier should not be called for library references with an install directory")
404+
405+
if l.GitURL != nil {
406+
id := "git-" + utils.SanitizeName(l.GitURL.Host+l.GitURL.Path+"#"+l.GitURL.Fragment)
407+
if len(id) > 50 {
408+
id = id[:50]
409+
}
410+
h := sha256.Sum256([]byte(l.GitURL.String()))
411+
return id + "-" + hex.EncodeToString(h[:])[:8]
412+
}
413+
381414
id := l.String()
382415
h := sha256.Sum256([]byte(id))
383416
res := fmt.Sprintf("%s_%s", id, hex.EncodeToString(h[:])[:16])

‎internal/arduino/sketch/profiles_test.go‎

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,26 @@ func TestProjectFileLoading(t *testing.T) {
5353
require.Error(t, err)
5454
}
5555
}
56+
57+
func TestProjectFileLibraries(t *testing.T) {
58+
sketchProj := paths.New("testdata", "profiles", "profile_with_libraries.yml")
59+
proj, err := LoadProjectFile(sketchProj)
60+
require.NoError(t, err)
61+
require.Len(t, proj.Profiles, 1)
62+
prof := proj.Profiles[0]
63+
require.Len(t, prof.Libraries, 5)
64+
require.Equal(t, "FlashStorage@1.2.3", prof.Libraries[0].String())
65+
require.Equal(t, "@dir:/path/to/system/lib", prof.Libraries[1].String())
66+
require.Equal(t, "@dir:path/to/sketch/lib", prof.Libraries[2].String())
67+
require.Equal(t, "@git:https://github.com/username/HelloWorld.git#v2.13", prof.Libraries[3].String())
68+
require.Equal(t, "@git:https://github.com/username/HelloWorld.git#v2.14", prof.Libraries[4].String())
69+
require.Equal(t, "FlashStorage_1.2.3_e525d7c96b27788f", prof.Libraries[0].InternalUniqueIdentifier())
70+
require.Panics(t, func() { prof.Libraries[1].InternalUniqueIdentifier() })
71+
require.Panics(t, func() { prof.Libraries[2].InternalUniqueIdentifier() })
72+
require.Equal(t, "git-github.com_username_HelloWorld.git_v2.13-0c146203", prof.Libraries[3].InternalUniqueIdentifier())
73+
require.Equal(t, "git-github.com_username_HelloWorld.git_v2.14-49f5df7f", prof.Libraries[4].InternalUniqueIdentifier())
74+
75+
orig, err := sketchProj.ReadFile()
76+
require.NoError(t, err)
77+
require.Equal(t, string(orig), proj.AsYaml())
78+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
profiles:
2+
giga:
3+
fqbn: arduino:mbed_giga:giga
4+
platforms:
5+
- platform: arduino:mbed_giga (4.3.1)
6+
libraries:
7+
- FlashStorage (1.2.3)
8+
- dir: /path/to/system/lib
9+
- dir: path/to/sketch/lib
10+
- git: https://github.com/username/HelloWorld.git#v2.13
11+
- git: https://github.com/username/HelloWorld.git#v2.14
12+
13+
default_profile: giga_any

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /