aboutsummaryrefslogtreecommitdiff
path: root/smali
diff options
context:
space:
mode:
authorBen Gruver <bgruv@google.com>2016-05-23 15:50:28 -0700
committerBen Gruver <bgruv@google.com>2016-05-28 18:52:26 -0700
commitca48e6f7d06931039352ebe3acda81457bcefccc (patch)
treebac3853fbc08e9c092ef9210defd5c37f09166ac /smali
parente474301e60b89d33343586b896efd8e4b0a10b37 (diff)
downloadsmali-ca48e6f7d06931039352ebe3acda81457bcefccc.tar.gz
Revamp the CLI usage/help formatting
Diffstat (limited to 'smali')
-rw-r--r--smali/src/main/java/org/jf/smali/AssembleCommand.java26
-rw-r--r--smali/src/main/java/org/jf/smali/Command.java36
-rw-r--r--smali/src/main/java/org/jf/smali/HelpCommand.java46
-rw-r--r--smali/src/main/java/org/jf/smali/Main.java42
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;
}