Skip to content

Commit

Permalink
Implemented library remove
Browse files Browse the repository at this point in the history
  • Loading branch information
cmaglie committed Aug 1, 2018
1 parent 4e01c30 commit b7fea65
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 13 deletions.
12 changes: 6 additions & 6 deletions arduino/libraries/librariesmanager/install.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
39 changes: 39 additions & 0 deletions arduino/libraries/librariesmanager/librariesmanager.go
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down Expand Up @@ -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)
}
40 changes: 40 additions & 0 deletions commands/commands_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand All @@ -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", "[email protected]")
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@")
Expand All @@ -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", "[email protected]")
require.Zero(t, exitCode, "exit code")
require.Contains(t, string(d), "[email protected]")
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", "[email protected]")
require.NotZero(t, exitCode, "exit code")
require.Contains(t, string(d), "[email protected]")
require.Contains(t, string(d), "not installed")

// Uninstall (with version)
exitCode, d = executeWithArgs(t, "lib", "uninstall", "[email protected]")
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", "[email protected]")
require.Zero(t, exitCode, "exit code")
require.Contains(t, string(d), "[email protected]")
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) {
Expand Down
22 changes: 15 additions & 7 deletions commands/lib/uninstall.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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")
Expand Down

0 comments on commit b7fea65

Please sign in to comment.