Skip to content

Commit b7fea65

Browse files
committed
Implemented library remove
1 parent 4e01c30 commit b7fea65

File tree

4 files changed

+100
-13
lines changed

4 files changed

+100
-13
lines changed

arduino/libraries/librariesmanager/install.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,12 @@ func (lm *LibrariesManager) Install(indexLibrary *librariesindex.Release) (*path
7070
return libPath, indexLibrary.Resource.Install(lm.DownloadsDir, libsDir, libPath)
7171
}
7272

73-
func (lm *LibrariesManager) removeRelease(libName string, r *libraries.Library) error {
74-
libsDir := lm.getSketchbookLibrariesDir()
75-
if libsDir == nil {
76-
return fmt.Errorf("sketchbook folder not set")
73+
// Uninstall removes a Library
74+
func (lm *LibrariesManager) Uninstall(lib *libraries.Library) error {
75+
if err := lib.Folder.RemoveAll(); err != nil {
76+
return fmt.Errorf("removing lib directory: %s", err)
7777
}
7878

79-
libName = utils.SanitizeName(libName)
80-
return libsDir.Join(libName).RemoveAll()
79+
lm.Libraries[lib.Name].Remove(lib)
80+
return nil
8181
}

arduino/libraries/librariesmanager/librariesmanager.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,26 @@ func (alts *LibraryAlternatives) Add(library *libraries.Library) {
7474
alts.Alternatives = append(alts.Alternatives, library)
7575
}
7676

77+
// Remove removes the library from the alternatives
78+
func (alts *LibraryAlternatives) Remove(library *libraries.Library) {
79+
for i, lib := range alts.Alternatives {
80+
if lib == library {
81+
alts.Alternatives = append(alts.Alternatives[:i], alts.Alternatives[i+1:]...)
82+
return
83+
}
84+
}
85+
}
86+
87+
// FindVersion returns the library mathching the provided version or nil if not found
88+
func (alts *LibraryAlternatives) FindVersion(version string) *libraries.Library {
89+
for _, lib := range alts.Alternatives {
90+
if lib.Version == version {
91+
return lib
92+
}
93+
}
94+
return nil
95+
}
96+
7797
// Names returns an array with all the names of the installed libraries.
7898
func (sc LibrariesManager) Names() []string {
7999
res := make([]string, len(sc.Libraries))
@@ -191,3 +211,22 @@ func (sc *LibrariesManager) LoadLibrariesFromDir(librariesDir *LibrariesDir) err
191211
}
192212
return nil
193213
}
214+
215+
// FindByReference return the installed library matching the Reference
216+
// name and version or if the version is the empty string the library
217+
// installed in the sketchbook.
218+
func (sc *LibrariesManager) FindByReference(libRef *librariesindex.Reference) *libraries.Library {
219+
alternatives, have := sc.Libraries[libRef.Name]
220+
if !have {
221+
return nil
222+
}
223+
if libRef.Version == "" {
224+
for _, candidate := range alternatives.Alternatives {
225+
if candidate.Location == libraries.Sketchbook {
226+
return candidate
227+
}
228+
}
229+
return nil
230+
}
231+
return alternatives.FindVersion(libRef.Version)
232+
}

commands/commands_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ func TestLibDownloadAndInstall(t *testing.T) {
179179
exitCode, d := executeWithArgs(t, "core", "update-index")
180180
require.Zero(t, exitCode, "exit code")
181181

182+
// Download inexistent
182183
exitCode, d = executeWithArgs(t, "lib", "download", "inexistentLibrary", "--format", "json")
183184
require.NotZero(t, exitCode, "exit code")
184185
require.Contains(t, string(d), "library inexistentLibrary not found")
@@ -187,15 +188,18 @@ func TestLibDownloadAndInstall(t *testing.T) {
187188
require.NotZero(t, exitCode, "exit code")
188189
require.Contains(t, string(d), "library inexistentLibrary not found")
189190

191+
// Download latest
190192
exitCode, d = executeWithArgs(t, "lib", "download", "Audio")
191193
require.Zero(t, exitCode, "exit code")
192194
require.Contains(t, string(d), "Audio@")
193195
require.Contains(t, string(d), "downloaded")
194196

197+
// Download non existent version
195198
exitCode, d = executeWithArgs(t, "lib", "download", "[email protected]")
196199
require.NotZero(t, exitCode, "exit code")
197200
require.Contains(t, string(d), "not found")
198201

202+
// Install latest
199203
exitCode, d = executeWithArgs(t, "lib", "install", "Audio")
200204
require.Zero(t, exitCode, "exit code")
201205
require.Contains(t, string(d), "Audio@")
@@ -205,20 +209,56 @@ func TestLibDownloadAndInstall(t *testing.T) {
205209
require.Zero(t, exitCode, "exit code")
206210
require.Contains(t, string(d), "Audio")
207211

212+
// Already installed
208213
exitCode, d = executeWithArgs(t, "lib", "install", "Audio")
209214
require.NotZero(t, exitCode, "exit code")
210215
require.Contains(t, string(d), "Audio@")
211216
require.Contains(t, string(d), "already installed")
212217

218+
// Install another version
213219
exitCode, d = executeWithArgs(t, "lib", "install", "[email protected]")
214220
require.Zero(t, exitCode, "exit code")
215221
require.Contains(t, string(d), "[email protected]")
216222
require.Contains(t, string(d), "Installed")
223+
exitCode, d = executeWithArgs(t, "lib", "list")
224+
require.Zero(t, exitCode, "exit code")
225+
require.Contains(t, string(d), "Audio")
226+
require.Contains(t, string(d), "1.0.4")
227+
228+
// Uninstall version not installed
229+
exitCode, d = executeWithArgs(t, "lib", "uninstall", "[email protected]")
230+
require.NotZero(t, exitCode, "exit code")
231+
require.Contains(t, string(d), "[email protected]")
232+
require.Contains(t, string(d), "not installed")
233+
234+
// Uninstall (with version)
235+
exitCode, d = executeWithArgs(t, "lib", "uninstall", "[email protected]")
236+
require.Zero(t, exitCode, "exit code")
237+
require.Contains(t, string(d), "Uninstalling")
238+
require.Contains(t, string(d), "Audio")
239+
require.Contains(t, string(d), "1.0.4")
240+
exitCode, d = executeWithArgs(t, "lib", "list")
241+
require.Zero(t, exitCode, "exit code")
242+
require.NotContains(t, string(d), "Audio")
217243

244+
// Uninstall (without version)
245+
exitCode, d = executeWithArgs(t, "lib", "install", "[email protected]")
246+
require.Zero(t, exitCode, "exit code")
247+
require.Contains(t, string(d), "[email protected]")
248+
require.Contains(t, string(d), "Installed")
218249
exitCode, d = executeWithArgs(t, "lib", "list")
219250
require.Zero(t, exitCode, "exit code")
220251
require.Contains(t, string(d), "Audio")
221252
require.Contains(t, string(d), "1.0.4")
253+
exitCode, d = executeWithArgs(t, "lib", "uninstall", "Audio")
254+
require.Zero(t, exitCode, "exit code")
255+
require.Contains(t, string(d), "Uninstalling")
256+
require.Contains(t, string(d), "Audio")
257+
require.Contains(t, string(d), "1.0.4")
258+
exitCode, d = executeWithArgs(t, "lib", "list")
259+
require.Zero(t, exitCode, "exit code")
260+
require.NotContains(t, string(d), "Audio")
261+
222262
}
223263

224264
func updateCoreIndex(t *testing.T) {

commands/lib/uninstall.go

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@
3030
package lib
3131

3232
import (
33-
"fmt"
33+
"os"
34+
35+
"github.com/bcmi-labs/arduino-cli/common/formatter"
36+
37+
"github.com/bcmi-labs/arduino-cli/commands"
3438

3539
"github.com/bcmi-labs/arduino-cli/arduino/libraries/librariesindex"
3640
"github.com/sirupsen/logrus"
@@ -57,13 +61,17 @@ func initUninstallCommand() *cobra.Command {
5761
func runUninstallCommand(cmd *cobra.Command, args []string) {
5862
logrus.Info("Executing `arduino lib uninstall`")
5963

60-
logrus.Info("Preparing")
64+
lm := commands.InitLibraryManager(nil)
6165
libRefs := librariesindex.ParseArgs(args)
62-
63-
for _, library := range libRefs {
64-
// TODO: Implement uninstall
65-
66-
fmt.Println("Would uninstall: ", library)
66+
for _, libRef := range libRefs {
67+
lib := lm.FindByReference(libRef)
68+
if lib == nil {
69+
formatter.PrintErrorMessage("Library not installed: " + libRef.String())
70+
os.Exit(commands.ErrGeneric)
71+
} else {
72+
formatter.Print("Uninstalling " + lib.String())
73+
lm.Uninstall(lib)
74+
}
6775
}
6876

6977
logrus.Info("Done")

0 commit comments

Comments
 (0)