diff options
author | Ben Gruver <bgruv@google.com> | 2016-05-23 15:50:28 -0700 |
---|---|---|
committer | Ben Gruver <bgruv@google.com> | 2016-05-28 18:52:26 -0700 |
commit | ca48e6f7d06931039352ebe3acda81457bcefccc (patch) | |
tree | bac3853fbc08e9c092ef9210defd5c37f09166ac /smali | |
parent | e474301e60b89d33343586b896efd8e4b0a10b37 (diff) | |
download | smali-ca48e6f7d06931039352ebe3acda81457bcefccc.tar.gz |
Revamp the CLI usage/help formatting
Diffstat (limited to 'smali')
-rw-r--r-- | smali/src/main/java/org/jf/smali/AssembleCommand.java | 26 | ||||
-rw-r--r-- | smali/src/main/java/org/jf/smali/Command.java | 36 | ||||
-rw-r--r-- | smali/src/main/java/org/jf/smali/HelpCommand.java | 46 | ||||
-rw-r--r-- | smali/src/main/java/org/jf/smali/Main.java | 42 |
4 files changed, 85 insertions, 65 deletions
diff --git a/smali/src/main/java/org/jf/smali/AssembleCommand.java b/smali/src/main/java/org/jf/smali/AssembleCommand.java index e3cf4a13..263c4cea 100644 --- a/smali/src/main/java/org/jf/smali/AssembleCommand.java +++ b/smali/src/main/java/org/jf/smali/AssembleCommand.java @@ -35,15 +35,19 @@ import com.beust.jcommander.JCommander; import com.beust.jcommander.Parameter; import com.beust.jcommander.Parameters; import com.beust.jcommander.validators.PositiveInteger; +import org.jf.util.jcommander.Command; +import org.jf.util.jcommander.ExtendedParameter; +import org.jf.util.jcommander.ExtendedParameters; import javax.annotation.Nonnull; import java.io.IOException; import java.util.List; @Parameters(commandDescription = "Assembles smali files into a dex file.") -public class AssembleCommand implements Command { - - @Nonnull private final JCommander jc; +@ExtendedParameters( + commandName = "assemble", + commandAliases = { "ass", "as", "a" }) +public class AssembleCommand extends Command { @Parameter(names = {"-h", "-?", "--help"}, help = true, description = "Show usage information for this command.") @@ -52,14 +56,17 @@ public class AssembleCommand implements Command { @Parameter(names = {"-j", "--jobs"}, description = "The number of threads to use. Defaults to the number of cores available.", validateWith = PositiveInteger.class) + @ExtendedParameter(argumentNames = "n") private int jobs = Runtime.getRuntime().availableProcessors(); @Parameter(names = {"-a", "--api"}, description = "The numeric api level to use while assembling.") + @ExtendedParameter(argumentNames = "api") private int apiLevel = 15; @Parameter(names = {"-o", "--output"}, - description = "The location of the dex file to write.") + description = "The name/path of the dex file to write.") + @ExtendedParameter(argumentNames = "file") private String output = "out.dex"; @Parameter(names = "--experimental", @@ -75,17 +82,18 @@ public class AssembleCommand implements Command { description = "Allows the odex opcodes that dalvik doesn't reject to be assembled.") private boolean allowOdexOpcodes; - @Parameter(description = "[<file>|<dir>]+ - Assembles the given files. If a directory is specified, it will be " + - "recursively searched for any file with a .smali prefix") + @Parameter(description = "Assembles the given files. If a directory is specified, it will be " + + "recursively searched for any files with a .smali prefix") + @ExtendedParameter(argumentNames = "[<file>|<dir>]+") private List<String> input; - public AssembleCommand(@Nonnull JCommander jc) { - this.jc = jc; + public AssembleCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors); } @Override public void run() { if (help || input == null || input.isEmpty()) { - jc.usage(jc.getParsedCommand()); + usage(); return; } diff --git a/smali/src/main/java/org/jf/smali/Command.java b/smali/src/main/java/org/jf/smali/Command.java deleted file mode 100644 index c3af4d16..00000000 --- a/smali/src/main/java/org/jf/smali/Command.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2016, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -package org.jf.smali; - -public interface Command { - void run(); -}
\ No newline at end of file diff --git a/smali/src/main/java/org/jf/smali/HelpCommand.java b/smali/src/main/java/org/jf/smali/HelpCommand.java index 28085a3c..429a7dfd 100644 --- a/smali/src/main/java/org/jf/smali/HelpCommand.java +++ b/smali/src/main/java/org/jf/smali/HelpCommand.java @@ -34,35 +34,59 @@ package org.jf.smali; import com.beust.jcommander.JCommander; import com.beust.jcommander.Parameter; import com.beust.jcommander.Parameters; +import org.jf.util.ConsoleUtil; +import org.jf.util.jcommander.*; import javax.annotation.Nonnull; import java.util.List; @Parameters(commandDescription = "Shows usage information") -public class HelpCommand implements Command { - @Nonnull private final JCommander jc; +@ExtendedParameters( + commandName = "help", + commandAliases = "h") +public class HelpCommand extends Command { - public HelpCommand(@Nonnull JCommander jc) { - this.jc = jc; - } - - @Parameter(description = "If specified, only show the usage information for the given commands") + @Parameter(description = "If specified, show the detailed usage information for the given commands") + @ExtendedParameter(argumentNames = "commands") private List<String> commands; + public HelpCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors); + } + public void run() { + JCommander parentJc = commandAncestors.get(commandAncestors.size() - 1); + if (commands == null || commands.isEmpty()) { - jc.usage(); + System.out.println(new HelpFormatter() + .width(ConsoleUtil.getConsoleWidth()) + .format(commandAncestors)); } else { + boolean printedHelp = false; for (String cmd : commands) { - jc.usage(cmd); + JCommander command = ExtendedCommands.getSubcommand(parentJc, cmd); + if (command == null) { + System.err.println("No such command: " + cmd); + } else { + printedHelp = true; + System.out.println(new HelpFormatter() + .width(ConsoleUtil.getConsoleWidth()) + .format(((Command)command.getObjects().get(0)).getCommandHierarchy())); + } + } + if (!printedHelp) { + System.out.println(new HelpFormatter() + .width(ConsoleUtil.getConsoleWidth()) + .format(commandAncestors)); } } } @Parameters(hidden = true) + @ExtendedParameters(commandName = "hlep") public static class HlepCommand extends HelpCommand { - public HlepCommand(@Nonnull JCommander jc) { - super(jc); + public HlepCommand(@Nonnull List<JCommander> commandAncestors) { + super(commandAncestors); } } } diff --git a/smali/src/main/java/org/jf/smali/Main.java b/smali/src/main/java/org/jf/smali/Main.java index 08a1b10e..6b56fddb 100644 --- a/smali/src/main/java/org/jf/smali/Main.java +++ b/smali/src/main/java/org/jf/smali/Main.java @@ -33,13 +33,22 @@ package org.jf.smali; import com.beust.jcommander.JCommander; import com.beust.jcommander.Parameter; +import com.google.common.collect.Lists; import org.jf.smali.HelpCommand.HlepCommand; +import org.jf.util.jcommander.Command; +import org.jf.util.jcommander.ExtendedCommands; +import org.jf.util.jcommander.ExtendedParameters; import java.io.IOException; import java.io.InputStream; +import java.util.List; import java.util.Properties; -public class Main { +@ExtendedParameters( + includeParametersInUsage = true, + commandName = "smali", + postfixDescription = "See smali help <command> for more information about a specific command") +public class Main extends Command { public static final String VERSION = loadVersion(); @Parameter(names = {"-h", "-?", "--help"}, help = true, @@ -50,24 +59,39 @@ public class Main { description = "Print the version of baksmali and then exit") public boolean version; + private JCommander jc; + + @Override public void run() { + } + + @Override protected JCommander getJCommander() { + return jc; + } + + public Main() { + super(Lists.<JCommander>newArrayList()); + } + public static void main(String[] args) { Main main = new Main(); JCommander jc = new JCommander(main); + main.jc = jc; + jc.setProgramName("smali"); + List<JCommander> commandHierarchy = main.getCommandHierarchy(); - jc.addCommand("assemble", new AssembleCommand(jc), "a", "as"); - jc.addCommand("help", new HelpCommand(jc), "h"); - jc.addCommand("hlep", new HlepCommand(jc)); + ExtendedCommands.addExtendedCommand(jc, new AssembleCommand(commandHierarchy)); + ExtendedCommands.addExtendedCommand(jc, new HelpCommand(commandHierarchy)); + ExtendedCommands.addExtendedCommand(jc, new HlepCommand(commandHierarchy)); jc.parse(args); - if (jc.getParsedCommand() == null || main.help) { - jc.usage(); - return; - } - if (main.version) { version(); + } + + if (jc.getParsedCommand() == null || main.help) { + main.usage(); return; } |