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

`+

}

`