package picocli.examples.git;
import picocli.CommandLine;
import picocli.CommandLine.Command;
import picocli.CommandLine.Model.CommandSpec;
import picocli.CommandLine.Option;
import picocli.CommandLine.Spec;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
/**
* This example shows how git could be implemented using picocli.
*
* The following subcommands show detailed help: {@code git status} and {@code git commit}.
*
* Invoking the {@code git} command without a subcommand shows the usage help.
*
*/
@Command(name = "git", mixinStandardHelpOptions = true, version = "subcommand demo 3.0",
description = "Git is a fast, scalable, distributed revision control " +
"system with an unusually rich command set that provides both " +
"high-level operations and full access to internals.",
commandListHeading = "%nCommands:%n%nThe most commonly used git commands are:%n",
footer = "%nSee 'git help ' to read about a specific subcommand or concept.",
subcommands = {
GitAdd.class,
GitBranch.class,
GitClone.class,
GitCommit.class,
GitDiff.class,
GitMerge.class,
GitPush.class,
GitRebase.class,
GitStatus.class,
GitTag.class,
CommandLine.HelpCommand.class
})
public class Git implements Runnable {
@Option(names = "--git-dir", description = "Set the path to the repository")
File path;
@Option(names = "--exec-path", description = "Path to wherever your core Git programs are installed.")
File execPath;
@Option(names = {"-C"}, paramLabel = "",
description = "Run as if git was started in instead of the current working directory")
File currentDir;
@Option(names = {"-c"}, description = "Pass a configuration parameter to the command.")
Map configParameters;
@Option(names = {"--namespace"}, description = "Set the Git namespace. See gitnamespaces(7) for more details.")
String name;
@Option(names = {"-p", "--paginate"}, description = "Pipe all output into less (or if set, $PAGER) if standard output is a terminal.")
boolean paginate;
@Option(names = {"--bare"}, description = "Treat the repository as a bare repository.")
boolean bare;
@Spec
CommandSpec spec;
@Override
public void run() {
// if the command was invoked without subcommand, show the usage help
spec.commandLine().usage(System.err);
}
public static void main(String[] args) {
System.exit(new CommandLine(new Git()).execute(args));
}
}
// defines some commands to show in the list (option/parameters fields omitted for this demo)
@Command(name = "add", header = "Add file contents to the index.")
class GitAdd implements Runnable {
@Override public void run() { }
}
@Command(name = "branch", header = "List, create, or delete branches.")
class GitBranch implements Runnable {
@Override public void run() { }
}
@Command(name = "checkout", header = "Checkout a branch or paths to the working tree.")
class GitCheckout implements Runnable {
@Override public void run() { }
}
@Command(name = "clone", header = "Clone a repository into a new directory.")
class GitClone implements Runnable {
@Override public void run() { }
}
@Command(name = "diff", header = "Show changes between commits, commit and working tree, etc.")
class GitDiff implements Runnable {
@Override public void run() { }
}
@Command(name = "merge", header = "Join two or more development histories together.")
class GitMerge implements Runnable {
@Override public void run() { }
}
@Command(name = "push", header = "Update remote refs along with associated objects.")
class GitPush implements Runnable {
@Override public void run() { }
}
@Command(name = "rebase", header = "Forward-port local commits to the updated upstream head.")
class GitRebase implements Runnable {
@Override public void run() { }
}
@Command(name = "tag", header = "Create, list, delete or verify a tag object signed with GPG.")
class GitTag implements Runnable {
@Override public void run() { }
}