From 09255254d712da69428b264450919a62518e2381 Mon Sep 17 00:00:00 2001 From: Federico Fissore Date: Wed, 8 Apr 2015 13:59:29 +0200 Subject: [PATCH] Preliminary command line support to boards manager and library manager --- .../libraries/ui/LibraryInstaller.java | 28 +++--- app/src/processing/app/Base.java | 93 +++++++++++++++++-- .../libraries/LibrariesIndex.java | 13 +++ .../packages/ContributionInstaller.java | 3 + .../packages/ContributionsIndex.java | 74 ++++++++++++++- .../app/helpers/CommandlineParser.java | 90 +++++++++++++----- build/linux/dist/arduino | 2 +- 7 files changed, 256 insertions(+), 47 deletions(-) diff --git a/app/src/cc/arduino/contributions/libraries/ui/LibraryInstaller.java b/app/src/cc/arduino/contributions/libraries/ui/LibraryInstaller.java index d099f3a7a..a99b090e6 100644 --- a/app/src/cc/arduino/contributions/libraries/ui/LibraryInstaller.java +++ b/app/src/cc/arduino/contributions/libraries/ui/LibraryInstaller.java @@ -28,20 +28,20 @@ */ package cc.arduino.contributions.libraries.ui; -import static processing.app.I18n._; - -import java.io.File; -import java.io.IOException; -import java.net.URL; - -import processing.app.BaseNoGui; -import processing.app.helpers.FileUtils; import cc.arduino.contributions.libraries.ContributedLibrary; import cc.arduino.contributions.libraries.LibrariesIndexer; import cc.arduino.contributions.packages.DownloadableContributionsDownloader; import cc.arduino.utils.ArchiveExtractor; import cc.arduino.utils.MultiStepProgress; import cc.arduino.utils.Progress; +import processing.app.BaseNoGui; +import processing.app.helpers.FileUtils; + +import java.io.File; +import java.io.IOException; +import java.net.URL; + +import static processing.app.I18n._; public class LibraryInstaller { @@ -93,7 +93,7 @@ public class LibraryInstaller { outputFile.delete(); if (!tmpFile.renameTo(outputFile)) throw new Exception( - _("An error occurred while updating libraries index!")); + _("An error occurred while updating libraries index!")); // Step 2: Rescan index rescanLibraryIndex(progress); @@ -133,20 +133,18 @@ public class LibraryInstaller { // Step 3: Remove replaced library and move installed one to the correct location // TODO: Fix progress bar... - if (replacedLib != null && !replacedLib.isReadOnly()) { - remove(replacedLib); - } + remove(replacedLib); File destFolder = new File(libsFolder, lib.getName().replaceAll(" ", "_")); tmpFolder.renameTo(destFolder); progress.stepDone(); - + // Step 4: Rescan index rescanLibraryIndex(progress); } public void remove(ContributedLibrary lib) throws IOException { - if (lib.isReadOnly()) { - throw new IllegalArgumentException("Can't delete a built-in library"); + if (lib == null || lib.isReadOnly()) { + return; } final MultiStepProgress progress = new MultiStepProgress(2); diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index c212dde77..eb20a88d0 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -22,9 +22,17 @@ package processing.app; +import cc.arduino.contributions.VersionHelper; +import cc.arduino.contributions.libraries.ContributedLibrary; +import cc.arduino.contributions.libraries.LibrariesIndexer; +import cc.arduino.contributions.libraries.ui.LibraryInstaller; import cc.arduino.contributions.libraries.ui.LibraryManagerUI; -import cc.arduino.packages.DiscoveryManager; +import cc.arduino.contributions.packages.ContributedPlatform; +import cc.arduino.contributions.packages.ContributionInstaller; +import cc.arduino.contributions.packages.ContributionsIndexer; import cc.arduino.contributions.packages.ui.ContributionManagerUI; +import cc.arduino.packages.DiscoveryManager; +import cc.arduino.utils.Progress; import cc.arduino.view.SplashScreenHelper; import com.google.common.base.Predicate; import com.google.common.base.Predicates; @@ -296,7 +304,78 @@ public class Base { // them. Preferences.save(); - if (parser.isVerifyOrUploadMode()) { + if (parser.isInstallBoard()) { + ContributionsIndexer indexer = new ContributionsIndexer(BaseNoGui.getSettingsFolder()); + ContributionInstaller installer = new ContributionInstaller(indexer) { + private String lastStatus = ""; + @Override + protected void onProgress(Progress progress) { + if (!lastStatus.equals(progress.getStatus())) { + System.out.println(progress.getStatus()); + } + lastStatus = progress.getStatus(); + } + }; + installer.updateIndex(); + indexer.parseIndex(); + indexer.syncWithFilesystem(getHardwareFolder()); + + String[] boardToInstallParts = parser.getBoardToInstall().split(":"); + + ContributedPlatform selected = indexer.getIndex().findPlatform(boardToInstallParts[0], boardToInstallParts[1], VersionHelper.valueOf(boardToInstallParts[2]).toString()); + if (selected == null) { + System.out.println(_("Selected board is not available")); + System.exit(1); + } + + ContributedPlatform installed = indexer.getIndex().getInstalled(boardToInstallParts[0], boardToInstallParts[1]); + + if (!selected.isReadOnly()) { + installer.install(selected); + } + + if (installed != null && !installed.isReadOnly()) { + installer.remove(installed); + } + + System.exit(0); + + } else if (parser.isInstallLibrary()) { + LibrariesIndexer indexer = new LibrariesIndexer(BaseNoGui.getSettingsFolder()); + LibraryInstaller installer = new LibraryInstaller(indexer) { + private String lastStatus = ""; + @Override + protected void onProgress(Progress progress) { + if (!lastStatus.equals(progress.getStatus())) { + System.out.println(progress.getStatus()); + } + lastStatus = progress.getStatus(); + } + }; + indexer.parseIndex(); + BaseNoGui.onBoardOrPortChange(); + indexer.setSketchbookLibrariesFolder(BaseNoGui.getSketchbookLibrariesFolder()); + indexer.setLibrariesFolders(BaseNoGui.getLibrariesPath()); + installer.updateIndex(); + + String[] libraryToInstallParts = parser.getLibraryToInstall().split(":"); + + ContributedLibrary selected = indexer.getIndex().find(libraryToInstallParts[0], VersionHelper.valueOf(libraryToInstallParts[1]).toString()); + if (selected == null) { + System.out.println(_("Selected library is not available")); + System.exit(1); + } + + ContributedLibrary installed = indexer.getIndex().getInstalled(libraryToInstallParts[0]); + if (selected.isReadOnly()) { + installer.remove(installed); + } else { + installer.install(selected, installed); + } + + System.exit(0); + + } else if (parser.isVerifyOrUploadMode()) { splashScreenHelper.close(); // Set verbosity for command line build Preferences.set("build.verbose", "" + parser.isDoVerboseBuild()); @@ -1525,11 +1604,11 @@ public class Base { String complaining = I18n .format( _("The sketch \"{0}\" cannot be used.\n" - + "Sketch names must contain only basic letters and numbers\n" - + "(ASCII-only with no spaces, " - + "and it cannot start with a number).\n" - + "To get rid of this message, remove the sketch from\n" - + "{1}"), name, entry.getAbsolutePath()); + + "Sketch names must contain only basic letters and numbers\n" + + "(ASCII-only with no spaces, " + + "and it cannot start with a number).\n" + + "To get rid of this message, remove the sketch from\n" + + "{1}"), name, entry.getAbsolutePath()); showMessage(_("Ignoring sketch with bad name"), complaining); } return false; diff --git a/arduino-core/src/cc/arduino/contributions/libraries/LibrariesIndex.java b/arduino-core/src/cc/arduino/contributions/libraries/LibrariesIndex.java index ef9a362f0..483de6dd3 100644 --- a/arduino-core/src/cc/arduino/contributions/libraries/LibrariesIndex.java +++ b/arduino-core/src/cc/arduino/contributions/libraries/LibrariesIndex.java @@ -29,6 +29,8 @@ package cc.arduino.contributions.libraries; +import cc.arduino.contributions.DownloadableContributionBuiltInAtTheBottomComparator; +import cc.arduino.contributions.filters.InstalledPredicate; import com.google.common.base.Predicate; import com.google.common.collect.Collections2; @@ -93,4 +95,15 @@ public abstract class LibrariesIndex { return types; } + + public ContributedLibrary getInstalled(String name) { + List installedReleases = new LinkedList(Collections2.filter(find(name), new InstalledPredicate())); + Collections.sort(installedReleases, new DownloadableContributionBuiltInAtTheBottomComparator()); + + if (installedReleases.isEmpty()) { + return null; + } + + return installedReleases.get(0); + } } diff --git a/arduino-core/src/cc/arduino/contributions/packages/ContributionInstaller.java b/arduino-core/src/cc/arduino/contributions/packages/ContributionInstaller.java index 396569726..915a8c535 100644 --- a/arduino-core/src/cc/arduino/contributions/packages/ContributionInstaller.java +++ b/arduino-core/src/cc/arduino/contributions/packages/ContributionInstaller.java @@ -205,6 +205,9 @@ public class ContributionInstaller { } public List remove(ContributedPlatform platform) { + if (platform == null || platform.isReadOnly()) { + return new LinkedList(); + } List errors = new LinkedList(); FileUtils.recursiveDelete(platform.getInstalledFolder()); platform.setInstalled(false); diff --git a/arduino-core/src/cc/arduino/contributions/packages/ContributionsIndex.java b/arduino-core/src/cc/arduino/contributions/packages/ContributionsIndex.java index 2c262f216..d7c19227c 100644 --- a/arduino-core/src/cc/arduino/contributions/packages/ContributionsIndex.java +++ b/arduino-core/src/cc/arduino/contributions/packages/ContributionsIndex.java @@ -28,8 +28,15 @@ */ package cc.arduino.contributions.packages; -import java.util.ArrayList; -import java.util.List; +import cc.arduino.contributions.DownloadableContributionBuiltInAtTheBottomComparator; +import cc.arduino.contributions.filters.InstalledPredicate; +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.collect.Collections2; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; + +import java.util.*; public abstract class ContributionsIndex { @@ -43,6 +50,69 @@ public abstract class ContributionsIndex { return null; } + public List findPlatforms(String packageName, final String platformName) { + if (packageName == null || platformName == null) { + return null; + + } + ContributedPackage aPackage = findPackage(packageName); + if (aPackage == null) { + return null; + } + Collection platforms = Collections2.filter(aPackage.getPlatforms(), new Predicate() { + @Override + public boolean apply(ContributedPlatform contributedPlatform) { + return platformName.equals(contributedPlatform.getName()); + } + }); + return Lists.newLinkedList(platforms); + } + + public ContributedPlatform findPlatform(String packageName, final String platformName, final String platformVersion) { + if (platformVersion == null) { + return null; + + } + + Collection platformsByName = findPlatforms(packageName, platformName); + if (platformsByName == null) { + return null; + } + + Collection platforms = Collections2.filter(platformsByName, new Predicate() { + @Override + public boolean apply(ContributedPlatform contributedPlatform) { + return platformVersion.equals(contributedPlatform.getParsedVersion()); + } + }); + if (platforms.isEmpty()) { + return null; + } + + return platforms.iterator().next(); + } + + public ContributedPlatform getInstalled(String packageName, String platformName) { + List installedPlatforms = new LinkedList(Collections2.filter(findPlatforms(packageName, platformName), new InstalledPredicate())); + Collections.sort(installedPlatforms, new DownloadableContributionBuiltInAtTheBottomComparator()); + + if (installedPlatforms.isEmpty()) { + return null; + } + + return installedPlatforms.get(0); + } + + public List getPlatforms() { + return Lists.newLinkedList(Iterables.concat(Collections2.transform(getPackages(), new Function>() { + @Override + public List apply(ContributedPackage contributedPackage) { + return contributedPackage.getPlatforms(); + } + }))); + } + + public ContributedTool findTool(String packageName, String name, String version) { ContributedPackage pack = findPackage(packageName); diff --git a/arduino-core/src/processing/app/helpers/CommandlineParser.java b/arduino-core/src/processing/app/helpers/CommandlineParser.java index 2fc43b103..892098555 100644 --- a/arduino-core/src/processing/app/helpers/CommandlineParser.java +++ b/arduino-core/src/processing/app/helpers/CommandlineParser.java @@ -1,13 +1,5 @@ package processing.app.helpers; -import static processing.app.I18n._; - -import java.io.File; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - import processing.app.BaseNoGui; import processing.app.I18n; import processing.app.PreferencesData; @@ -16,9 +8,29 @@ import processing.app.debug.TargetPackage; import processing.app.debug.TargetPlatform; import processing.app.legacy.PApplet; +import java.io.File; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import static processing.app.I18n._; + public class CommandlineParser { - protected static enum ACTION { GUI, NOOP, VERIFY, UPLOAD, GET_PREF }; + private enum ACTION { + GUI, NOOP, VERIFY("--verify"), UPLOAD("--upload"), GET_PREF("--get-pref"), INSTALL_BOARD("--install-board"), INSTALL_LIBRARY("--install-library"); + + private final String value; + + ACTION() { + this.value = null; + } + + ACTION(String value) { + this.value = value; + } + } private ACTION action = ACTION.GUI; private boolean doVerboseBuild = false; @@ -26,24 +38,28 @@ public class CommandlineParser { private boolean doUseProgrammer = false; private boolean noUploadPort = false; private boolean forceSavePrefs = false; - private String getPref = null; + private String getPref; + private String boardToInstall; + private String libraryToInstall; private List filenames = new LinkedList(); public static CommandlineParser newCommandlineParser(String[] args) { return new CommandlineParser(args); } - + private CommandlineParser(String[] args) { parseArguments(args); checkAction(); } - + private void parseArguments(String[] args) { // Map of possible actions and corresponding options final Map actions = new HashMap(); actions.put("--verify", ACTION.VERIFY); actions.put("--upload", ACTION.UPLOAD); actions.put("--get-pref", ACTION.GET_PREF); + actions.put("--install-board", ACTION.INSTALL_BOARD); + actions.put("--install-library", ACTION.INSTALL_LIBRARY); // Check if any files were passed in on the command line for (int i = 0; i < args.length; i++) { @@ -56,10 +72,25 @@ public class CommandlineParser { } if (a == ACTION.GET_PREF) { i++; - if (i >= args.length) - BaseNoGui.showError(null, _("Argument required for --get-pref"), 3); + if (i >= args.length) { + BaseNoGui.showError(null, I18n.format(_("Argument required for {0}"), a.value), 3); + } getPref = args[i]; } + if (a == ACTION.INSTALL_BOARD) { + i++; + if (i >= args.length) { + BaseNoGui.showError(null, I18n.format(_("Argument required for {0}"), a.value), 3); + } + boardToInstall = args[i]; + } + if (a == ACTION.INSTALL_LIBRARY) { + i++; + if (i >= args.length) { + BaseNoGui.showError(null, I18n.format(_("Argument required for {0}"), a.value), 3); + } + libraryToInstall = args[i]; + } action = a; continue; } @@ -164,7 +195,7 @@ public class CommandlineParser { filenames.add(args[i]); } } - + private void checkAction() { if ((action == ACTION.UPLOAD || action == ACTION.VERIFY) && filenames.size() != 1) BaseNoGui.showError(null, _("Must specify exactly one sketch file"), 3); @@ -179,7 +210,7 @@ public class CommandlineParser { private void processBoardArgument(String selectBoard) { // No board selected? Nothing to do if (selectBoard == null) - return; + return; String[] split = selectBoard.split(":", 4); @@ -251,27 +282,27 @@ public class CommandlineParser { public List getFilenames() { return filenames; } - + public boolean isGetPrefMode() { return action == ACTION.GET_PREF; } - + public boolean isGuiMode() { return action == ACTION.GUI; } - + public boolean isNoOpMode() { return action == ACTION.NOOP; } - + public boolean isUploadMode() { return action == ACTION.UPLOAD; } - + public boolean isVerifyMode() { return action == ACTION.VERIFY; } - + public boolean isVerifyOrUploadMode() { return isVerifyMode() || isUploadMode(); } @@ -284,4 +315,19 @@ public class CommandlineParser { return noUploadPort; } + public boolean isInstallBoard() { + return action == ACTION.INSTALL_BOARD; + } + + public boolean isInstallLibrary() { + return action == ACTION.INSTALL_LIBRARY; + } + + public String getBoardToInstall() { + return this.boardToInstall; + } + + public String getLibraryToInstall() { + return libraryToInstall; + } } diff --git a/build/linux/dist/arduino b/build/linux/dist/arduino index 2c8cf15cf..d942d6947 100755 --- a/build/linux/dist/arduino +++ b/build/linux/dist/arduino @@ -20,7 +20,7 @@ export LD_LIBRARY_PATH export PATH="${APPDIR}/java/bin:${PATH}" -if [[ "$@" == *"--upload"* || "$@" == *"--verify"* || "$@" == *"--get-pref"* ]] ; then +if [[ "$@" == *"--upload"* || "$@" == *"--verify"* || "$@" == *"--get-pref"* || "$@" == *"--install-board"* || "$@" == *"--install-library"* ]] ; then SPLASH="" else SPLASH="-splash:./lib/splash.png"