diff --git a/app/src/processing/app/Base.java b/app/src/processing/app/Base.java index 89fc37b66..a64f46327 100644 --- a/app/src/processing/app/Base.java +++ b/app/src/processing/app/Base.java @@ -275,6 +275,9 @@ public class Base { BaseNoGui.notifier = new GUIUserNotifier(this); this.recentSketchesMenuItems = new LinkedList(); + CommandlineParser parser = new CommandlineParser(args); + parser.parseArgumentsPhase1(); + BaseNoGui.checkInstallationFolder(); String sketchbookPath = BaseNoGui.getSketchbookPath(); @@ -302,7 +305,7 @@ public class Base { this.pdeKeywords = new PdeKeywords(); this.pdeKeywords.reload(); - CommandlineParser parser = CommandlineParser.newCommandlineParser(args); + parser.parseArgumentsPhase2(); for (String path : parser.getFilenames()) { // Correctly resolve relative paths diff --git a/arduino-core/src/processing/app/BaseNoGui.java b/arduino-core/src/processing/app/BaseNoGui.java index 8741aab52..9a03ee17c 100644 --- a/arduino-core/src/processing/app/BaseNoGui.java +++ b/arduino-core/src/processing/app/BaseNoGui.java @@ -427,6 +427,9 @@ public class BaseNoGui { } static public void init(String[] args) throws Exception { + CommandlineParser parser = new CommandlineParser(args); + parser.parseArgumentsPhase1(); + String sketchbookPath = getSketchbookPath(); // If no path is set, get the default sketchbook folder for this platform @@ -436,13 +439,13 @@ public class BaseNoGui { else showError(_("No sketchbook"), _("Sketchbook path not defined"), null); } - + BaseNoGui.initPackages(); // Setup board-dependent variables. onBoardOrPortChange(); - - CommandlineParser parser = CommandlineParser.newCommandlineParser(args); + + parser.parseArgumentsPhase2(); for (String path: parser.getFilenames()) { // Correctly resolve relative paths diff --git a/arduino-core/src/processing/app/helpers/CommandlineParser.java b/arduino-core/src/processing/app/helpers/CommandlineParser.java index 01d0d93b5..069c037e0 100644 --- a/arduino-core/src/processing/app/helpers/CommandlineParser.java +++ b/arduino-core/src/processing/app/helpers/CommandlineParser.java @@ -9,10 +9,7 @@ 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 java.util.*; import static processing.app.I18n._; @@ -32,6 +29,8 @@ public class CommandlineParser { } } + private final String[] args; + private final Map actions; private ACTION action = ACTION.GUI; private boolean doVerboseBuild = false; private boolean doVerboseUpload = false; @@ -44,30 +43,24 @@ public class CommandlineParser { private String libraryToInstall; private List filenames = new LinkedList(); - public static CommandlineParser newCommandlineParser(String[] args) { - return new CommandlineParser(args); - } + public CommandlineParser(String[] args) { + this.args = 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 = new HashMap(); actions.put("--verify", ACTION.VERIFY); actions.put("--upload", ACTION.UPLOAD); actions.put("--get-pref", ACTION.GET_PREF); actions.put("--install-boards", ACTION.INSTALL_BOARD); actions.put("--install-library", ACTION.INSTALL_LIBRARY); + } - // Check if any files were passed in on the command line + public void parseArgumentsPhase1() { for (int i = 0; i < args.length; i++) { ACTION a = actions.get(args[i]); if (a != null) { if (action != ACTION.GUI && action != ACTION.NOOP) { - String[] valid = actions.keySet().toArray(new String[0]); + Set strings = actions.keySet(); + String[] valid = strings.toArray(new String[strings.size()]); String mess = I18n.format(_("Can only pass one of: {0}"), PApplet.join(valid, ", ")); BaseNoGui.showError(null, mess, 3); } @@ -139,7 +132,6 @@ public class CommandlineParser { i++; if (i >= args.length) BaseNoGui.showError(null, _("Argument required for --board"), 3); - processBoardArgument(args[i]); if (action == ACTION.GUI) action = ACTION.NOOP; continue; @@ -200,6 +192,23 @@ public class CommandlineParser { filenames.add(args[i]); } + + checkAction(); + } + + public void parseArgumentsPhase2() { + for (int i = 0; i < args.length; i++) { + if (args[i].equals("--board")) { + i++; + if (i >= args.length) { + BaseNoGui.showError(null, _("Argument required for --board"), 3); + } + processBoardArgument(args[i]); + if (action == ACTION.GUI) { + action = ACTION.NOOP; + } + } + } } private void checkAction() {