Skip to content

Installer improvements #89

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Nov 9, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 12 additions & 3 deletions Gopkg.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 0 additions & 4 deletions Gopkg.toml
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,6 @@
name = "github.com/codeclysm/cc"
version = "1.2.1"

[[constraint]]
name = "github.com/codeclysm/extract"
version = "1.1.1"

[[constraint]]
branch = "master"
name = "github.com/mitchellh/go-homedir"
Expand Down
5 changes: 5 additions & 0 deletions arduino/cores/cores.go
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,11 @@ func (release *PlatformRelease) GetLibrariesDir() *paths.Path {
return nil
}

// IsInstalled returns true if the PlatformRelease is installed
func (release *PlatformRelease) IsInstalled() bool {
return release.InstallDir != nil
}

func (release *PlatformRelease) String() string {
version := ""
if release.Version != nil {
Expand Down
6 changes: 5 additions & 1 deletion arduino/resources/install.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,13 @@
package resources

import (
"context"
"fmt"
"os"

paths "github.com/arduino/go-paths-helper"
"github.com/codeclysm/extract"
"go.bug.st/cleanup"
)

// Install installs the resource in three steps:
Expand Down Expand Up @@ -54,7 +56,9 @@ func (release *DownloadResource) Install(downloadDir, tempPath, destDir *paths.P
defer file.Close()

// Extract into temp directory
if err := extract.Archive(file, tempDir.String(), nil); err != nil {
ctx, cancel := cleanup.InterruptableContext(context.Background())
defer cancel()
if err := extract.Archive(ctx, file, tempDir.String(), nil); err != nil {
return fmt.Errorf("extracting archive: %s", err)
}

Expand Down
2 changes: 1 addition & 1 deletion commands/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ func InitPackageManager() *packagemanager.PackageManager {
Config.DownloadsDir(),
Config.DataDir.Join("tmp"))

for _, URL := range configs.BoardManagerAdditionalUrls {
for _, URL := range Config.BoardManagerAdditionalUrls {
if err := pm.LoadPackageIndex(URL); err != nil {
formatter.PrintError(err, "Failed to load "+URL.String()+" package index.\n"+
"Try updating all indexes with `"+AppName+" core update-index`.")
Expand Down
36 changes: 36 additions & 0 deletions commands/commands_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -426,6 +426,42 @@ func TestCompileCommands(t *testing.T) {
require.True(t, paths.New("anothertest", "test2.hex").Exist())
}

func TestInvalidCoreURL(t *testing.T) {
defer makeTempDataDir(t)()
defer makeTempSketchbookDir(t)()

tmp, err := paths.MkTempDir("", "")
require.NoError(t, err, "making temporary dir")
defer tmp.RemoveAll()

configFile := tmp.Join("cli-config.yml")
configFile.WriteFile([]byte(`
board_manager:
additional_urls:
- http://www.example.com/package_example_index.json
`))

require.NoError(t, currDataDir.MkdirAll())
err = currDataDir.Join("package_index.json").WriteFile([]byte(`{ "packages": [] }`))
require.NoError(t, err, "Writing empty json index file")
err = currDataDir.Join("package_example_index.json").WriteFile([]byte(`{ "packages": [] }`))
require.NoError(t, err, "Writing empty json index file")

// Empty cores list
exitCode, d := executeWithArgs(t, "--config-file", configFile.String(), "core", "list")
require.Zero(t, exitCode, "exit code")
require.Empty(t, strings.TrimSpace(string(d)))

// Empty cores list
exitCode, _ = executeWithArgs(t, "--config-file", configFile.String(), "core", "update-index")
require.NotZero(t, exitCode, "exit code")

// Empty cores list
exitCode, d = executeWithArgs(t, "--config-file", configFile.String(), "core", "list")
require.Zero(t, exitCode, "exit code")
require.Empty(t, strings.TrimSpace(string(d)))
}

func TestCoreCommands(t *testing.T) {
defer makeTempDataDir(t)()
defer makeTempSketchbookDir(t)()
Expand Down
32 changes: 16 additions & 16 deletions commands/core/download.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,31 +60,30 @@ func downloadPlatformByRef(pm *packagemanager.PackageManager, platformsRef *pack
formatter.PrintError(err, "Could not determine platform dependencies")
os.Exit(commands.ErrBadCall)
}

// Check if all tools have a flavor available for the current OS
downloadPlatform(pm, platform)
for _, tool := range tools {
if tool.GetCompatibleFlavour() == nil {
formatter.PrintErrorMessage("The tool " + tool.String() + " is not available for the current OS")
os.Exit(commands.ErrGeneric)
}
downloadTool(pm, tool)
}
}

// Download tools
for _, tool := range tools {
DownloadToolRelease(pm, tool)
}
func downloadPlatform(pm *packagemanager.PackageManager, platformRelease *cores.PlatformRelease) {
// Download platform
resp, err := pm.DownloadPlatformRelease(platformRelease)
download(resp, err, platformRelease.String())
}

// Download cores
formatter.Print("Downloading " + platform.String() + "...")
resp, err := pm.DownloadPlatformRelease(platform)
download(resp, err, platform.String())
func downloadTool(pm *packagemanager.PackageManager, tool *cores.ToolRelease) {
// Check if tool has a flavor available for the current OS
if tool.GetCompatibleFlavour() == nil {
formatter.PrintErrorMessage("The tool " + tool.String() + " is not available for the current OS")
os.Exit(commands.ErrGeneric)
}

logrus.Info("Done")
DownloadToolRelease(pm, tool)
}

// DownloadToolRelease downloads a ToolRelease
func DownloadToolRelease(pm *packagemanager.PackageManager, toolRelease *cores.ToolRelease) {
formatter.Print("Downloading " + toolRelease.String() + "...")
resp, err := pm.DownloadToolRelease(toolRelease)
download(resp, err, toolRelease.String())
}
Expand All @@ -98,6 +97,7 @@ func download(d *downloader.Downloader, err error, label string) {
formatter.Print(label + " already downloaded")
return
}
formatter.Print("Downloading " + label + "...")
formatter.DownloadProgressBar(d, label)
if d.Error() != nil {
formatter.PrintError(d.Error(), "Error downloading "+label)
Expand Down
53 changes: 34 additions & 19 deletions commands/core/install.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ func runInstallCommand(cmd *cobra.Command, args []string) {
pm := commands.InitPackageManagerWithoutBundles()

for _, platformRef := range platformsRefs {
downloadPlatformByRef(pm, platformRef)
installPlatformByRef(pm, platformRef)
}

Expand All @@ -64,19 +63,39 @@ func installPlatformByRef(pm *packagemanager.PackageManager, platformRef *packag
os.Exit(commands.ErrBadCall)
}

// TODO: Check install prerequisites here
installPlatform(pm, platform, tools)
}

// TODO: Download here
func installPlatform(pm *packagemanager.PackageManager, platformRelease *cores.PlatformRelease, requiredTools []*cores.ToolRelease) {
log := pm.Log.WithField("platform", platformRelease)

for _, tool := range tools {
InstallToolRelease(pm, tool)
// Prerequisite checks before install
if platformRelease.IsInstalled() {
log.Warn("Platform already installed")
formatter.Print("Platform " + platformRelease.String() + " already installed")
return
}
toolsToInstall := []*cores.ToolRelease{}
for _, tool := range requiredTools {
if tool.IsInstalled() {
log.WithField("tool", tool).Warn("Tool already installed")
formatter.Print("Tool " + tool.String() + " already installed")
} else {
toolsToInstall = append(toolsToInstall, tool)
}
}
installPlatformRelease(pm, platform)
}

func installPlatformRelease(pm *packagemanager.PackageManager, platformRelease *cores.PlatformRelease) {
log := pm.Log.WithField("platform", platformRelease)
// Package download
for _, tool := range toolsToInstall {
downloadTool(pm, tool)
}
downloadPlatform(pm, platformRelease)

for _, tool := range toolsToInstall {
InstallToolRelease(pm, tool)
}

// Are we installing or upgrading?
platform := platformRelease.Platform
installed := pm.GetInstalledPlatformRelease(platform)
if installed == nil {
Expand All @@ -87,12 +106,8 @@ func installPlatformRelease(pm *packagemanager.PackageManager, platformRelease *
formatter.Print("Updating " + installed.String() + " with " + platformRelease.String() + "...")
}

// Install
err := pm.InstallPlatform(platformRelease)
if os.IsExist(err) {
log.Warn("Platform already installed")
formatter.Print("Platform " + platformRelease.String() + " already installed")
return
}
if err != nil {
log.WithError(err).Error("Cannot install platform")
formatter.PrintError(err, "Cannot install platform")
Expand Down Expand Up @@ -125,15 +140,15 @@ func installPlatformRelease(pm *packagemanager.PackageManager, platformRelease *
func InstallToolRelease(pm *packagemanager.PackageManager, toolRelease *cores.ToolRelease) {
log := pm.Log.WithField("Tool", toolRelease)

log.Info("Installing tool")
formatter.Print("Installing " + toolRelease.String())

err := pm.InstallTool(toolRelease)
if os.IsExist(err) {
if toolRelease.IsInstalled() {
log.Warn("Tool already installed")
formatter.Print("Tool " + toolRelease.String() + " already installed")
return
}

log.Info("Installing tool")
formatter.Print("Installing " + toolRelease.String() + "...")
err := pm.InstallTool(toolRelease)
if err != nil {
log.WithError(err).Warn("Cannot install tool")
formatter.PrintError(err, "Cannot install tool: "+toolRelease.String())
Expand Down
2 changes: 1 addition & 1 deletion commands/core/uninstall.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ func uninstallToolRelease(pm *packagemanager.PackageManager, toolRelease *cores.
log := pm.Log.WithField("Tool", toolRelease)

log.Info("Uninstalling tool")
formatter.Print("Uninstalling " + toolRelease.String())
formatter.Print("Uninstalling " + toolRelease.String() + "...")

if err := pm.UninstallTool(toolRelease); err != nil {
log.WithError(err).Error("Error uninstalling")
Expand Down
25 changes: 17 additions & 8 deletions commands/core/update_index.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ import (

"go.bug.st/downloader"

"github.com/arduino/arduino-cli/arduino/cores/packageindex"
"github.com/arduino/arduino-cli/commands"
"github.com/arduino/arduino-cli/common/formatter"
"github.com/arduino/arduino-cli/configs"
"github.com/arduino/go-paths-helper"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
Expand All @@ -50,42 +50,51 @@ func runUpdateIndexCommand(cmd *cobra.Command, args []string) {
}

func updateIndexes() {
for _, URL := range configs.BoardManagerAdditionalUrls {
for _, URL := range commands.Config.BoardManagerAdditionalUrls {
updateIndex(URL)
}
}

// TODO: This should be in packagemanager......
func updateIndex(URL *url.URL) {
logrus.WithField("url", URL).Print("Updating index")
indexDirPath := commands.Config.IndexesDir()
coreIndexPath := indexDirPath.Join(path.Base(URL.Path))

tmpFile, err := ioutil.TempFile("", "")
if err != nil {
formatter.PrintError(err, "Error creating temp file for download")
os.Exit(commands.ErrGeneric)
}
defer os.Remove(tmpFile.Name())
tmpFile.Close()
if err := tmpFile.Close(); err != nil {
formatter.PrintError(err, "Error creating temp file for download")
os.Exit(commands.ErrGeneric)
}
tmp := paths.New(tmpFile.Name())
defer tmp.Remove()

d, err := downloader.Download(tmpFile.Name(), URL.String())
d, err := downloader.Download(tmp.String(), URL.String())
if err != nil {
formatter.PrintError(err, "Error downloading index "+URL.String())
os.Exit(commands.ErrNetwork)
}
indexDirPath := commands.Config.IndexesDir()
coreIndexPath := indexDirPath.Join(path.Base(URL.Path))
formatter.DownloadProgressBar(d, "Updating index: "+coreIndexPath.Base())
if d.Error() != nil {
formatter.PrintError(d.Error(), "Error downloading index "+URL.String())
os.Exit(commands.ErrNetwork)
}

if _, err := packageindex.LoadIndex(tmp); err != nil {
formatter.PrintError(err, "Invalid package index in "+URL.String())
os.Exit(commands.ErrGeneric)
}

if err := indexDirPath.MkdirAll(); err != nil {
formatter.PrintError(err, "Can't create data directory "+indexDirPath.String())
os.Exit(commands.ErrGeneric)
}

if err := paths.New(tmpFile.Name()).CopyTo(coreIndexPath); err != nil {
if err := tmp.CopyTo(coreIndexPath); err != nil {
formatter.PrintError(err, "Error saving downloaded index "+URL.String())
os.Exit(commands.ErrGeneric)
}
Expand Down
25 changes: 0 additions & 25 deletions configs/boards_manager.go

This file was deleted.

Loading