Added gRPC functions to manage libraries in profiles (#3019) · arduino/arduino-cli@b53fd99 (original) (raw)
`@@ -43,18 +43,11 @@ func (s *arduinoCoreServerImpl) LibraryResolveDependencies(ctx context.Context,
`
43
43
`return nil, err
`
44
44
` }
`
45
45
``
46
``
`-
return libraryResolveDependencies(lme, li, req.GetName(), req.GetVersion(), req.GetDoNotUpdateInstalledLibraries())
`
47
``
`-
}
`
48
``
-
49
``
`-
func libraryResolveDependencies(lme *librariesmanager.Explorer, li *librariesindex.Index,
`
50
``
`-
reqName, reqVersion string, noOverwrite bool) (*rpc.LibraryResolveDependenciesResponse, error) {
`
51
``
`-
version, err := parseVersion(reqVersion)
`
52
``
`-
if err != nil {
`
53
``
`-
return nil, err
`
``
46
`+
var overrides []*librariesindex.Release
`
``
47
`+
if req.GetDoNotUpdateInstalledLibraries() {
`
``
48
`+
overrides = librariesGetAllInstalled(lme, li)
`
54
49
` }
`
55
``
-
56
``
`-
// Search the requested lib
`
57
``
`-
reqLibRelease, err := li.FindRelease(reqName, version)
`
``
50
`+
deps, err := libraryResolveDependencies(li, req.GetName(), req.GetVersion(), overrides)
`
58
51
`if err != nil {
`
59
52
`return nil, err
`
60
53
` }
`
`@@ -65,33 +58,6 @@ func libraryResolveDependencies(lme *librariesmanager.Explorer, li *librariesind
`
65
58
`installedLibs[lib.Library.Name] = lib.Library
`
66
59
` }
`
67
60
``
68
``
`-
// Resolve all dependencies...
`
69
``
`-
var overrides []*librariesindex.Release
`
70
``
`-
if noOverwrite {
`
71
``
`-
libs := lme.FindAllInstalled()
`
72
``
`-
libs = libs.FilterByVersionAndInstallLocation(nil, libraries.User)
`
73
``
`-
for _, lib := range libs {
`
74
``
`-
if release, err := li.FindRelease(lib.Name, lib.Version); err == nil {
`
75
``
`-
overrides = append(overrides, release)
`
76
``
`-
}
`
77
``
`-
}
`
78
``
`-
}
`
79
``
`-
deps := li.ResolveDependencies(reqLibRelease, overrides)
`
80
``
-
81
``
`-
// If no solution has been found
`
82
``
`-
if len(deps) == 0 {
`
83
``
`-
// Check if there is a problem with the first level deps
`
84
``
`-
for _, directDep := range reqLibRelease.GetDependencies() {
`
85
``
`-
if _, ok := li.Libraries[directDep.GetName()]; !ok {
`
86
``
`-
err := errors.New(i18n.Tr("dependency '%s' is not available", directDep.GetName()))
`
87
``
`-
return nil, &cmderrors.LibraryDependenciesResolutionFailedError{Cause: err}
`
88
``
`-
}
`
89
``
`-
}
`
90
``
-
91
``
`-
// Otherwise there is no possible solution, the depends field has an invalid formula
`
92
``
`-
return nil, &cmderrors.LibraryDependenciesResolutionFailedError{}
`
93
``
`-
}
`
94
``
-
95
61
`res := []*rpc.LibraryDependencyStatus{}
`
96
62
`for _, dep := range deps {
`
97
63
`// ...and add information on currently installed versions of the libraries
`
`@@ -115,3 +81,47 @@ func libraryResolveDependencies(lme *librariesmanager.Explorer, li *librariesind
`
115
81
` })
`
116
82
`return &rpc.LibraryResolveDependenciesResponse{Dependencies: res}, nil
`
117
83
`}
`
``
84
+
``
85
`+
func librariesGetAllInstalled(lme *librariesmanager.Explorer, li *librariesindex.Index) []*librariesindex.Release {
`
``
86
`+
var overrides []*librariesindex.Release
`
``
87
`+
libs := lme.FindAllInstalled()
`
``
88
`+
libs = libs.FilterByVersionAndInstallLocation(nil, libraries.User)
`
``
89
`+
for _, lib := range libs {
`
``
90
`+
if release, err := li.FindRelease(lib.Name, lib.Version); err == nil {
`
``
91
`+
overrides = append(overrides, release)
`
``
92
`+
}
`
``
93
`+
}
`
``
94
`+
return overrides
`
``
95
`+
}
`
``
96
+
``
97
`+
func libraryResolveDependencies(li *librariesindex.Index, reqName, reqVersion string, overrides []*librariesindex.Release) ([]*librariesindex.Release, error) {
`
``
98
`+
version, err := parseVersion(reqVersion)
`
``
99
`+
if err != nil {
`
``
100
`+
return nil, err
`
``
101
`+
}
`
``
102
+
``
103
`+
// Search the requested lib
`
``
104
`+
reqLibRelease, err := li.FindRelease(reqName, version)
`
``
105
`+
if err != nil {
`
``
106
`+
return nil, err
`
``
107
`+
}
`
``
108
+
``
109
`+
// Resolve all dependencies...
`
``
110
`+
deps := li.ResolveDependencies(reqLibRelease, overrides)
`
``
111
+
``
112
`+
// If no solution has been found
`
``
113
`+
if len(deps) == 0 {
`
``
114
`+
// Check if there is a problem with the first level deps
`
``
115
`+
for _, directDep := range reqLibRelease.GetDependencies() {
`
``
116
`+
if _, ok := li.Libraries[directDep.GetName()]; !ok {
`
``
117
`+
err := errors.New(i18n.Tr("dependency '%s' is not available", directDep.GetName()))
`
``
118
`+
return nil, &cmderrors.LibraryDependenciesResolutionFailedError{Cause: err}
`
``
119
`+
}
`
``
120
`+
}
`
``
121
+
``
122
`+
// Otherwise there is no possible solution, the depends field has an invalid formula
`
``
123
`+
return nil, &cmderrors.LibraryDependenciesResolutionFailedError{}
`
``
124
`+
}
`
``
125
+
``
126
`+
return deps, nil
`
``
127
`+
}
`