From b7fea65230ac9bd27af935f8bf7197df599e1439 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Mon, 30 Jul 2018 14:46:21 +0200 Subject: [PATCH] Implemented library remove --- arduino/libraries/librariesmanager/install.go | 12 +++--- .../librariesmanager/librariesmanager.go | 39 ++++++++++++++++++ commands/commands_test.go | 40 +++++++++++++++++++ commands/lib/uninstall.go | 22 ++++++---- 4 files changed, 100 insertions(+), 13 deletions(-) diff --git a/arduino/libraries/librariesmanager/install.go b/arduino/libraries/librariesmanager/install.go index 523a52f6658..e84936b8c94 100644 --- a/arduino/libraries/librariesmanager/install.go +++ b/arduino/libraries/librariesmanager/install.go @@ -70,12 +70,12 @@ func (lm *LibrariesManager) Install(indexLibrary *librariesindex.Release) (*path return libPath, indexLibrary.Resource.Install(lm.DownloadsDir, libsDir, libPath) } -func (lm *LibrariesManager) removeRelease(libName string, r *libraries.Library) error { - libsDir := lm.getSketchbookLibrariesDir() - if libsDir == nil { - return fmt.Errorf("sketchbook folder not set") +// Uninstall removes a Library +func (lm *LibrariesManager) Uninstall(lib *libraries.Library) error { + if err := lib.Folder.RemoveAll(); err != nil { + return fmt.Errorf("removing lib directory: %s", err) } - libName = utils.SanitizeName(libName) - return libsDir.Join(libName).RemoveAll() + lm.Libraries[lib.Name].Remove(lib) + return nil } diff --git a/arduino/libraries/librariesmanager/librariesmanager.go b/arduino/libraries/librariesmanager/librariesmanager.go index cc27404da7e..dd2bc89fba4 100644 --- a/arduino/libraries/librariesmanager/librariesmanager.go +++ b/arduino/libraries/librariesmanager/librariesmanager.go @@ -74,6 +74,26 @@ func (alts *LibraryAlternatives) Add(library *libraries.Library) { alts.Alternatives = append(alts.Alternatives, library) } +// Remove removes the library from the alternatives +func (alts *LibraryAlternatives) Remove(library *libraries.Library) { + for i, lib := range alts.Alternatives { + if lib == library { + alts.Alternatives = append(alts.Alternatives[:i], alts.Alternatives[i+1:]...) + return + } + } +} + +// FindVersion returns the library mathching the provided version or nil if not found +func (alts *LibraryAlternatives) FindVersion(version string) *libraries.Library { + for _, lib := range alts.Alternatives { + if lib.Version == version { + return lib + } + } + return nil +} + // Names returns an array with all the names of the installed libraries. func (sc LibrariesManager) Names() []string { res := make([]string, len(sc.Libraries)) @@ -191,3 +211,22 @@ func (sc *LibrariesManager) LoadLibrariesFromDir(librariesDir *LibrariesDir) err } return nil } + +// FindByReference return the installed library matching the Reference +// name and version or if the version is the empty string the library +// installed in the sketchbook. +func (sc *LibrariesManager) FindByReference(libRef *librariesindex.Reference) *libraries.Library { + alternatives, have := sc.Libraries[libRef.Name] + if !have { + return nil + } + if libRef.Version == "" { + for _, candidate := range alternatives.Alternatives { + if candidate.Location == libraries.Sketchbook { + return candidate + } + } + return nil + } + return alternatives.FindVersion(libRef.Version) +} diff --git a/commands/commands_test.go b/commands/commands_test.go index 9a43ef0f04a..befd5f32d47 100644 --- a/commands/commands_test.go +++ b/commands/commands_test.go @@ -179,6 +179,7 @@ func TestLibDownloadAndInstall(t *testing.T) { exitCode, d := executeWithArgs(t, "core", "update-index") require.Zero(t, exitCode, "exit code") + // Download inexistent exitCode, d = executeWithArgs(t, "lib", "download", "inexistentLibrary", "--format", "json") require.NotZero(t, exitCode, "exit code") require.Contains(t, string(d), "library inexistentLibrary not found") @@ -187,15 +188,18 @@ func TestLibDownloadAndInstall(t *testing.T) { require.NotZero(t, exitCode, "exit code") require.Contains(t, string(d), "library inexistentLibrary not found") + // Download latest exitCode, d = executeWithArgs(t, "lib", "download", "Audio") require.Zero(t, exitCode, "exit code") require.Contains(t, string(d), "Audio@") require.Contains(t, string(d), "downloaded") + // Download non existent version exitCode, d = executeWithArgs(t, "lib", "download", "Audio@1.2.3-nonexistent") require.NotZero(t, exitCode, "exit code") require.Contains(t, string(d), "not found") + // Install latest exitCode, d = executeWithArgs(t, "lib", "install", "Audio") require.Zero(t, exitCode, "exit code") require.Contains(t, string(d), "Audio@") @@ -205,20 +209,56 @@ func TestLibDownloadAndInstall(t *testing.T) { require.Zero(t, exitCode, "exit code") require.Contains(t, string(d), "Audio") + // Already installed exitCode, d = executeWithArgs(t, "lib", "install", "Audio") require.NotZero(t, exitCode, "exit code") require.Contains(t, string(d), "Audio@") require.Contains(t, string(d), "already installed") + // Install another version exitCode, d = executeWithArgs(t, "lib", "install", "Audio@1.0.4") require.Zero(t, exitCode, "exit code") require.Contains(t, string(d), "Audio@1.0.4") require.Contains(t, string(d), "Installed") + exitCode, d = executeWithArgs(t, "lib", "list") + require.Zero(t, exitCode, "exit code") + require.Contains(t, string(d), "Audio") + require.Contains(t, string(d), "1.0.4") + + // Uninstall version not installed + exitCode, d = executeWithArgs(t, "lib", "uninstall", "Audio@1.0.3") + require.NotZero(t, exitCode, "exit code") + require.Contains(t, string(d), "Audio@1.0.3") + require.Contains(t, string(d), "not installed") + + // Uninstall (with version) + exitCode, d = executeWithArgs(t, "lib", "uninstall", "Audio@1.0.4") + require.Zero(t, exitCode, "exit code") + require.Contains(t, string(d), "Uninstalling") + require.Contains(t, string(d), "Audio") + require.Contains(t, string(d), "1.0.4") + exitCode, d = executeWithArgs(t, "lib", "list") + require.Zero(t, exitCode, "exit code") + require.NotContains(t, string(d), "Audio") + // Uninstall (without version) + exitCode, d = executeWithArgs(t, "lib", "install", "Audio@1.0.4") + require.Zero(t, exitCode, "exit code") + require.Contains(t, string(d), "Audio@1.0.4") + require.Contains(t, string(d), "Installed") exitCode, d = executeWithArgs(t, "lib", "list") require.Zero(t, exitCode, "exit code") require.Contains(t, string(d), "Audio") require.Contains(t, string(d), "1.0.4") + exitCode, d = executeWithArgs(t, "lib", "uninstall", "Audio") + require.Zero(t, exitCode, "exit code") + require.Contains(t, string(d), "Uninstalling") + require.Contains(t, string(d), "Audio") + require.Contains(t, string(d), "1.0.4") + exitCode, d = executeWithArgs(t, "lib", "list") + require.Zero(t, exitCode, "exit code") + require.NotContains(t, string(d), "Audio") + } func updateCoreIndex(t *testing.T) { diff --git a/commands/lib/uninstall.go b/commands/lib/uninstall.go index aec786b5ac7..4f6cc507208 100644 --- a/commands/lib/uninstall.go +++ b/commands/lib/uninstall.go @@ -30,7 +30,11 @@ package lib import ( - "fmt" + "os" + + "github.com/bcmi-labs/arduino-cli/common/formatter" + + "github.com/bcmi-labs/arduino-cli/commands" "github.com/bcmi-labs/arduino-cli/arduino/libraries/librariesindex" "github.com/sirupsen/logrus" @@ -57,13 +61,17 @@ func initUninstallCommand() *cobra.Command { func runUninstallCommand(cmd *cobra.Command, args []string) { logrus.Info("Executing `arduino lib uninstall`") - logrus.Info("Preparing") + lm := commands.InitLibraryManager(nil) libRefs := librariesindex.ParseArgs(args) - - for _, library := range libRefs { - // TODO: Implement uninstall - - fmt.Println("Would uninstall: ", library) + for _, libRef := range libRefs { + lib := lm.FindByReference(libRef) + if lib == nil { + formatter.PrintErrorMessage("Library not installed: " + libRef.String()) + os.Exit(commands.ErrGeneric) + } else { + formatter.Print("Uninstalling " + lib.String()) + lm.Uninstall(lib) + } } logrus.Info("Done")