{"thread":{"id":"14517","subject":"[JGIT PATCH 00/28] Convert command line parsing to args4j","startedAt":"2008-07-18T01:43:53Z","lastAt":"2008-07-18T01:44:21Z","messageCount":29,"participants":["Shawn O. Pearce"],"isPatch":true,"patchVersion":1,"patchTotal":28},"messages":[{"id":"83785","messageId":"1216345461-59382-1-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":null,"subject":"[JGIT PATCH 00/28] Convert command line parsing to args4j","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:43:53Z","receivedAt":"2008-07-18T01:43:53Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Instead of using a custom argument parsing loop for each builtin\nsubcommand we use a standard parsing library.  The library can\nalso generate help text, such as:\n\n$ jgit -h\njgit --git-dir GIT_DIR --help (-h) --show-stack-trace command [ARG ...]\n\n --git-dir GIT_DIR  : set the git repository to operate on\n --help (-h)        : display this help text\n --show-stack-trace : display the Java stack trace on exceptions\n\n$ jgit merge-base -h\njgit merge-base commit-ish commit-ish ... [--all] [--help (-h)]\n\n --all       : display all possible merge bases\n --help (-h) : display this help text\n\n--8<--\n\nShawn O. Pearce (28):\n  Fix deadlock caused by push over SSH\n  Use die utility method in glog\n  Add args4j library for command line switch processing\n  Move org.spearce.jgit.pgm to its own Java project\n  Make TextBuiltin public so other packages can implement and use it\n  Initialize TextBuiltins with the repository before execution\n  Define our own extended CmdLineParser for extra parsing support\n  Add parseTree method to RevWalk to obtain a RevTree from AnyObjectId\n  Add option handler for AbstractTreeIterator values\n  Add option handler for ObjectId values\n  Add option handler for PathTreeFilter values\n  Add option handler for RefSpec values\n  Add option handler for RevCommit values\n  Add option handler for RevTree values\n  Register most of our OptionHandler implementations for automatic use\n  Convert jgit's Main to use args4j for basic parsing services\n  Support automatic command line parsing for TextBuiltin subclasses\n  Convert diff-tree program to args4j\n  Convert fetch program to args4j\n  Convert index-pack program to args4j\n  Convert ls-remote program to args4j\n  Convert ls-tree program to args4j\n  Convert merge-base program to args4j\n  Convert push program to args4j\n  Convert show-ref program to args4j\n  Convert tag program to args4j\n  Convert rev-list, log, glog programs to args4j\n  Remove support for legacy style TextBuiltins\n\n jgit.sh                                            |    2 +\n make_jgit.sh                                       |   88 +++++-\n org.spearce.jgit.pgm/.classpath                    |    8 +\n org.spearce.jgit.pgm/.gitignore                    |    1 +\n org.spearce.jgit.pgm/.project                      |   17 +\n .../.settings/org.eclipse.core.runtime.prefs       |    3 +\n .../.settings/org.eclipse.jdt.core.prefs           |  320 ++++++++++++++++++++\n .../.settings/org.eclipse.jdt.ui.prefs             |    9 +\n org.spearce.jgit.pgm/lib/args4j-2.0.9.jar          |  Bin 0 -> 40654 bytes\n org.spearce.jgit.pgm/lib/args4j-2.0.9.zip          |  Bin 0 -> 31516 bytes\n org.spearce.jgit.pgm/lib/args4j.LICENSE.txt        |   32 ++\n .../src/org/spearce/jgit/pgm/Die.java              |   17 +-\n .../src/org/spearce/jgit/pgm/DiffTree.java         |   57 ++--\n .../src/org/spearce/jgit/pgm/Fetch.java            |   27 +--\n .../src/org/spearce/jgit/pgm/Glog.java             |    2 +-\n .../src/org/spearce/jgit/pgm/IndexPack.java        |   35 +--\n .../src/org/spearce/jgit/pgm/Log.java              |    0\n .../src/org/spearce/jgit/pgm/LsRemote.java         |   23 +-\n .../src/org/spearce/jgit/pgm/LsTree.java           |   42 +--\n .../src/org/spearce/jgit/pgm/Main.java             |  115 +++----\n .../src/org/spearce/jgit/pgm/MergeBase.java        |   37 ++-\n .../src/org/spearce/jgit/pgm/Push.java             |   99 +++----\n .../src/org/spearce/jgit/pgm/RevList.java          |    0\n .../org/spearce/jgit/pgm/RevWalkTextBuiltin.java   |  146 +++++----\n .../src/org/spearce/jgit/pgm/ShowRef.java          |    2 +-\n .../src/org/spearce/jgit/pgm/Tag.java              |   79 ++---\n .../src/org/spearce/jgit/pgm/TextBuiltin.java      |  202 ++++++++++++\n .../org/spearce/jgit/pgm/build/JarLinkUtil.java    |  204 +++++++++++++\n .../jgit/pgm/opt/AbstractTreeIteratorHandler.java  |  121 ++++++++\n .../org/spearce/jgit/pgm/opt/CmdLineParser.java    |  171 +++++++++++\n .../org/spearce/jgit/pgm/opt/ObjectIdHandler.java  |   94 ++++++\n .../jgit/pgm/opt/PathTreeFilterHandler.java        |  102 +++++++\n .../org/spearce/jgit/pgm/opt/RefSpecHandler.java   |   63 ++--\n .../org/spearce/jgit/pgm/opt/RevCommitHandler.java |  141 +++++++++\n .../org/spearce/jgit/pgm/opt/RevTreeHandler.java   |  109 +++++++\n .../spearce/jgit/pgm/opt/SubcommandHandler.java    |  149 +++++++++\n .../src/org/spearce/jgit/pgm/TextBuiltin.java      |   96 ------\n .../src/org/spearce/jgit/revwalk/RevWalk.java      |   35 +++\n .../org/spearce/jgit/transport/FetchProcess.java   |    2 +-\n .../spearce/jgit/transport/OperationResult.java    |   16 +-\n .../org/spearce/jgit/transport/PushProcess.java    |    2 +-\n 41 files changed, 2149 insertions(+), 519 deletions(-)\n create mode 100644 org.spearce.jgit.pgm/.classpath\n create mode 100644 org.spearce.jgit.pgm/.gitignore\n create mode 100644 org.spearce.jgit.pgm/.project\n create mode 100644 org.spearce.jgit.pgm/.settings/org.eclipse.core.runtime.prefs\n create mode 100644 org.spearce.jgit.pgm/.settings/org.eclipse.jdt.core.prefs\n create mode 100644 org.spearce.jgit.pgm/.settings/org.eclipse.jdt.ui.prefs\n create mode 100644 org.spearce.jgit.pgm/lib/args4j-2.0.9.jar\n create mode 100644 org.spearce.jgit.pgm/lib/args4j-2.0.9.zip\n create mode 100644 org.spearce.jgit.pgm/lib/args4j.LICENSE.txt\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/Die.java (76%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/DiffTree.java (73%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/Fetch.java (89%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/Glog.java (98%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/IndexPack.java (76%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/Log.java (100%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/LsRemote.java (85%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/LsTree.java (76%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/Main.java (64%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/MergeBase.java (73%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/Push.java (78%)\n copy {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/RevList.java (100%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/RevWalkTextBuiltin.java (62%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/ShowRef.java (97%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/Tag.java (66%)\n create mode 100644 org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/TextBuiltin.java\n create mode 100644 org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/build/JarLinkUtil.java\n create mode 100644 org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/AbstractTreeIteratorHandler.java\n create mode 100644 org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/CmdLineParser.java\n create mode 100644 org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/ObjectIdHandler.java\n create mode 100644 org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/PathTreeFilterHandler.java\n rename org.spearce.jgit/src/org/spearce/jgit/pgm/RevList.java => org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/RefSpecHandler.java (61%)\n create mode 100644 org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/RevCommitHandler.java\n create mode 100644 org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/RevTreeHandler.java\n create mode 100644 org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/SubcommandHandler.java\n delete mode 100644 org.spearce.jgit/src/org/spearce/jgit/pgm/TextBuiltin.java\n"},{"id":"83786","messageId":"1216345461-59382-2-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-1-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 01/28] Fix deadlock caused by push over SSH","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:43:54Z","receivedAt":"2008-07-18T01:43:54Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Push does not clean up the Transport correctly when it is done\nso the JSch library still has user level threads running and we\ndo not close down the JVM.  We must close the transport.\n\nThis was broken by 2e05675201 (\"Reuse the same SSH connection\")\nas the JSch session is held open inside of the Transport instance\nin case there are additional calls made on the same Transport.\n\nSigned-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../src/org/spearce/jgit/pgm/Push.java             |    8 ++++----\n .../org/spearce/jgit/transport/FetchProcess.java   |    2 +-\n .../spearce/jgit/transport/OperationResult.java    |   16 +++++++++++++++-\n .../org/spearce/jgit/transport/PushProcess.java    |    2 +-\n 4 files changed, 21 insertions(+), 7 deletions(-)\n\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/pgm/Push.java b/org.spearce.jgit/src/org/spearce/jgit/pgm/Push.java\nindex cbdf465..ef93f2f 100644\n--- a/org.spearce.jgit/src/org/spearce/jgit/pgm/Push.java\n+++ b/org.spearce.jgit/src/org/spearce/jgit/pgm/Push.java\n@@ -52,8 +52,6 @@ class Push extends TextBuiltin {\n \n \tprivate boolean verbose = false;\n \n-\tprivate Transport transport;\n-\n \tprivate boolean first = true;\n \n \t@Override\n@@ -97,7 +95,7 @@ class Push extends TextBuiltin {\n \t\t\trepository = \"origin\";\n \t\telse\n \t\t\trepository = args[argi++];\n-\t\ttransport = Transport.open(db, repository);\n+\t\tfinal Transport transport = Transport.open(db, repository);\n \t\tif (thin != null)\n \t\t\ttransport.setPushThin(thin);\n \t\tif (exec != null)\n@@ -114,6 +112,8 @@ class Push extends TextBuiltin {\n \n \t\tfinal PushResult result = transport.push(new TextProgressMonitor(),\n \t\t\t\ttoPush);\n+\t\ttransport.close();\n+\n \t\tprintPushResult(result);\n \t}\n \n@@ -149,7 +149,7 @@ class Push extends TextBuiltin {\n \t\t\tfinal RemoteRefUpdate rru) {\n \t\tif (first) {\n \t\t\tfirst = false;\n-\t\t\tout.format(\"To %s\\n\", transport.getURI());\n+\t\t\tout.format(\"To %s\\n\", result.getURI());\n \t\t}\n \n \t\tfinal String remoteName = rru.getRemoteName();\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/FetchProcess.java b/org.spearce.jgit/src/org/spearce/jgit/transport/FetchProcess.java\nindex f9c2266..e99869c 100644\n--- a/org.spearce.jgit/src/org/spearce/jgit/transport/FetchProcess.java\n+++ b/org.spearce.jgit/src/org/spearce/jgit/transport/FetchProcess.java\n@@ -97,7 +97,7 @@ class FetchProcess {\n \n \t\tconn = transport.openFetch();\n \t\ttry {\n-\t\t\tresult.setAdvertisedRefs(conn.getRefsMap());\n+\t\t\tresult.setAdvertisedRefs(transport.getURI(), conn.getRefsMap());\n \t\t\tfinal Set<Ref> matched = new HashSet<Ref>();\n \t\t\tfor (final RefSpec spec : toFetch) {\n \t\t\t\tif (spec.getSource() == null)\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/OperationResult.java b/org.spearce.jgit/src/org/spearce/jgit/transport/OperationResult.java\nindex 6700e85..a2e502c 100644\n--- a/org.spearce.jgit/src/org/spearce/jgit/transport/OperationResult.java\n+++ b/org.spearce.jgit/src/org/spearce/jgit/transport/OperationResult.java\n@@ -55,9 +55,22 @@ public abstract class OperationResult {\n \n \tprotected Map<String, Ref> advertisedRefs = Collections.emptyMap();\n \n+\tprotected URIish uri;\n+\n \tprotected final SortedMap<String, TrackingRefUpdate> updates = new TreeMap<String, TrackingRefUpdate>();\n \n \t/**\n+\t * Get the URI this result came from.\n+\t * <p>\n+\t * Each transport instance connects to at most one URI at any point in time.\n+\t * \n+\t * @return the URI describing the location of the remote repository.\n+\t */\n+\tpublic URIish getURI() {\n+\t\treturn uri;\n+\t}\n+\n+\t/**\n \t * Get the complete list of refs advertised by the remote.\n \t * <p>\n \t * The returned refs may appear in any order. If the caller needs these to\n@@ -109,7 +122,8 @@ public abstract class OperationResult {\n \t\treturn updates.get(localName);\n \t}\n \n-\tprotected void setAdvertisedRefs(final Map<String, Ref> ar) {\n+\tprotected void setAdvertisedRefs(final URIish u, final Map<String, Ref> ar) {\n+\t\turi = u;\n \t\tadvertisedRefs = ar;\n \t}\n \ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/PushProcess.java b/org.spearce.jgit/src/org/spearce/jgit/transport/PushProcess.java\nindex 9e63f2f..6a2176f 100644\n--- a/org.spearce.jgit/src/org/spearce/jgit/transport/PushProcess.java\n+++ b/org.spearce.jgit/src/org/spearce/jgit/transport/PushProcess.java\n@@ -211,7 +211,7 @@ class PushProcess {\n \n \tprivate PushResult prepareOperationResult() {\n \t\tfinal PushResult result = new PushResult();\n-\t\tresult.setAdvertisedRefs(connection.getRefsMap());\n+\t\tresult.setAdvertisedRefs(transport.getURI(), connection.getRefsMap());\n \t\tresult.setRemoteUpdates(toPush);\n \n \t\tfor (final RemoteRefUpdate rru : toPush.values()) {\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83787","messageId":"1216345461-59382-3-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-2-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 02/28] Use die utility method in glog","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:43:55Z","receivedAt":"2008-07-18T01:43:55Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Signed-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../src/org/spearce/jgit/pgm/Glog.java             |    2 +-\n 1 files changed, 1 insertions(+), 1 deletions(-)\n\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/pgm/Glog.java b/org.spearce.jgit/src/org/spearce/jgit/pgm/Glog.java\nindex 984b6d8..fbc5218 100644\n--- a/org.spearce.jgit/src/org/spearce/jgit/pgm/Glog.java\n+++ b/org.spearce.jgit/src/org/spearce/jgit/pgm/Glog.java\n@@ -110,7 +110,7 @@ class Glog extends RevWalkTextBuiltin {\n \t@Override\n \tprotected RevWalk createWalk() {\n \t\tif (objects)\n-\t\t\tthrow new Die(\"Cannot use --objects with glog\");\n+\t\t\tthrow die(\"Cannot use --objects with glog\");\n \t\tfinal PlotWalk w = new PlotWalk(db);\n \t\tw.sort(RevSort.BOUNDARY, true);\n \t\treturn w;\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83788","messageId":"1216345461-59382-4-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-3-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 03/28] Add args4j library for command line switch processing","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:43:56Z","receivedAt":"2008-07-18T01:43:56Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"The library and sources are from https://args4j.dev.java.net/\nand is licensed under the MIT license.\n\nSigned-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n org.spearce.jgit.pgm/lib/args4j-2.0.9.jar   |  Bin 0 -> 40654 bytes\n org.spearce.jgit.pgm/lib/args4j-2.0.9.zip   |  Bin 0 -> 31516 bytes\n org.spearce.jgit.pgm/lib/args4j.LICENSE.txt |   32 +++++++++++++++++++++++++++\n 3 files changed, 32 insertions(+), 0 deletions(-)\n create mode 100644 org.spearce.jgit.pgm/lib/args4j-2.0.9.jar\n create mode 100644 org.spearce.jgit.pgm/lib/args4j-2.0.9.zip\n create mode 100644 org.spearce.jgit.pgm/lib/args4j.LICENSE.txt\n\ndiff --git a/org.spearce.jgit.pgm/lib/args4j-2.0.9.jar b/org.spearce.jgit.pgm/lib/args4j-2.0.9.jar\nnew file mode 100644\nindex 0000000000000000000000000000000000000000..a894c6e53b70d6b39fa131f1cf33accd5eb803dd\nGIT binary patch\nliteral 40654\n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\n\nliteral 0\nHcmV?d00001\n\ndiff --git a/org.spearce.jgit.pgm/lib/args4j-2.0.9.zip b/org.spearce.jgit.pgm/lib/args4j-2.0.9.zip\nnew file mode 100644\nindex 0000000000000000000000000000000000000000..eccd663e60fe9abf7e24780e0e832acd4a2b0008\nGIT binary patch\nliteral 31516\n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\nUJDZ+e(Bnkdf!S#YY|j4rA1A9pGXMYp\n\nliteral 0\nHcmV?d00001\n\ndiff --git a/org.spearce.jgit.pgm/lib/args4j.LICENSE.txt b/org.spearce.jgit.pgm/lib/args4j.LICENSE.txt\nnew file mode 100644\nindex 0000000..3ae7e78\n--- /dev/null\n+++ b/org.spearce.jgit.pgm/lib/args4j.LICENSE.txt\n@@ -0,0 +1,32 @@\n+Copyright (c) 2003, Kohsuke Kawaguchi\n+All rights reserved.\n+\n+Redistribution and use in source and binary forms,\n+with or without modification, are permitted provided\n+that the following conditions are met:\n+\n+    * Redistributions of source code must retain\n+      the above copyright notice, this list of\n+      conditions and the following disclaimer.\n+    * Redistributions in binary form must reproduce\n+      the above copyright notice, this list of\n+      conditions and the following disclaimer in\n+      the documentation and/or other materials\n+      provided with the distribution.\n+\n+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT\n+HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS\n+OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n+AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS\n+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \n+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES \n+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF \n+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, \n+OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER \n+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER \n+IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING \n+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF \n+THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF \n+THE POSSIBILITY OF SUCH DAMAGE.\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83791","messageId":"1216345461-59382-5-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-4-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 04/28] Move org.spearce.jgit.pgm to its own Java project","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:43:57Z","receivedAt":"2008-07-18T01:43:57Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"This way the library does not need to depend upon args4j, as the\ncore library does not need a command line option parser.  We now\nhave a more complex link to build the stand-alone jgit shell script\nso JarLinkUtil exists to combine multiple JARs and class directories\ninto a single output ZIP file.\n\nSigned-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n jgit.sh                                            |    2 +\n make_jgit.sh                                       |   88 +++++-\n org.spearce.jgit.pgm/.classpath                    |    8 +\n org.spearce.jgit.pgm/.gitignore                    |    1 +\n org.spearce.jgit.pgm/.project                      |   17 +\n .../.settings/org.eclipse.core.runtime.prefs       |    3 +\n .../.settings/org.eclipse.jdt.core.prefs           |  320 ++++++++++++++++++++\n .../.settings/org.eclipse.jdt.ui.prefs             |    9 +\n .../src/org/spearce/jgit/pgm/Die.java              |    0\n .../src/org/spearce/jgit/pgm/DiffTree.java         |    0\n .../src/org/spearce/jgit/pgm/Fetch.java            |    0\n .../src/org/spearce/jgit/pgm/Glog.java             |    0\n .../src/org/spearce/jgit/pgm/IndexPack.java        |    0\n .../src/org/spearce/jgit/pgm/Log.java              |    0\n .../src/org/spearce/jgit/pgm/LsRemote.java         |    0\n .../src/org/spearce/jgit/pgm/LsTree.java           |    0\n .../src/org/spearce/jgit/pgm/Main.java             |    0\n .../src/org/spearce/jgit/pgm/MergeBase.java        |    0\n .../src/org/spearce/jgit/pgm/Push.java             |    0\n .../src/org/spearce/jgit/pgm/RevList.java          |    0\n .../org/spearce/jgit/pgm/RevWalkTextBuiltin.java   |    0\n .../src/org/spearce/jgit/pgm/ShowRef.java          |    0\n .../src/org/spearce/jgit/pgm/Tag.java              |    0\n .../src/org/spearce/jgit/pgm/TextBuiltin.java      |    0\n .../org/spearce/jgit/pgm/build/JarLinkUtil.java    |  204 +++++++++++++\n 25 files changed, 635 insertions(+), 17 deletions(-)\n create mode 100644 org.spearce.jgit.pgm/.classpath\n create mode 100644 org.spearce.jgit.pgm/.gitignore\n create mode 100644 org.spearce.jgit.pgm/.project\n create mode 100644 org.spearce.jgit.pgm/.settings/org.eclipse.core.runtime.prefs\n create mode 100644 org.spearce.jgit.pgm/.settings/org.eclipse.jdt.core.prefs\n create mode 100644 org.spearce.jgit.pgm/.settings/org.eclipse.jdt.ui.prefs\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/Die.java (100%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/DiffTree.java (100%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/Fetch.java (100%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/Glog.java (100%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/IndexPack.java (100%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/Log.java (100%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/LsRemote.java (100%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/LsTree.java (100%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/Main.java (100%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/MergeBase.java (100%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/Push.java (100%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/RevList.java (100%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/RevWalkTextBuiltin.java (100%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/ShowRef.java (100%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/Tag.java (100%)\n rename {org.spearce.jgit => org.spearce.jgit.pgm}/src/org/spearce/jgit/pgm/TextBuiltin.java (100%)\n create mode 100644 org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/build/JarLinkUtil.java\n\ndiff --git a/jgit.sh b/jgit.sh\nindex 84927bc..121beec 100755\n--- a/jgit.sh\n+++ b/jgit.sh\n@@ -9,6 +9,8 @@ else\n \tjgit_home=`dirname $0`\n \tcp=\"$jgit_home/org.spearce.jgit/bin\"\n \tcp=\"$cp:$jgit_home/org.spearce.jgit/lib/jsch-0.1.37.jar\"\n+\tcp=\"$cp:$jgit_home/org.spearce.jgit.pgm/bin\"\n+\tcp=\"$cp:$jgit_home/org.spearce.jgit.pgm/lib/args4j-2.0.9.jar\"\n \tunset jgit_home\n \tjava_args=\n fi\ndiff --git a/make_jgit.sh b/make_jgit.sh\nindex 3889dca..bcb2df0 100755\n--- a/make_jgit.sh\n+++ b/make_jgit.sh\n@@ -1,26 +1,80 @@\n #!/bin/sh\n \n-PATH=$JAVA_HOME/bin:$PATH\n O=jgit\n+PLUGINS=\"\n+\torg.spearce.jgit\n+\torg.spearce.jgit.pgm\n+\"\n+JARS=\"\n+\torg.spearce.jgit/lib/jsch-0.1.37.jar\n+\torg.spearce.jgit.pgm/lib/args4j-2.0.9.jar\n+\"\n+\n+if [ -n \"$JAVA_HOME\" ]\n+then\n+\tPATH=$JAVA_HOME/bin:$PATH\n+fi\n+\n T=\".temp$$.$O\"\n+T_MF=\"$T.MF\"\n+R=`pwd`\n+\n+cleanup_bin() {\n+\trm -f $T $O+ $T_MF\n+\tfor p in $PLUGINS\n+\tdo\n+\t\trm -rf $p/bin2\n+\tdone\n+}\n \n+die() {\n+\tcleanup_bin\n+\trm -f $O\n+\techo >&2 \"$@\"\n+\texit 1\n+}\n+\n+cleanup_bin\n rm -f $O\n-rm -rf $T $O+ org.spearce.jgit/bin2\n-cp org.spearce.jgit/lib/jsch-0.1.37.jar $T &&\n-mkdir org.spearce.jgit/bin2 &&\n-(cd org.spearce.jgit/src &&\n- find . -name \\*.java -type f |\n- xargs javac \\\n-\t-source 1.5 \\\n-\t-target 1.5 \\\n-\t-g \\\n-\t-d ../bin2 \\\n-\t-cp ../lib/jsch-0.1.37.jar) &&\n-jar uf $T -C org.spearce.jgit/bin2 . &&\n-jar uf $T -C org.spearce.jgit META-INF &&\n+\n+CLASSPATH=\n+for j in $JARS\n+do\n+\tif [ -z \"$CLASSPATH\" ]\n+\tthen\n+\t\tCLASSPATH=\"$R/$j\"\n+\telse\n+\t\tCLASSPATH=\"$CLASSPATH:$R/$j\"\n+\tfi\n+done\n+export CLASSPATH\n+\n+for p in $PLUGINS\n+do\n+\techo \"Entering $p ...\"\n+\t(cd $p/src &&\n+\t mkdir ../bin2 &&\n+\t find . -name \\*.java -type f |\n+\t xargs javac \\\n+\t\t-source 1.5 \\\n+\t\t-target 1.5 \\\n+\t\t-g \\\n+\t\t-d ../bin2) || die \"Building $p failed.\"\n+\tCLASSPATH=\"$CLASSPATH:$R/$p/bin2\"\n+done\n+\n+echo Manifest-Version: 1.0 >$T_MF &&\n+echo Implementation-Title: jgit >>$T_MF &&\n+echo Implementation-Version: `git describe HEAD` >>$T_MF &&\n+\n sed s/@@use_self@@/1/ jgit.sh >$O+ &&\n-cat $T >>$O+ &&\n+java org.spearce.jgit.pgm.build.JarLinkUtil \\\n+\t`for p in $JARS   ; do printf %s \" -include $p\"     ;done` \\\n+\t`for p in $PLUGINS; do printf %s \" -include $p/bin2\";done` \\\n+\t-file META-INF/MANIFEST.MF=$T_MF \\\n+\t>>$O+ &&\n chmod 555 $O+ &&\n mv $O+ $O &&\n-echo \"Created $O.\" &&\n-rm -rf $T $O+ org.spearce.jgit/bin2\n+echo \"Created $O.\" || die \"Creating $O failed.\"\n+\n+cleanup_bin\ndiff --git a/org.spearce.jgit.pgm/.classpath b/org.spearce.jgit.pgm/.classpath\nnew file mode 100644\nindex 0000000..cc861d2\n--- /dev/null\n+++ b/org.spearce.jgit.pgm/.classpath\n@@ -0,0 +1,8 @@\n+<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n+<classpath>\n+\t<classpathentry kind=\"src\" path=\"src\"/>\n+\t<classpathentry exported=\"true\" kind=\"lib\" path=\"lib/args4j-2.0.9.jar\" sourcepath=\"lib/args4j-2.0.9.zip\"/>\n+\t<classpathentry exported=\"true\" kind=\"con\" path=\"org.eclipse.jdt.launching.JRE_CONTAINER\"/>\n+\t<classpathentry combineaccessrules=\"false\" exported=\"true\" kind=\"src\" path=\"/org.spearce.jgit\"/>\n+\t<classpathentry kind=\"output\" path=\"bin\"/>\n+</classpath>\ndiff --git a/org.spearce.jgit.pgm/.gitignore b/org.spearce.jgit.pgm/.gitignore\nnew file mode 100644\nindex 0000000..5e56e04\n--- /dev/null\n+++ b/org.spearce.jgit.pgm/.gitignore\n@@ -0,0 +1 @@\n+/bin\ndiff --git a/org.spearce.jgit.pgm/.project b/org.spearce.jgit.pgm/.project\nnew file mode 100644\nindex 0000000..e642f9e\n--- /dev/null\n+++ b/org.spearce.jgit.pgm/.project\n@@ -0,0 +1,17 @@\n+<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n+<projectDescription>\n+\t<name>org.spearce.jgit.pgm</name>\n+\t<comment></comment>\n+\t<projects>\n+\t</projects>\n+\t<buildSpec>\n+\t\t<buildCommand>\n+\t\t\t<name>org.eclipse.jdt.core.javabuilder</name>\n+\t\t\t<arguments>\n+\t\t\t</arguments>\n+\t\t</buildCommand>\n+\t</buildSpec>\n+\t<natures>\n+\t\t<nature>org.eclipse.jdt.core.javanature</nature>\n+\t</natures>\n+</projectDescription>\ndiff --git a/org.spearce.jgit.pgm/.settings/org.eclipse.core.runtime.prefs b/org.spearce.jgit.pgm/.settings/org.eclipse.core.runtime.prefs\nnew file mode 100644\nindex 0000000..cce0568\n--- /dev/null\n+++ b/org.spearce.jgit.pgm/.settings/org.eclipse.core.runtime.prefs\n@@ -0,0 +1,3 @@\n+#Mon Mar 24 18:55:50 EDT 2008\n+eclipse.preferences.version=1\n+line.separator=\\n\ndiff --git a/org.spearce.jgit.pgm/.settings/org.eclipse.jdt.core.prefs b/org.spearce.jgit.pgm/.settings/org.eclipse.jdt.core.prefs\nnew file mode 100644\nindex 0000000..a67b954\n--- /dev/null\n+++ b/org.spearce.jgit.pgm/.settings/org.eclipse.jdt.core.prefs\n@@ -0,0 +1,320 @@\n+#Sun Feb 03 03:16:45 CET 2008\n+eclipse.preferences.version=1\n+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled\n+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5\n+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve\n+org.eclipse.jdt.core.compiler.compliance=1.5\n+org.eclipse.jdt.core.compiler.debug.lineNumber=generate\n+org.eclipse.jdt.core.compiler.debug.localVariable=generate\n+org.eclipse.jdt.core.compiler.debug.sourceFile=generate\n+org.eclipse.jdt.core.compiler.doc.comment.support=enabled\n+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning\n+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error\n+org.eclipse.jdt.core.compiler.problem.autoboxing=warning\n+org.eclipse.jdt.core.compiler.problem.deprecation=warning\n+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled\n+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled\n+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning\n+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning\n+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error\n+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning\n+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning\n+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning\n+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error\n+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error\n+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error\n+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning\n+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning\n+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error\n+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error\n+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled\n+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled\n+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled\n+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private\n+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning\n+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error\n+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore\n+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=error\n+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled\n+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public\n+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error\n+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled\n+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=private\n+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore\n+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning\n+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error\n+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error\n+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore\n+org.eclipse.jdt.core.compiler.problem.nullReference=warning\n+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning\n+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore\n+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error\n+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning\n+org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore\n+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning\n+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled\n+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error\n+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled\n+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning\n+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning\n+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning\n+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning\n+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error\n+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore\n+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning\n+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled\n+org.eclipse.jdt.core.compiler.problem.unusedImport=error\n+org.eclipse.jdt.core.compiler.problem.unusedLabel=error\n+org.eclipse.jdt.core.compiler.problem.unusedLocal=error\n+org.eclipse.jdt.core.compiler.problem.unusedParameter=warning\n+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled\n+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled\n+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error\n+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=error\n+org.eclipse.jdt.core.compiler.source=1.5\n+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false\n+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16\n+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16\n+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16\n+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16\n+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16\n+org.eclipse.jdt.core.formatter.alignment_for_assignment=0\n+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16\n+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16\n+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80\n+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0\n+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16\n+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16\n+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16\n+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16\n+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16\n+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16\n+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16\n+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16\n+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16\n+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16\n+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1\n+org.eclipse.jdt.core.formatter.blank_lines_after_package=1\n+org.eclipse.jdt.core.formatter.blank_lines_before_field=1\n+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0\n+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1\n+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1\n+org.eclipse.jdt.core.formatter.blank_lines_before_method=1\n+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1\n+org.eclipse.jdt.core.formatter.blank_lines_before_package=0\n+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1\n+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line\n+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line\n+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line\n+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line\n+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line\n+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line\n+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line\n+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line\n+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line\n+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line\n+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line\n+org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false\n+org.eclipse.jdt.core.formatter.comment.format_comments=true\n+org.eclipse.jdt.core.formatter.comment.format_header=false\n+org.eclipse.jdt.core.formatter.comment.format_html=true\n+org.eclipse.jdt.core.formatter.comment.format_source_code=true\n+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true\n+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true\n+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert\n+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert\n+org.eclipse.jdt.core.formatter.comment.line_length=80\n+org.eclipse.jdt.core.formatter.compact_else_if=true\n+org.eclipse.jdt.core.formatter.continuation_indentation=2\n+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2\n+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false\n+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true\n+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true\n+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true\n+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true\n+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true\n+org.eclipse.jdt.core.formatter.indent_empty_lines=false\n+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true\n+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true\n+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true\n+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false\n+org.eclipse.jdt.core.formatter.indentation.size=4\n+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation=insert\n+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert\n+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert\n+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert\n+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert\n+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert\n+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert\n+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert\n+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert\n+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert\n+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert\n+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert\n+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert\n+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert\n+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert\n+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert\n+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert\n+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert\n+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false\n+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false\n+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false\n+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false\n+org.eclipse.jdt.core.formatter.lineSplit=80\n+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0\n+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1\n+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true\n+org.eclipse.jdt.core.formatter.tabulation.char=tab\n+org.eclipse.jdt.core.formatter.tabulation.size=4\n+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false\ndiff --git a/org.spearce.jgit.pgm/.settings/org.eclipse.jdt.ui.prefs b/org.spearce.jgit.pgm/.settings/org.eclipse.jdt.ui.prefs\nnew file mode 100644\nindex 0000000..709a440\n--- /dev/null\n+++ b/org.spearce.jgit.pgm/.settings/org.eclipse.jdt.ui.prefs\n@@ -0,0 +1,9 @@\n+#Wed May 09 00:20:24 CEST 2007\n+eclipse.preferences.version=1\n+formatter_profile=_JGit\n+formatter_settings_version=10\n+org.eclipse.jdt.ui.ignorelowercasenames=true\n+org.eclipse.jdt.ui.importorder=java;javax;org;com;\n+org.eclipse.jdt.ui.ondemandthreshold=99\n+org.eclipse.jdt.ui.staticondemandthreshold=99\n+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\\=\"1.0\" encoding\\=\"UTF-8\"?><templates/>\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/pgm/Die.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Die.java\nsimilarity index 100%\nrename from org.spearce.jgit/src/org/spearce/jgit/pgm/Die.java\nrename to org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Die.java\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/pgm/DiffTree.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/DiffTree.java\nsimilarity index 100%\nrename from org.spearce.jgit/src/org/spearce/jgit/pgm/DiffTree.java\nrename to org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/DiffTree.java\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/pgm/Fetch.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Fetch.java\nsimilarity index 100%\nrename from org.spearce.jgit/src/org/spearce/jgit/pgm/Fetch.java\nrename to org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Fetch.java\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/pgm/Glog.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Glog.java\nsimilarity index 100%\nrename from org.spearce.jgit/src/org/spearce/jgit/pgm/Glog.java\nrename to org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Glog.java\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/pgm/IndexPack.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/IndexPack.java\nsimilarity index 100%\nrename from org.spearce.jgit/src/org/spearce/jgit/pgm/IndexPack.java\nrename to org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/IndexPack.java\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/pgm/Log.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Log.java\nsimilarity index 100%\nrename from org.spearce.jgit/src/org/spearce/jgit/pgm/Log.java\nrename to org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Log.java\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/pgm/LsRemote.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/LsRemote.java\nsimilarity index 100%\nrename from org.spearce.jgit/src/org/spearce/jgit/pgm/LsRemote.java\nrename to org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/LsRemote.java\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/pgm/LsTree.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/LsTree.java\nsimilarity index 100%\nrename from org.spearce.jgit/src/org/spearce/jgit/pgm/LsTree.java\nrename to org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/LsTree.java\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/pgm/Main.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Main.java\nsimilarity index 100%\nrename from org.spearce.jgit/src/org/spearce/jgit/pgm/Main.java\nrename to org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Main.java\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/pgm/MergeBase.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/MergeBase.java\nsimilarity index 100%\nrename from org.spearce.jgit/src/org/spearce/jgit/pgm/MergeBase.java\nrename to org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/MergeBase.java\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/pgm/Push.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Push.java\nsimilarity index 100%\nrename from org.spearce.jgit/src/org/spearce/jgit/pgm/Push.java\nrename to org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Push.java\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/pgm/RevList.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/RevList.java\nsimilarity index 100%\nrename from org.spearce.jgit/src/org/spearce/jgit/pgm/RevList.java\nrename to org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/RevList.java\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/pgm/RevWalkTextBuiltin.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/RevWalkTextBuiltin.java\nsimilarity index 100%\nrename from org.spearce.jgit/src/org/spearce/jgit/pgm/RevWalkTextBuiltin.java\nrename to org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/RevWalkTextBuiltin.java\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/pgm/ShowRef.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/ShowRef.java\nsimilarity index 100%\nrename from org.spearce.jgit/src/org/spearce/jgit/pgm/ShowRef.java\nrename to org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/ShowRef.java\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/pgm/Tag.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Tag.java\nsimilarity index 100%\nrename from org.spearce.jgit/src/org/spearce/jgit/pgm/Tag.java\nrename to org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Tag.java\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/pgm/TextBuiltin.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/TextBuiltin.java\nsimilarity index 100%\nrename from org.spearce.jgit/src/org/spearce/jgit/pgm/TextBuiltin.java\nrename to org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/TextBuiltin.java\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/build/JarLinkUtil.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/build/JarLinkUtil.java\nnew file mode 100644\nindex 0000000..06827bf\n--- /dev/null\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/build/JarLinkUtil.java\n@@ -0,0 +1,204 @@\n+/*\n+ * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>\n+ *\n+ * All rights reserved.\n+ *\n+ * Redistribution and use in source and binary forms, with or\n+ * without modification, are permitted provided that the following\n+ * conditions are met:\n+ *\n+ * - Redistributions of source code must retain the above copyright\n+ *   notice, this list of conditions and the following disclaimer.\n+ *\n+ * - Redistributions in binary form must reproduce the above\n+ *   copyright notice, this list of conditions and the following\n+ *   disclaimer in the documentation and/or other materials provided\n+ *   with the distribution.\n+ *\n+ * - Neither the name of the Git Development Community nor the\n+ *   names of its contributors may be used to endorse or promote\n+ *   products derived from this software without specific prior\n+ *   written permission.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n+ * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+package org.spearce.jgit.pgm.build;\n+\n+import java.io.File;\n+import java.io.FileInputStream;\n+import java.io.IOException;\n+import java.io.InputStream;\n+import java.util.ArrayList;\n+import java.util.Enumeration;\n+import java.util.HashMap;\n+import java.util.List;\n+import java.util.Map;\n+import java.util.zip.ZipEntry;\n+import java.util.zip.ZipFile;\n+import java.util.zip.ZipOutputStream;\n+\n+import org.kohsuke.args4j.CmdLineException;\n+import org.kohsuke.args4j.CmdLineParser;\n+import org.kohsuke.args4j.Option;\n+import org.kohsuke.args4j.spi.MapOptionHandler;\n+\n+/**\n+ * Combines multiple JAR and directory sources into a single JAR file.\n+ * <p>\n+ * This is a crude command line utility to combine multiple JAR files into a\n+ * single JAR file, without first needing to unpack the individual JARs.\n+ * <p>\n+ * The output ZIP stream is sent to standard out and can be redirected onto the\n+ * end of a shell script which starts the JRE.\n+ */\n+public class JarLinkUtil {\n+\t/**\n+\t * Combine multiple JARs.\n+\t * \n+\t * @param argv\n+\t *            the command line arguments indicating the files to pack.\n+\t * @throws IOException\n+\t *             a source file could not be read.\n+\t */\n+\tpublic static void main(final String[] argv) throws IOException {\n+\t\tfinal JarLinkUtil util = new JarLinkUtil();\n+\t\tfinal CmdLineParser clp = new CmdLineParser(util);\n+\t\ttry {\n+\t\t\tclp.parseArgument(argv);\n+\t\t} catch (CmdLineException e) {\n+\t\t\tclp.printSingleLineUsage(System.err);\n+\t\t\tSystem.exit(1);\n+\t\t}\n+\t\tutil.run();\n+\t}\n+\n+\t@Option(name = \"-include\", required = true)\n+\tprivate List<File> includes = new ArrayList<File>();\n+\n+\t@Option(name = \"-file\", handler = MapOptionHandler.class)\n+\tprivate Map<String, String> files = new HashMap<String, String>();\n+\n+\tprivate final Map<String, File> chosenSources = new HashMap<String, File>();\n+\n+\tprivate ZipOutputStream zos;\n+\n+\tprivate JarLinkUtil() {\n+\t\t// Command line utility only.\n+\t}\n+\n+\tprivate void run() throws IOException {\n+\t\tfor (final File src : includes) {\n+\t\t\tif (src.isFile())\n+\t\t\t\tscanJar(src);\n+\t\t\telse\n+\t\t\t\tscanDirectory(src, src, \"\");\n+\t\t}\n+\t\tfor (final Map.Entry<String, String> e : files.entrySet())\n+\t\t\tchosenSources.put(e.getKey(), new File(e.getValue()));\n+\n+\t\tzos = new ZipOutputStream(System.out);\n+\t\tzos.setLevel(9);\n+\n+\t\tfor (final File src : includes) {\n+\t\t\tif (src.isFile())\n+\t\t\t\tappendJar(src);\n+\t\t\telse\n+\t\t\t\tappendDirectory(src, src, \"\");\n+\t\t}\n+\t\tfor (final String name : files.keySet())\n+\t\t\tappendFile(chosenSources.get(name), name);\n+\n+\t\tzos.close();\n+\t}\n+\n+\tprivate void scanJar(final File jarPath) throws IOException {\n+\t\tfinal ZipFile zf = new ZipFile(jarPath);\n+\t\tfinal Enumeration<? extends ZipEntry> e = zf.entries();\n+\t\twhile (e.hasMoreElements())\n+\t\t\tchosenSources.put(e.nextElement().getName(), jarPath);\n+\t\tzf.close();\n+\t}\n+\n+\tprivate void scanDirectory(final File rootPath, final File dirPath,\n+\t\t\tfinal String pfx) throws IOException {\n+\t\tfinal File[] entries = dirPath.listFiles();\n+\t\tif (entries == null)\n+\t\t\treturn;\n+\t\tfor (final File e : entries) {\n+\t\t\tif (e.getName().equals(\".\") || e.getName().equals(\"..\"))\n+\t\t\t\tcontinue;\n+\n+\t\t\tif (e.isDirectory())\n+\t\t\t\tscanDirectory(rootPath, e, pfx + e.getName() + \"/\");\n+\t\t\telse\n+\t\t\t\tchosenSources.put(pfx + e.getName(), rootPath);\n+\t\t}\n+\t}\n+\n+\tprivate void appendJar(final File jarPath) throws IOException {\n+\t\tfinal ZipFile zf = new ZipFile(jarPath);\n+\t\tfinal Enumeration<? extends ZipEntry> e = zf.entries();\n+\t\twhile (e.hasMoreElements()) {\n+\t\t\tfinal ZipEntry ze = e.nextElement();\n+\t\t\tfinal String name = ze.getName();\n+\t\t\tif (chosenSources.get(name) == jarPath)\n+\t\t\t\tappendEntry(name, ze.getSize(), ze.getTime(), zf\n+\t\t\t\t\t\t.getInputStream(ze));\n+\t\t}\n+\t\tzf.close();\n+\t}\n+\n+\tprivate void appendDirectory(final File rootDir, final File dirPath,\n+\t\t\tfinal String pfx) throws IOException {\n+\t\tfinal File[] entries = dirPath.listFiles();\n+\t\tif (entries == null)\n+\t\t\treturn;\n+\t\tfor (final File e : entries) {\n+\t\t\tif (e.getName().equals(\".\") || e.getName().equals(\"..\"))\n+\t\t\t\tcontinue;\n+\n+\t\t\tif (e.isDirectory())\n+\t\t\t\tappendDirectory(rootDir, e, pfx + e.getName() + \"/\");\n+\t\t\telse if (chosenSources.get(pfx + e.getName()) == rootDir)\n+\t\t\t\tappendFile(e, pfx + e.getName());\n+\t\t}\n+\t}\n+\n+\tprivate void appendFile(final File path, final String name)\n+\t\t\tthrows IOException {\n+\t\tfinal long len = path.length();\n+\t\tfinal long time = path.lastModified();\n+\t\tfinal InputStream is = new FileInputStream(path);\n+\t\tappendEntry(name, len, time, is);\n+\t}\n+\n+\tprivate void appendEntry(final String name, final long len,\n+\t\t\tfinal long time, final InputStream is) throws IOException {\n+\t\tfinal ZipEntry ze = new ZipEntry(name);\n+\t\tze.setSize(len);\n+\t\tze.setTime(time);\n+\t\tzos.putNextEntry(ze);\n+\t\ttry {\n+\t\t\tfinal byte[] buf = new byte[4096];\n+\t\t\tint n;\n+\t\t\twhile ((n = is.read(buf)) >= 0)\n+\t\t\t\tzos.write(buf, 0, n);\n+\t\t} finally {\n+\t\t\tis.close();\n+\t\t}\n+\t\tzos.closeEntry();\n+\t}\n+}\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83789","messageId":"1216345461-59382-6-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-5-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 05/28] Make TextBuiltin public so other packages can implement and use it","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:43:58Z","receivedAt":"2008-07-18T01:43:58Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Later we may want to place other command line programs into different\npackages, or permit the user to supply their own from their own JAR\nand package namespace.\n\nSigned-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../src/org/spearce/jgit/pgm/Die.java              |   17 +++++++++++-\n .../src/org/spearce/jgit/pgm/DiffTree.java         |    2 +-\n .../src/org/spearce/jgit/pgm/Fetch.java            |    2 +-\n .../src/org/spearce/jgit/pgm/IndexPack.java        |    2 +-\n .../src/org/spearce/jgit/pgm/LsRemote.java         |    2 +-\n .../src/org/spearce/jgit/pgm/LsTree.java           |    2 +-\n .../src/org/spearce/jgit/pgm/Main.java             |    2 +\n .../src/org/spearce/jgit/pgm/MergeBase.java        |    2 +-\n .../src/org/spearce/jgit/pgm/Push.java             |    2 +-\n .../org/spearce/jgit/pgm/RevWalkTextBuiltin.java   |    2 +-\n .../src/org/spearce/jgit/pgm/ShowRef.java          |    2 +-\n .../src/org/spearce/jgit/pgm/Tag.java              |    2 +-\n .../src/org/spearce/jgit/pgm/TextBuiltin.java      |   27 ++++++++++++++++++-\n 13 files changed, 52 insertions(+), 14 deletions(-)\n\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Die.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Die.java\nindex b372ff3..3ca898d 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Die.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Die.java\n@@ -37,10 +37,23 @@\n \n package org.spearce.jgit.pgm;\n \n-class Die extends RuntimeException {\n+/**\n+ * Indicates a {@link TextBuiltin} implementation has failed during execution.\n+ * <p>\n+ * Typically the stack trace for a Die exception is not shown to the user as it\n+ * may indicate a simple error condition that the end-user can fix on their own,\n+ * without needing a screen of Java stack frames.\n+ */\n+public class Die extends RuntimeException {\n \tprivate static final long serialVersionUID = 1L;\n \n-\tDie(final String why) {\n+\t/**\n+\t * Construct a new message explaining what has gone wrong.\n+\t * \n+\t * @param why\n+\t *            the message to show to the end-user.\n+\t */\n+\tpublic Die(final String why) {\n \t\tsuper(why);\n \t}\n }\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/DiffTree.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/DiffTree.java\nindex 74e8d2f..17858ba 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/DiffTree.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/DiffTree.java\n@@ -49,7 +49,7 @@ import org.spearce.jgit.treewalk.filter.TreeFilter;\n \n class DiffTree extends TextBuiltin {\n \t@Override\n-\tvoid execute(String[] args) throws Exception {\n+\tpublic void execute(String[] args) throws Exception {\n \t\tfinal TreeWalk walk = new TreeWalk(db);\n \t\tfinal List<String> argList = new ArrayList<String>();\n \t\tList<TreeFilter> pathLimiter = null;\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Fetch.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Fetch.java\nindex 8a35025..e5a0dce 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Fetch.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Fetch.java\n@@ -49,7 +49,7 @@ import org.spearce.jgit.transport.Transport;\n \n class Fetch extends TextBuiltin {\n \t@Override\n-\tvoid execute(String[] args) throws Exception {\n+\tpublic void execute(String[] args) throws Exception {\n \t\tint argi = 0;\n \t\tfor (; argi < args.length; argi++) {\n \t\t\tfinal String a = args[argi];\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/IndexPack.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/IndexPack.java\nindex 60926c1..5f4134d 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/IndexPack.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/IndexPack.java\n@@ -44,7 +44,7 @@ import org.spearce.jgit.lib.TextProgressMonitor;\n \n class IndexPack extends TextBuiltin {\n \t@Override\n-\tvoid execute(final String[] args) throws Exception {\n+\tpublic void execute(final String[] args) throws Exception {\n \t\tboolean fixThin = false;\n \t\tint argi = 0;\n \t\tint version = 0;\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/LsRemote.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/LsRemote.java\nindex 21e02ec..921bcff 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/LsRemote.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/LsRemote.java\n@@ -44,7 +44,7 @@ import org.spearce.jgit.transport.Transport;\n \n class LsRemote extends TextBuiltin {\n \t@Override\n-\tvoid execute(final String[] args) throws Exception {\n+\tpublic void execute(final String[] args) throws Exception {\n \t\tint argi = 0;\n \t\tfor (; argi < args.length; argi++) {\n \t\t\tfinal String a = args[argi];\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/LsTree.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/LsTree.java\nindex 05ec8c3..a0a7216 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/LsTree.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/LsTree.java\n@@ -46,7 +46,7 @@ import org.spearce.jgit.treewalk.TreeWalk;\n \n class LsTree extends TextBuiltin {\n \t@Override\n-\tvoid execute(final String[] args) throws Exception {\n+\tpublic void execute(final String[] args) throws Exception {\n \t\tfinal TreeWalk walk = new TreeWalk(db);\n \t\tint argi = 0;\n \t\tfor (; argi < args.length; argi++) {\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Main.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Main.java\nindex 3d507c6..a155039 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Main.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Main.java\n@@ -44,6 +44,8 @@ import java.util.Arrays;\n import org.spearce.jgit.awtui.AwtAuthenticator;\n import org.spearce.jgit.errors.TransportException;\n import org.spearce.jgit.lib.Repository;\n+import org.spearce.jgit.pgm.opt.CmdLineParser;\n+import org.spearce.jgit.pgm.opt.SubcommandHandler;\n import org.spearce.jgit.util.HttpSupport;\n \n /** Command line entry point. */\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/MergeBase.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/MergeBase.java\nindex c8381f5..c1648a0 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/MergeBase.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/MergeBase.java\n@@ -43,7 +43,7 @@ import org.spearce.jgit.revwalk.filter.RevFilter;\n \n class MergeBase extends TextBuiltin {\n \t@Override\n-\tvoid execute(final String[] args) throws Exception {\n+\tpublic void execute(final String[] args) throws Exception {\n \t\tfinal RevWalk walk = new RevWalk(db);\n \t\tint max = 1;\n \t\tfor (final String a : args) {\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Push.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Push.java\nindex ef93f2f..5671cc5 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Push.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Push.java\n@@ -55,7 +55,7 @@ class Push extends TextBuiltin {\n \tprivate boolean first = true;\n \n \t@Override\n-\tvoid execute(String[] args) throws Exception {\n+\tpublic void execute(String[] args) throws Exception {\n \t\tfinal LinkedList<RefSpec> refSpecs = new LinkedList<RefSpec>();\n \t\tBoolean thin = null;\n \t\tString exec = null;\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/RevWalkTextBuiltin.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/RevWalkTextBuiltin.java\nindex b992767..2aba3c5 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/RevWalkTextBuiltin.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/RevWalkTextBuiltin.java\n@@ -69,7 +69,7 @@ abstract class RevWalkTextBuiltin extends TextBuiltin {\n \tchar[] outbuffer = new char[Constants.OBJECT_ID_LENGTH * 2];\n \n \t@Override\n-\tfinal void execute(String[] args) throws Exception {\n+\tpublic final void execute(String[] args) throws Exception {\n \t\tfinal EnumSet<RevSort> sorting = EnumSet.noneOf(RevSort.class);\n \t\tfinal List<String> argList = new ArrayList<String>();\n \t\tfinal List<RevFilter> revLimiter = new ArrayList<RevFilter>();\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/ShowRef.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/ShowRef.java\nindex c7cd76e..576e342 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/ShowRef.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/ShowRef.java\n@@ -44,7 +44,7 @@ import org.spearce.jgit.lib.Ref;\n \n class ShowRef extends TextBuiltin {\n \t@Override\n-\tvoid execute(String[] args) throws Exception {\n+\tpublic void execute(String[] args) throws Exception {\n \t\tfor (final Ref r : new TreeMap<String, Ref>(db.getAllRefs()).values()) {\n \t\t\tshow(r.getObjectId(), r.getName());\n \t\t\tif (r.getPeeledObjectId() != null)\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Tag.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Tag.java\nindex 10b8aa0..d59616b 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Tag.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Tag.java\n@@ -42,7 +42,7 @@ import org.spearce.jgit.lib.PersonIdent;\n \n class Tag extends TextBuiltin {\n \t@Override\n-\tvoid execute(String[] args) throws Exception {\n+\tpublic void execute(String[] args) throws Exception {\n \t\tString tagName = null;\n \t\tString message = null;\n \t\tString ref = \"HEAD\";\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/TextBuiltin.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/TextBuiltin.java\nindex b3d8f39..5f2fbce 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/TextBuiltin.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/TextBuiltin.java\n@@ -47,15 +47,28 @@ import org.spearce.jgit.lib.Constants;\n import org.spearce.jgit.lib.ObjectId;\n import org.spearce.jgit.lib.Repository;\n \n-abstract class TextBuiltin {\n+/**\n+ * Abstract command which can be invoked from the command line.\n+ * <p>\n+ * Commands are configured with a single \"current\" repository and then the\n+ * {@link #execute(String[])} method is invoked with the arguments that appear\n+ * on the command line after the command name.\n+ * <p>\n+ * Command constructors should perform as little work as possible as they may be\n+ * invoked very early during process loading, and the command may not execute\n+ * even though it was constructed.\n+ */\n+public abstract class TextBuiltin {\n \tprotected static final String REFS_HEADS = Constants.HEADS_PREFIX + \"/\";\n \n \tprotected static final String REFS_REMOTES = Constants.REMOTES_PREFIX + \"/\";\n \n \tprotected static final String REFS_TAGS = Constants.TAGS_PREFIX + \"/\";\n \n+\t/** Stream to output to, typically this is standard output. */\n \tprotected PrintWriter out;\n \n+\t/** Git repository the command was invoked within. */\n \tprotected Repository db;\n \n \tTextBuiltin() {\n@@ -67,7 +80,17 @@ abstract class TextBuiltin {\n \t\t}\n \t}\n \n-\tabstract void execute(String[] args) throws Exception;\n+\t/**\n+\t * Perform the action(s) of this command.\n+\t * \n+\t * @param args\n+\t *            command line arguments passed after the command name.\n+\t * @throws Exception\n+\t *             an error occurred while processing the command. The main\n+\t *             framework will catch the exception and print a message on\n+\t *             standard error.\n+\t */\n+\tpublic abstract void execute(String[] args) throws Exception;\n \n \tprotected ObjectId resolve(final String s) throws IOException {\n \t\tfinal ObjectId r = db.resolve(s);\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83790","messageId":"1216345461-59382-7-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-6-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 06/28] Initialize TextBuiltins with the repository before execution","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:43:59Z","receivedAt":"2008-07-18T01:43:59Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"This way the default constructor used by the option parser does\nnot cause the output stream to allocate until we have chosen to\nreally work with this builtin command and have a repository for\nit to read/write against.\n\nSigned-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../src/org/spearce/jgit/pgm/Main.java             |    2 +-\n .../src/org/spearce/jgit/pgm/TextBuiltin.java      |    3 ++-\n 2 files changed, 3 insertions(+), 2 deletions(-)\n\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Main.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Main.java\nindex a155039..68748bf 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Main.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Main.java\n@@ -110,7 +110,7 @@ public class Main {\n \t\t}\n \n \t\tfinal TextBuiltin cmd = createCommand(argv[argi++]);\n-\t\tcmd.db = new Repository(gitdir);\n+\t\tcmd.init(new Repository(gitdir));\n \t\ttry {\n \t\t\tcmd.execute(subarray(argv, argi));\n \t\t} finally {\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/TextBuiltin.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/TextBuiltin.java\nindex 5f2fbce..05ad211 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/TextBuiltin.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/TextBuiltin.java\n@@ -71,13 +71,14 @@ public abstract class TextBuiltin {\n \t/** Git repository the command was invoked within. */\n \tprotected Repository db;\n \n-\tTextBuiltin() {\n+\tvoid init(final Repository repo) {\n \t\ttry {\n \t\t\tout = new PrintWriter(new BufferedWriter(new OutputStreamWriter(\n \t\t\t\t\tSystem.out, \"UTF-8\")));\n \t\t} catch (IOException e) {\n \t\t\tthrow die(\"cannot create output stream\");\n \t\t}\n+\t\tdb = repo;\n \t}\n \n \t/**\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83794","messageId":"1216345461-59382-8-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-7-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 07/28] Define our own extended CmdLineParser for extra parsing support","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:44:00Z","receivedAt":"2008-07-18T01:44:00Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"A specialized CmdLineParser subclass is used to automatically handle\n`--git-dir=foo`, as args4j wants to see `--git-dir foo` instead.\nWe split on the first equal sign on a long option and use that to\ndelimit the value from the option name.\n\nWe stop this long option fixup at the first -- found on the command\nline, as this is a traditional delimiter between options and only\narguments.  This is an assumption that all of our users of a command\nline parser support would want to terminate option parsing at the\nfirst -- they see on the command line, and thus it is OK to stop\nour GNU long optino style cleanup.\n\nSigned-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../org/spearce/jgit/pgm/opt/CmdLineParser.java    |  157 ++++++++++++++++++++\n 1 files changed, 157 insertions(+), 0 deletions(-)\n create mode 100644 org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/CmdLineParser.java\n\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/CmdLineParser.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/CmdLineParser.java\nnew file mode 100644\nindex 0000000..257d88f\n--- /dev/null\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/CmdLineParser.java\n@@ -0,0 +1,157 @@\n+/*\n+ * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>\n+ *\n+ * All rights reserved.\n+ *\n+ * Redistribution and use in source and binary forms, with or\n+ * without modification, are permitted provided that the following\n+ * conditions are met:\n+ *\n+ * - Redistributions of source code must retain the above copyright\n+ *   notice, this list of conditions and the following disclaimer.\n+ *\n+ * - Redistributions in binary form must reproduce the above\n+ *   copyright notice, this list of conditions and the following\n+ *   disclaimer in the documentation and/or other materials provided\n+ *   with the distribution.\n+ *\n+ * - Neither the name of the Git Development Community nor the\n+ *   names of its contributors may be used to endorse or promote\n+ *   products derived from this software without specific prior\n+ *   written permission.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n+ * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+package org.spearce.jgit.pgm.opt;\n+\n+import java.util.ArrayList;\n+\n+import org.kohsuke.args4j.Argument;\n+import org.kohsuke.args4j.CmdLineException;\n+import org.kohsuke.args4j.IllegalAnnotationError;\n+import org.kohsuke.args4j.Option;\n+import org.spearce.jgit.lib.Repository;\n+import org.spearce.jgit.pgm.TextBuiltin;\n+import org.spearce.jgit.revwalk.RevWalk;\n+\n+/**\n+ * Extended command line parser which handles --foo=value arguments.\n+ * <p>\n+ * The args4j package does not natively handle --foo=value and instead prefers\n+ * to see --foo value on the command line. Many users are used to the GNU style\n+ * --foo=value long option, so we convert from the GNU style format to the\n+ * args4j style format prior to invoking args4j for parsing.\n+ */\n+public class CmdLineParser extends org.kohsuke.args4j.CmdLineParser {\n+\tprivate final Repository db;\n+\n+\tprivate RevWalk walk;\n+\n+\t/**\n+\t * Creates a new command line owner that parses arguments/options and set\n+\t * them into the given object.\n+\t * \n+\t * @param bean\n+\t *            instance of a class annotated by {@link Option} and\n+\t *            {@link Argument}. this object will receive values.\n+\t * \n+\t * @throws IllegalAnnotationError\n+\t *             if the option bean class is using args4j annotations\n+\t *             incorrectly.\n+\t */\n+\tpublic CmdLineParser(final Object bean) {\n+\t\tthis(bean, null);\n+\t}\n+\n+\t/**\n+\t * Creates a new command line owner that parses arguments/options and set\n+\t * them into the given object.\n+\t * \n+\t * @param bean\n+\t *            instance of a class annotated by {@link Option} and\n+\t *            {@link Argument}. this object will receive values.\n+\t * @param repo\n+\t *            repository this parser can translate options through.\n+\t * @throws IllegalAnnotationError\n+\t *             if the option bean class is using args4j annotations\n+\t *             incorrectly.\n+\t */\n+\tpublic CmdLineParser(final Object bean, Repository repo) {\n+\t\tsuper(bean);\n+\t\tif (repo == null && bean instanceof TextBuiltin)\n+\t\t\trepo = ((TextBuiltin) bean).getRepository();\n+\t\tthis.db = repo;\n+\t}\n+\n+\t@Override\n+\tpublic void parseArgument(final String... args) throws CmdLineException {\n+\t\tfinal ArrayList<String> tmp = new ArrayList<String>(args.length);\n+\t\tfor (int argi = 0; argi < args.length; argi++) {\n+\t\t\tfinal String str = args[argi];\n+\t\t\tif (str.equals(\"--\")) {\n+\t\t\t\twhile (argi < args.length)\n+\t\t\t\t\ttmp.add(args[argi++]);\n+\t\t\t\tbreak;\n+\t\t\t}\n+\n+\t\t\tif (str.startsWith(\"--\")) {\n+\t\t\t\tfinal int eq = str.indexOf('=');\n+\t\t\t\tif (eq > 0) {\n+\t\t\t\t\ttmp.add(str.substring(0, eq));\n+\t\t\t\t\ttmp.add(str.substring(eq + 1));\n+\t\t\t\t\tcontinue;\n+\t\t\t\t}\n+\t\t\t}\n+\n+\t\t\ttmp.add(str);\n+\t\t}\n+\n+\t\tsuper.parseArgument(tmp.toArray(new String[tmp.size()]));\n+\t}\n+\n+\t/**\n+\t * Get the repository this parser translates values through.\n+\t * \n+\t * @return the repository, if specified during construction.\n+\t */\n+\tpublic Repository getRepository() {\n+\t\tif (db == null)\n+\t\t\tthrow new IllegalStateException(\"No Git repository configured.\");\n+\t\treturn db;\n+\t}\n+\n+\t/**\n+\t * Get the revision walker used to support option parsing.\n+\t * \n+\t * @return the revision walk used by this option parser.\n+\t */\n+\tpublic RevWalk getRevWalk() {\n+\t\tif (walk == null)\n+\t\t\twalk = new RevWalk(getRepository());\n+\t\treturn walk;\n+\t}\n+\n+\t/**\n+\t * Get the revision walker used to support option parsing.\n+\t * <p>\n+\t * This method does not initialize the RevWalk and may return null.\n+\t * \n+\t * @return the revision walk used by this option parser, or null.\n+\t */\n+\tpublic RevWalk getRevWalkGently() {\n+\t\treturn walk;\n+\t}\n+}\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83792","messageId":"1216345461-59382-9-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-8-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 08/28] Add parseTree method to RevWalk to obtain a RevTree from AnyObjectId","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:44:01Z","receivedAt":"2008-07-18T01:44:01Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Some applications want to dereference an ObjectId back to a tree,\nand they don't care what type of object the ObjectId supplied is\nactually of.  If its an annotated tag we can peel the tag back to\neither a tree, or a commit, and a commit can be peeled back to its\nonly tree.  So parseTree is a simple API for ^{tree}.\n\nSigned-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../src/org/spearce/jgit/revwalk/RevWalk.java      |   35 ++++++++++++++++++++\n 1 files changed, 35 insertions(+), 0 deletions(-)\n\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/revwalk/RevWalk.java b/org.spearce.jgit/src/org/spearce/jgit/revwalk/RevWalk.java\nindex 946486c..42ec2a2 100644\n--- a/org.spearce.jgit/src/org/spearce/jgit/revwalk/RevWalk.java\n+++ b/org.spearce.jgit/src/org/spearce/jgit/revwalk/RevWalk.java\n@@ -612,6 +612,41 @@ public class RevWalk implements Iterable<RevCommit> {\n \t}\n \n \t/**\n+\t * Locate a reference to a tree.\n+\t * <p>\n+\t * This method only returns successfully if the tree object exists, is\n+\t * verified to be a tree, and was parsed without error.\n+\t * \n+\t * @param id\n+\t *            name of the tree object, or a commit or annotated tag that may\n+\t *            reference a tree.\n+\t * @return reference to the tree object. Never null.\n+\t * @throws MissingObjectException\n+\t *             the supplied tree does not exist.\n+\t * @throws IncorrectObjectTypeException\n+\t *             the supplied id is not a tree, a commit or an annotated tag.\n+\t * @throws IOException\n+\t *             a pack file or loose object could not be read.\n+\t */\n+\tpublic RevTree parseTree(final AnyObjectId id)\n+\t\t\tthrows MissingObjectException, IncorrectObjectTypeException,\n+\t\t\tIOException {\n+\t\tRevObject c = parseAny(id);\n+\t\twhile (c instanceof RevTag) {\n+\t\t\tc = ((RevTag) c).getObject();\n+\t\t\tparse(c);\n+\t\t}\n+\t\tif (c instanceof RevCommit) {\n+\t\t\tc = ((RevCommit) c).getTree();\n+\t\t\tparse(c);\n+\t\t}\n+\t\tfinal RevTree t = (RevTree) c;\n+\t\tif (db.openObject(t).getType() != Constants.OBJ_TREE)\n+\t\t\tthrow new IncorrectObjectTypeException(t, Constants.TYPE_TREE);\n+\t\treturn t;\n+\t}\n+\n+\t/**\n \t * Locate a reference to any object and immediately parse its content.\n \t * <p>\n \t * This method only returns successfully if the object exists and was parsed\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83793","messageId":"1216345461-59382-10-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-9-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 09/28] Add option handler for AbstractTreeIterator values","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:44:02Z","receivedAt":"2008-07-18T01:44:02Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Converts String to AbstractTreeIterator on demand.  A string\nthat can be resolved as a RevTree is read with a canonical\ntree iterator, as it is a standard Git tree already stored in\nthe object database.  Otherwise we assume it is a local file\nand scan the filesystem, as it may be a working directory.\n\nSigned-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../jgit/pgm/opt/AbstractTreeIteratorHandler.java  |  121 ++++++++++++++++++++\n 1 files changed, 121 insertions(+), 0 deletions(-)\n create mode 100644 org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/AbstractTreeIteratorHandler.java\n\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/AbstractTreeIteratorHandler.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/AbstractTreeIteratorHandler.java\nnew file mode 100644\nindex 0000000..31d1c84\n--- /dev/null\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/AbstractTreeIteratorHandler.java\n@@ -0,0 +1,121 @@\n+/*\n+ * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>\n+ *\n+ * All rights reserved.\n+ *\n+ * Redistribution and use in source and binary forms, with or\n+ * without modification, are permitted provided that the following\n+ * conditions are met:\n+ *\n+ * - Redistributions of source code must retain the above copyright\n+ *   notice, this list of conditions and the following disclaimer.\n+ *\n+ * - Redistributions in binary form must reproduce the above\n+ *   copyright notice, this list of conditions and the following\n+ *   disclaimer in the documentation and/or other materials provided\n+ *   with the distribution.\n+ *\n+ * - Neither the name of the Git Development Community nor the\n+ *   names of its contributors may be used to endorse or promote\n+ *   products derived from this software without specific prior\n+ *   written permission.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n+ * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+package org.spearce.jgit.pgm.opt;\n+\n+import java.io.File;\n+import java.io.IOException;\n+\n+import org.kohsuke.args4j.CmdLineException;\n+import org.kohsuke.args4j.CmdLineParser;\n+import org.kohsuke.args4j.OptionDef;\n+import org.kohsuke.args4j.spi.OptionHandler;\n+import org.kohsuke.args4j.spi.Parameters;\n+import org.kohsuke.args4j.spi.Setter;\n+import org.spearce.jgit.errors.IncorrectObjectTypeException;\n+import org.spearce.jgit.errors.MissingObjectException;\n+import org.spearce.jgit.lib.ObjectId;\n+import org.spearce.jgit.treewalk.AbstractTreeIterator;\n+import org.spearce.jgit.treewalk.CanonicalTreeParser;\n+import org.spearce.jgit.treewalk.FileTreeIterator;\n+\n+/**\n+ * Custom argument handler {@link AbstractTreeIterator} from string values.\n+ * <p>\n+ * Assumes the parser has been initialized with a Repository.\n+ */\n+public class AbstractTreeIteratorHandler extends\n+\t\tOptionHandler<AbstractTreeIterator> {\n+\tprivate final org.spearce.jgit.pgm.opt.CmdLineParser clp;\n+\n+\t/**\n+\t * Create a new handler for the command name.\n+\t * <p>\n+\t * This constructor is used only by args4j.\n+\t * \n+\t * @param parser\n+\t * @param option\n+\t * @param setter\n+\t */\n+\tpublic AbstractTreeIteratorHandler(final CmdLineParser parser,\n+\t\t\tfinal OptionDef option,\n+\t\t\tfinal Setter<? super AbstractTreeIterator> setter) {\n+\t\tsuper(parser, option, setter);\n+\t\tclp = (org.spearce.jgit.pgm.opt.CmdLineParser) parser;\n+\t}\n+\n+\t@Override\n+\tpublic int parseArguments(final Parameters params) throws CmdLineException {\n+\t\tfinal String name = params.getParameter(0);\n+\n+\t\tif (new File(name).isDirectory()) {\n+\t\t\tsetter.addValue(new FileTreeIterator(new File(name)));\n+\t\t\treturn 1;\n+\t\t}\n+\n+\t\tfinal ObjectId id;\n+\t\ttry {\n+\t\t\tid = clp.getRepository().resolve(name);\n+\t\t} catch (IOException e) {\n+\t\t\tthrow new CmdLineException(e.getMessage());\n+\t\t}\n+\t\tif (id == null)\n+\t\t\tthrow new CmdLineException(name + \" is not a tree\");\n+\n+\t\tfinal CanonicalTreeParser p = new CanonicalTreeParser();\n+\t\ttry {\n+\t\t\tp.reset(clp.getRepository(), clp.getRevWalk().parseTree(id));\n+\t\t} catch (ClassCastException e) {\n+\t\t\tthrow new CmdLineException(name + \" is not a tree\");\n+\t\t} catch (MissingObjectException e) {\n+\t\t\tthrow new CmdLineException(name + \" is not a tree\");\n+\t\t} catch (IncorrectObjectTypeException e) {\n+\t\t\tthrow new CmdLineException(name + \" is not a tree\");\n+\t\t} catch (IOException e) {\n+\t\t\tthrow new CmdLineException(\"cannot read \" + name + \": \"\n+\t\t\t\t\t+ e.getMessage());\n+\t\t}\n+\n+\t\tsetter.addValue(p);\n+\t\treturn 1;\n+\t}\n+\n+\t@Override\n+\tpublic String getDefaultMetaVariable() {\n+\t\treturn \"tree-ish\";\n+\t}\n+}\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83795","messageId":"1216345461-59382-11-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-10-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 10/28] Add option handler for ObjectId values","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:44:03Z","receivedAt":"2008-07-18T01:44:03Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Converts String to ObjectId on demand.  The conversion\ntries to apply revision parsing when possible.\n\nSigned-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../org/spearce/jgit/pgm/opt/ObjectIdHandler.java  |   94 ++++++++++++++++++++\n 1 files changed, 94 insertions(+), 0 deletions(-)\n create mode 100644 org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/ObjectIdHandler.java\n\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/ObjectIdHandler.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/ObjectIdHandler.java\nnew file mode 100644\nindex 0000000..bbdfbe3\n--- /dev/null\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/ObjectIdHandler.java\n@@ -0,0 +1,94 @@\n+/*\n+ * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>\n+ *\n+ * All rights reserved.\n+ *\n+ * Redistribution and use in source and binary forms, with or\n+ * without modification, are permitted provided that the following\n+ * conditions are met:\n+ *\n+ * - Redistributions of source code must retain the above copyright\n+ *   notice, this list of conditions and the following disclaimer.\n+ *\n+ * - Redistributions in binary form must reproduce the above\n+ *   copyright notice, this list of conditions and the following\n+ *   disclaimer in the documentation and/or other materials provided\n+ *   with the distribution.\n+ *\n+ * - Neither the name of the Git Development Community nor the\n+ *   names of its contributors may be used to endorse or promote\n+ *   products derived from this software without specific prior\n+ *   written permission.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n+ * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+package org.spearce.jgit.pgm.opt;\n+\n+import java.io.IOException;\n+\n+import org.kohsuke.args4j.CmdLineException;\n+import org.kohsuke.args4j.CmdLineParser;\n+import org.kohsuke.args4j.OptionDef;\n+import org.kohsuke.args4j.spi.OptionHandler;\n+import org.kohsuke.args4j.spi.Parameters;\n+import org.kohsuke.args4j.spi.Setter;\n+import org.spearce.jgit.lib.ObjectId;\n+\n+/**\n+ * Custom argument handler {@link ObjectId} from string values.\n+ * <p>\n+ * Assumes the parser has been initialized with a Repository.\n+ */\n+public class ObjectIdHandler extends OptionHandler<ObjectId> {\n+\tprivate final org.spearce.jgit.pgm.opt.CmdLineParser clp;\n+\n+\t/**\n+\t * Create a new handler for the command name.\n+\t * <p>\n+\t * This constructor is used only by args4j.\n+\t * \n+\t * @param parser\n+\t * @param option\n+\t * @param setter\n+\t */\n+\tpublic ObjectIdHandler(final CmdLineParser parser, final OptionDef option,\n+\t\t\tfinal Setter<? super ObjectId> setter) {\n+\t\tsuper(parser, option, setter);\n+\t\tclp = (org.spearce.jgit.pgm.opt.CmdLineParser) parser;\n+\t}\n+\n+\t@Override\n+\tpublic int parseArguments(final Parameters params) throws CmdLineException {\n+\t\tfinal String name = params.getParameter(0);\n+\t\tfinal ObjectId id;\n+\t\ttry {\n+\t\t\tid = clp.getRepository().resolve(name);\n+\t\t} catch (IOException e) {\n+\t\t\tthrow new CmdLineException(e.getMessage());\n+\t\t}\n+\t\tif (id != null) {\n+\t\t\tsetter.addValue(id);\n+\t\t\treturn 1;\n+\t\t}\n+\n+\t\tthrow new CmdLineException(name + \" is not an object\");\n+\t}\n+\n+\t@Override\n+\tpublic String getDefaultMetaVariable() {\n+\t\treturn \"object\";\n+\t}\n+}\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83797","messageId":"1216345461-59382-12-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-11-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 11/28] Add option handler for PathTreeFilter values","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:44:04Z","receivedAt":"2008-07-18T01:44:04Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Converts one or more Strings, up to the end of the command line,\ninto a PathFilterGroup.  The filter group can be used with a\nTreeWalk to limit its results.\n\nSigned-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../jgit/pgm/opt/PathTreeFilterHandler.java        |  102 ++++++++++++++++++++\n 1 files changed, 102 insertions(+), 0 deletions(-)\n create mode 100644 org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/PathTreeFilterHandler.java\n\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/PathTreeFilterHandler.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/PathTreeFilterHandler.java\nnew file mode 100644\nindex 0000000..8a0b5a6\n--- /dev/null\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/PathTreeFilterHandler.java\n@@ -0,0 +1,102 @@\n+/*\n+ * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>\n+ *\n+ * All rights reserved.\n+ *\n+ * Redistribution and use in source and binary forms, with or\n+ * without modification, are permitted provided that the following\n+ * conditions are met:\n+ *\n+ * - Redistributions of source code must retain the above copyright\n+ *   notice, this list of conditions and the following disclaimer.\n+ *\n+ * - Redistributions in binary form must reproduce the above\n+ *   copyright notice, this list of conditions and the following\n+ *   disclaimer in the documentation and/or other materials provided\n+ *   with the distribution.\n+ *\n+ * - Neither the name of the Git Development Community nor the\n+ *   names of its contributors may be used to endorse or promote\n+ *   products derived from this software without specific prior\n+ *   written permission.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n+ * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+package org.spearce.jgit.pgm.opt;\n+\n+import java.util.ArrayList;\n+import java.util.List;\n+\n+import org.kohsuke.args4j.CmdLineException;\n+import org.kohsuke.args4j.CmdLineParser;\n+import org.kohsuke.args4j.Option;\n+import org.kohsuke.args4j.OptionDef;\n+import org.kohsuke.args4j.spi.OptionHandler;\n+import org.kohsuke.args4j.spi.Parameters;\n+import org.kohsuke.args4j.spi.Setter;\n+import org.spearce.jgit.treewalk.filter.PathFilter;\n+import org.spearce.jgit.treewalk.filter.PathFilterGroup;\n+import org.spearce.jgit.treewalk.filter.TreeFilter;\n+\n+/**\n+ * Create a {@link TreeFilter} to patch math names.\n+ * <p>\n+ * This handler consumes all arguments to the end of the command line, and is\n+ * meant to be used on an {@link Option} of name \"--\".\n+ */\n+public class PathTreeFilterHandler extends OptionHandler<TreeFilter> {\n+\t/**\n+\t * Create a new handler for the command name.\n+\t * <p>\n+\t * This constructor is used only by args4j.\n+\t * \n+\t * @param parser\n+\t * @param option\n+\t * @param setter\n+\t */\n+\tpublic PathTreeFilterHandler(final CmdLineParser parser,\n+\t\t\tfinal OptionDef option, final Setter<? super TreeFilter> setter) {\n+\t\tsuper(parser, option, setter);\n+\t}\n+\n+\t@Override\n+\tpublic int parseArguments(final Parameters params) throws CmdLineException {\n+\t\tfinal List<PathFilter> filters = new ArrayList<PathFilter>();\n+\t\tfor (int idx = 0;; idx++) {\n+\t\t\tfinal String path;\n+\t\t\ttry {\n+\t\t\t\tpath = params.getParameter(idx);\n+\t\t\t} catch (CmdLineException cle) {\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t\tfilters.add(PathFilter.create(path));\n+\t\t}\n+\n+\t\tif (filters.size() == 0)\n+\t\t\treturn 0;\n+\t\tif (filters.size() == 1) {\n+\t\t\tsetter.addValue(filters.get(0));\n+\t\t\treturn 1;\n+\t\t}\n+\t\tsetter.addValue(PathFilterGroup.create(filters));\n+\t\treturn filters.size();\n+\t}\n+\n+\t@Override\n+\tpublic String getDefaultMetaVariable() {\n+\t\treturn \"path ...\";\n+\t}\n+}\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83798","messageId":"1216345461-59382-13-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-12-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 12/28] Add option handler for RefSpec values","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:44:05Z","receivedAt":"2008-07-18T01:44:05Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Converts a string into a RefSpec.  RefSpec values are popular\non the command line for transport programs like fetch and push.\n\nSigned-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../org/spearce/jgit/pgm/opt/RefSpecHandler.java   |   78 ++++++++++++++++++++\n 1 files changed, 78 insertions(+), 0 deletions(-)\n create mode 100644 org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/RefSpecHandler.java\n\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/RefSpecHandler.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/RefSpecHandler.java\nnew file mode 100644\nindex 0000000..959b215\n--- /dev/null\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/RefSpecHandler.java\n@@ -0,0 +1,78 @@\n+/*\n+ * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>\n+ *\n+ * All rights reserved.\n+ *\n+ * Redistribution and use in source and binary forms, with or\n+ * without modification, are permitted provided that the following\n+ * conditions are met:\n+ *\n+ * - Redistributions of source code must retain the above copyright\n+ *   notice, this list of conditions and the following disclaimer.\n+ *\n+ * - Redistributions in binary form must reproduce the above\n+ *   copyright notice, this list of conditions and the following\n+ *   disclaimer in the documentation and/or other materials provided\n+ *   with the distribution.\n+ *\n+ * - Neither the name of the Git Development Community nor the\n+ *   names of its contributors may be used to endorse or promote\n+ *   products derived from this software without specific prior\n+ *   written permission.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n+ * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+package org.spearce.jgit.pgm.opt;\n+\n+import org.kohsuke.args4j.CmdLineException;\n+import org.kohsuke.args4j.CmdLineParser;\n+import org.kohsuke.args4j.OptionDef;\n+import org.kohsuke.args4j.spi.OptionHandler;\n+import org.kohsuke.args4j.spi.Parameters;\n+import org.kohsuke.args4j.spi.Setter;\n+import org.spearce.jgit.transport.RefSpec;\n+\n+/**\n+ * Custom argument handler {@link RefSpec} from string values.\n+ * <p>\n+ * Assumes the parser has been initialized with a Repository.\n+ */\n+public class RefSpecHandler extends OptionHandler<RefSpec> {\n+\t/**\n+\t * Create a new handler for the command name.\n+\t * <p>\n+\t * This constructor is used only by args4j.\n+\t * \n+\t * @param parser\n+\t * @param option\n+\t * @param setter\n+\t */\n+\tpublic RefSpecHandler(final CmdLineParser parser, final OptionDef option,\n+\t\t\tfinal Setter<? super RefSpec> setter) {\n+\t\tsuper(parser, option, setter);\n+\t}\n+\n+\t@Override\n+\tpublic int parseArguments(final Parameters params) throws CmdLineException {\n+\t\tsetter.addValue(new RefSpec(params.getParameter(0)));\n+\t\treturn 1;\n+\t}\n+\n+\t@Override\n+\tpublic String getDefaultMetaVariable() {\n+\t\treturn \"refspec\";\n+\t}\n+}\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83799","messageId":"1216345461-59382-14-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-13-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 13/28] Add option handler for RevCommit values","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:44:06Z","receivedAt":"2008-07-18T01:44:06Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Converts a String into a RevCommit, including parsing the string\nwith SHA-1 revision syntax and dereferencing through annotated\ntags as necessary.\n\nSigned-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../org/spearce/jgit/pgm/opt/RevCommitHandler.java |  141 ++++++++++++++++++++\n 1 files changed, 141 insertions(+), 0 deletions(-)\n create mode 100644 org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/RevCommitHandler.java\n\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/RevCommitHandler.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/RevCommitHandler.java\nnew file mode 100644\nindex 0000000..266e468\n--- /dev/null\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/RevCommitHandler.java\n@@ -0,0 +1,141 @@\n+/*\n+ * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>\n+ *\n+ * All rights reserved.\n+ *\n+ * Redistribution and use in source and binary forms, with or\n+ * without modification, are permitted provided that the following\n+ * conditions are met:\n+ *\n+ * - Redistributions of source code must retain the above copyright\n+ *   notice, this list of conditions and the following disclaimer.\n+ *\n+ * - Redistributions in binary form must reproduce the above\n+ *   copyright notice, this list of conditions and the following\n+ *   disclaimer in the documentation and/or other materials provided\n+ *   with the distribution.\n+ *\n+ * - Neither the name of the Git Development Community nor the\n+ *   names of its contributors may be used to endorse or promote\n+ *   products derived from this software without specific prior\n+ *   written permission.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n+ * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+package org.spearce.jgit.pgm.opt;\n+\n+import java.io.IOException;\n+\n+import org.kohsuke.args4j.CmdLineException;\n+import org.kohsuke.args4j.CmdLineParser;\n+import org.kohsuke.args4j.OptionDef;\n+import org.kohsuke.args4j.spi.OptionHandler;\n+import org.kohsuke.args4j.spi.Parameters;\n+import org.kohsuke.args4j.spi.Setter;\n+import org.spearce.jgit.errors.IncorrectObjectTypeException;\n+import org.spearce.jgit.errors.MissingObjectException;\n+import org.spearce.jgit.lib.ObjectId;\n+import org.spearce.jgit.revwalk.RevCommit;\n+import org.spearce.jgit.revwalk.RevFlag;\n+\n+/**\n+ * Custom argument handler {@link RevCommit} from string values.\n+ * <p>\n+ * Assumes the parser has been initialized with a Repository.\n+ */\n+public class RevCommitHandler extends OptionHandler<RevCommit> {\n+\tprivate final org.spearce.jgit.pgm.opt.CmdLineParser clp;\n+\n+\t/**\n+\t * Create a new handler for the command name.\n+\t * <p>\n+\t * This constructor is used only by args4j.\n+\t * \n+\t * @param parser\n+\t * @param option\n+\t * @param setter\n+\t */\n+\tpublic RevCommitHandler(final CmdLineParser parser, final OptionDef option,\n+\t\t\tfinal Setter<? super RevCommit> setter) {\n+\t\tsuper(parser, option, setter);\n+\t\tclp = (org.spearce.jgit.pgm.opt.CmdLineParser) parser;\n+\t}\n+\n+\t@Override\n+\tpublic int parseArguments(final Parameters params) throws CmdLineException {\n+\t\tString name = params.getParameter(0);\n+\n+\t\tboolean interesting = true;\n+\t\tif (name.startsWith(\"^\")) {\n+\t\t\tname = name.substring(1);\n+\t\t\tinteresting = false;\n+\t\t}\n+\n+\t\tfinal int dot2 = name.indexOf(\"..\");\n+\t\tif (dot2 != -1) {\n+\t\t\tif (!option.isMultiValued())\n+\t\t\t\tthrow new CmdLineException(\"Only one \" + option.metaVar()\n+\t\t\t\t\t\t+ \" expected in \" + name + \".\" + \"\");\n+\n+\t\t\tfinal String left = name.substring(0, dot2);\n+\t\t\tfinal String right = name.substring(dot2 + 2);\n+\t\t\taddOne(left, false);\n+\t\t\taddOne(right, true);\n+\t\t\treturn 1;\n+\t\t}\n+\n+\t\taddOne(name, interesting);\n+\t\treturn 1;\n+\t}\n+\n+\tprivate void addOne(final String name, final boolean interesting)\n+\t\t\tthrows CmdLineException {\n+\t\tfinal ObjectId id;\n+\t\ttry {\n+\t\t\tid = clp.getRepository().resolve(name);\n+\t\t} catch (IOException e) {\n+\t\t\tthrow new CmdLineException(e.getMessage());\n+\t\t}\n+\t\tif (id == null)\n+\t\t\tthrow new CmdLineException(name + \" is not a commit\");\n+\n+\t\tfinal RevCommit c;\n+\t\ttry {\n+\t\t\tc = clp.getRevWalk().parseCommit(id);\n+\t\t} catch (ClassCastException e) {\n+\t\t\tthrow new CmdLineException(name + \" is not a commit\");\n+\t\t} catch (MissingObjectException e) {\n+\t\t\tthrow new CmdLineException(name + \" is not a commit\");\n+\t\t} catch (IncorrectObjectTypeException e) {\n+\t\t\tthrow new CmdLineException(name + \" is not a commit\");\n+\t\t} catch (IOException e) {\n+\t\t\tthrow new CmdLineException(\"cannot read \" + name + \": \"\n+\t\t\t\t\t+ e.getMessage());\n+\t\t}\n+\n+\t\tif (interesting)\n+\t\t\tc.remove(RevFlag.UNINTERESTING);\n+\t\telse\n+\t\t\tc.add(RevFlag.UNINTERESTING);\n+\n+\t\tsetter.addValue(c);\n+\t}\n+\n+\t@Override\n+\tpublic String getDefaultMetaVariable() {\n+\t\treturn \"commit-ish\";\n+\t}\n+}\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83796","messageId":"1216345461-59382-15-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-14-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 14/28] Add option handler for RevTree values","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:44:07Z","receivedAt":"2008-07-18T01:44:07Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Converts a String into a RevTree, including parsing the string\nwith SHA-1 revision syntax and dereferencing through annotated\ntags as necessary.\n\nSigned-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../org/spearce/jgit/pgm/opt/RevTreeHandler.java   |  109 ++++++++++++++++++++\n 1 files changed, 109 insertions(+), 0 deletions(-)\n create mode 100644 org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/RevTreeHandler.java\n\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/RevTreeHandler.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/RevTreeHandler.java\nnew file mode 100644\nindex 0000000..eabc08a\n--- /dev/null\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/RevTreeHandler.java\n@@ -0,0 +1,109 @@\n+/*\n+ * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>\n+ *\n+ * All rights reserved.\n+ *\n+ * Redistribution and use in source and binary forms, with or\n+ * without modification, are permitted provided that the following\n+ * conditions are met:\n+ *\n+ * - Redistributions of source code must retain the above copyright\n+ *   notice, this list of conditions and the following disclaimer.\n+ *\n+ * - Redistributions in binary form must reproduce the above\n+ *   copyright notice, this list of conditions and the following\n+ *   disclaimer in the documentation and/or other materials provided\n+ *   with the distribution.\n+ *\n+ * - Neither the name of the Git Development Community nor the\n+ *   names of its contributors may be used to endorse or promote\n+ *   products derived from this software without specific prior\n+ *   written permission.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n+ * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+package org.spearce.jgit.pgm.opt;\n+\n+import java.io.IOException;\n+\n+import org.kohsuke.args4j.CmdLineException;\n+import org.kohsuke.args4j.CmdLineParser;\n+import org.kohsuke.args4j.OptionDef;\n+import org.kohsuke.args4j.spi.OptionHandler;\n+import org.kohsuke.args4j.spi.Parameters;\n+import org.kohsuke.args4j.spi.Setter;\n+import org.spearce.jgit.errors.IncorrectObjectTypeException;\n+import org.spearce.jgit.errors.MissingObjectException;\n+import org.spearce.jgit.lib.ObjectId;\n+import org.spearce.jgit.revwalk.RevTree;\n+\n+/**\n+ * Custom argument handler {@link RevTree} from string values.\n+ * <p>\n+ * Assumes the parser has been initialized with a Repository.\n+ */\n+public class RevTreeHandler extends OptionHandler<RevTree> {\n+\tprivate final org.spearce.jgit.pgm.opt.CmdLineParser clp;\n+\n+\t/**\n+\t * Create a new handler for the command name.\n+\t * <p>\n+\t * This constructor is used only by args4j.\n+\t * \n+\t * @param parser\n+\t * @param option\n+\t * @param setter\n+\t */\n+\tpublic RevTreeHandler(final CmdLineParser parser, final OptionDef option,\n+\t\t\tfinal Setter<? super RevTree> setter) {\n+\t\tsuper(parser, option, setter);\n+\t\tclp = (org.spearce.jgit.pgm.opt.CmdLineParser) parser;\n+\t}\n+\n+\t@Override\n+\tpublic int parseArguments(final Parameters params) throws CmdLineException {\n+\t\tfinal String name = params.getParameter(0);\n+\t\tfinal ObjectId id;\n+\t\ttry {\n+\t\t\tid = clp.getRepository().resolve(name);\n+\t\t} catch (IOException e) {\n+\t\t\tthrow new CmdLineException(e.getMessage());\n+\t\t}\n+\t\tif (id == null)\n+\t\t\tthrow new CmdLineException(name + \" is not a tree\");\n+\n+\t\tfinal RevTree c;\n+\t\ttry {\n+\t\t\tc = clp.getRevWalk().parseTree(id);\n+\t\t} catch (ClassCastException e) {\n+\t\t\tthrow new CmdLineException(name + \" is not a tree\");\n+\t\t} catch (MissingObjectException e) {\n+\t\t\tthrow new CmdLineException(name + \" is not a tree\");\n+\t\t} catch (IncorrectObjectTypeException e) {\n+\t\t\tthrow new CmdLineException(name + \" is not a tree\");\n+\t\t} catch (IOException e) {\n+\t\t\tthrow new CmdLineException(\"cannot read \" + name + \": \"\n+\t\t\t\t\t+ e.getMessage());\n+\t\t}\n+\t\tsetter.addValue(c);\n+\t\treturn 1;\n+\t}\n+\n+\t@Override\n+\tpublic String getDefaultMetaVariable() {\n+\t\treturn \"tree-ish\";\n+\t}\n+}\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83801","messageId":"1216345461-59382-16-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-15-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 15/28] Register most of our OptionHandler implementations for automatic use","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:44:08Z","receivedAt":"2008-07-18T01:44:08Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Most of these types are common in our command line tools and we\nwill want to use them over and over again.  So we can register\nthem in our class initializer and be certain they get associated\nto an instance member automatically by type.\n\nSigned-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../org/spearce/jgit/pgm/opt/CmdLineParser.java    |   14 ++++++++++++++\n 1 files changed, 14 insertions(+), 0 deletions(-)\n\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/CmdLineParser.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/CmdLineParser.java\nindex 257d88f..62197e4 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/CmdLineParser.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/CmdLineParser.java\n@@ -43,9 +43,14 @@ import org.kohsuke.args4j.Argument;\n import org.kohsuke.args4j.CmdLineException;\n import org.kohsuke.args4j.IllegalAnnotationError;\n import org.kohsuke.args4j.Option;\n+import org.spearce.jgit.lib.ObjectId;\n import org.spearce.jgit.lib.Repository;\n import org.spearce.jgit.pgm.TextBuiltin;\n+import org.spearce.jgit.revwalk.RevCommit;\n+import org.spearce.jgit.revwalk.RevTree;\n import org.spearce.jgit.revwalk.RevWalk;\n+import org.spearce.jgit.transport.RefSpec;\n+import org.spearce.jgit.treewalk.AbstractTreeIterator;\n \n /**\n  * Extended command line parser which handles --foo=value arguments.\n@@ -56,6 +61,15 @@ import org.spearce.jgit.revwalk.RevWalk;\n  * args4j style format prior to invoking args4j for parsing.\n  */\n public class CmdLineParser extends org.kohsuke.args4j.CmdLineParser {\n+\tstatic {\n+\t\tregisterHandler(AbstractTreeIterator.class,\n+\t\t\t\tAbstractTreeIteratorHandler.class);\n+\t\tregisterHandler(ObjectId.class, ObjectIdHandler.class);\n+\t\tregisterHandler(RefSpec.class, RefSpecHandler.class);\n+\t\tregisterHandler(RevCommit.class, RevCommitHandler.class);\n+\t\tregisterHandler(RevTree.class, RevTreeHandler.class);\n+\t}\n+\n \tprivate final Repository db;\n \n \tprivate RevWalk walk;\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83803","messageId":"1216345461-59382-17-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-16-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 16/28] Convert jgit's Main to use args4j for basic parsing services","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:44:09Z","receivedAt":"2008-07-18T01:44:09Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"We now use args4j for our global options parsing and for the\nsubcommand selection.  The remaining arguments that are left\nover after the subcommand are sent to the subcommand unmodified.\nAn additional CmdLineParser could be created by the subcommand to\nhandle its own argument parsing over the remaining options.\n\nSigned-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../src/org/spearce/jgit/pgm/Main.java             |  111 ++++++---------\n .../src/org/spearce/jgit/pgm/TextBuiltin.java      |   19 +++\n .../spearce/jgit/pgm/opt/SubcommandHandler.java    |  149 ++++++++++++++++++++\n 3 files changed, 214 insertions(+), 65 deletions(-)\n create mode 100644 org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/SubcommandHandler.java\n\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Main.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Main.java\nindex 68748bf..c069989 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Main.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Main.java\n@@ -39,8 +39,13 @@\n package org.spearce.jgit.pgm;\n \n import java.io.File;\n-import java.util.Arrays;\n+import java.util.ArrayList;\n+import java.util.List;\n \n+import org.kohsuke.args4j.Argument;\n+import org.kohsuke.args4j.CmdLineException;\n+import org.kohsuke.args4j.ExampleMode;\n+import org.kohsuke.args4j.Option;\n import org.spearce.jgit.awtui.AwtAuthenticator;\n import org.spearce.jgit.errors.TransportException;\n import org.spearce.jgit.lib.Repository;\n@@ -50,7 +55,20 @@ import org.spearce.jgit.util.HttpSupport;\n \n /** Command line entry point. */\n public class Main {\n-\tprivate static boolean showStackTrace;\n+\t@Option(name = \"--help\", usage = \"display this help text\", aliases = { \"-h\" })\n+\tprivate boolean help;\n+\n+\t@Option(name = \"--show-stack-trace\", usage = \"display the Java stack trace on exceptions\")\n+\tprivate boolean showStackTrace;\n+\n+\t@Option(name = \"--git-dir\", metaVar = \"GIT_DIR\", usage = \"set the git repository to operate on\")\n+\tprivate File gitdir;\n+\n+\t@Argument(index = 0, metaVar = \"command\", required = true, handler = SubcommandHandler.class)\n+\tprivate TextBuiltin subcommand;\n+\n+\t@Argument(index = 1, metaVar = \"ARG\")\n+\tprivate List<String> arguments = new ArrayList<String>();\n \n \t/**\n \t * Execute the command line.\n@@ -59,23 +77,24 @@ public class Main {\n \t *            arguments.\n \t */\n \tpublic static void main(final String[] argv) {\n+\t\tfinal Main me = new Main();\n \t\ttry {\n \t\t\tAwtAuthenticator.install();\n \t\t\tHttpSupport.configureHttpProxy();\n-\t\t\texecute(argv);\n+\t\t\tme.execute(argv);\n \t\t} catch (Die err) {\n \t\t\tSystem.err.println(\"fatal: \" + err.getMessage());\n-\t\t\tif (showStackTrace)\n+\t\t\tif (me.showStackTrace)\n \t\t\t\terr.printStackTrace();\n \t\t\tSystem.exit(128);\n \t\t} catch (Exception err) {\n-\t\t\tif (!showStackTrace && err.getCause() != null\n+\t\t\tif (!me.showStackTrace && err.getCause() != null\n \t\t\t\t\t&& err instanceof TransportException)\n \t\t\t\tSystem.err.println(\"fatal: \" + err.getCause().getMessage());\n \n \t\t\tif (err.getClass().getName().startsWith(\"org.spearce.jgit.errors.\")) {\n \t\t\t\tSystem.err.println(\"fatal: \" + err.getMessage());\n-\t\t\t\tif (showStackTrace)\n+\t\t\t\tif (me.showStackTrace)\n \t\t\t\t\terr.printStackTrace();\n \t\t\t\tSystem.exit(128);\n \t\t\t}\n@@ -84,24 +103,28 @@ public class Main {\n \t\t}\n \t}\n \n-\tprivate static void execute(final String[] argv) throws Exception {\n-\t\tint argi = 0;\n+\tprivate void execute(final String[] argv) throws Exception {\n+\t\tfinal CmdLineParser clp = new CmdLineParser(this);\n+\t\ttry {\n+\t\t\tclp.parseArgument(argv);\n+\t\t} catch (CmdLineException err) {\n+\t\t\tif (argv.length > 0 && !help) {\n+\t\t\t\tSystem.err.println(\"fatal: \" + err.getMessage());\n+\t\t\t\tSystem.exit(1);\n+\t\t\t}\n+\t\t}\n \n-\t\tFile gitdir = null;\n-\t\tfor (; argi < argv.length; argi++) {\n-\t\t\tfinal String arg = argv[argi];\n-\t\t\tif (arg.startsWith(\"--git-dir=\"))\n-\t\t\t\tgitdir = new File(arg.substring(\"--git-dir=\".length()));\n-\t\t\telse if (arg.equals(\"--show-stack-trace\"))\n-\t\t\t\tshowStackTrace = true;\n-\t\t\telse if (arg.startsWith(\"--\"))\n-\t\t\t\tusage();\n-\t\t\telse\n-\t\t\t\tbreak;\n+\t\tif (argv.length == 0 || help) {\n+\t\t\tfinal String ex = clp.printExample(ExampleMode.ALL);\n+\t\t\tSystem.err.println(\"jgit\" + ex + \" command [ARG ...]\");\n+\t\t\tif (help) {\n+\t\t\t\tSystem.err.println();\n+\t\t\t\tclp.printUsage(System.err);\n+\t\t\t\tSystem.err.println();\n+\t\t\t}\n+\t\t\tSystem.exit(1);\n \t\t}\n \n-\t\tif (argi == argv.length)\n-\t\t\tusage();\n \t\tif (gitdir == null)\n \t\t\tgitdir = findGitDir();\n \t\tif (gitdir == null || !gitdir.isDirectory()) {\n@@ -109,10 +132,10 @@ public class Main {\n \t\t\tSystem.exit(1);\n \t\t}\n \n-\t\tfinal TextBuiltin cmd = createCommand(argv[argi++]);\n+\t\tfinal TextBuiltin cmd = subcommand;\n \t\tcmd.init(new Repository(gitdir));\n \t\ttry {\n-\t\t\tcmd.execute(subarray(argv, argi));\n+\t\t\tcmd.execute(arguments.toArray(new String[arguments.size()]));\n \t\t} finally {\n \t\t\tif (cmd.out != null)\n \t\t\t\tcmd.out.flush();\n@@ -129,46 +152,4 @@ public class Main {\n \t\t}\n \t\treturn null;\n \t}\n-\n-\tprivate static String[] subarray(final String[] argv, final int i) {\n-\t\treturn Arrays.asList(argv).subList(i, argv.length).toArray(\n-\t\t\t\tnew String[0]);\n-\t}\n-\n-\tprivate static TextBuiltin createCommand(final String name) {\n-\t\tfinal StringBuilder s = new StringBuilder();\n-\t\ts.append(mypackage());\n-\t\ts.append('.');\n-\t\tboolean upnext = true;\n-\t\tfor (int i = 0; i < name.length(); i++) {\n-\t\t\tfinal char c = name.charAt(i);\n-\t\t\tif (c == '-') {\n-\t\t\t\tupnext = true;\n-\t\t\t\tcontinue;\n-\t\t\t}\n-\t\t\tif (upnext)\n-\t\t\t\ts.append(Character.toUpperCase(c));\n-\t\t\telse\n-\t\t\t\ts.append(c);\n-\t\t\tupnext = false;\n-\t\t}\n-\t\ttry {\n-\t\t\treturn (TextBuiltin) Class.forName(s.toString()).newInstance();\n-\t\t} catch (Exception e) {\n-\t\t\tSystem.err.println(\"error: \" + name + \" is not a jgit command.\");\n-\t\t\tSystem.exit(1);\n-\t\t\treturn null;\n-\t\t}\n-\t}\n-\n-\tprivate static String mypackage() {\n-\t\tfinal String p = Main.class.getName();\n-\t\tfinal int dot = p.lastIndexOf('.');\n-\t\treturn p.substring(0, dot);\n-\t}\n-\n-\tprivate static void usage() {\n-\t\tSystem.err.println(\"jgit [--git-dir=path] cmd ...\");\n-\t\tSystem.exit(1);\n-\t}\n }\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/TextBuiltin.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/TextBuiltin.java\nindex 05ad211..0f39f11 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/TextBuiltin.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/TextBuiltin.java\n@@ -65,12 +65,24 @@ public abstract class TextBuiltin {\n \n \tprotected static final String REFS_TAGS = Constants.TAGS_PREFIX + \"/\";\n \n+\tprivate String commandName;\n+\n \t/** Stream to output to, typically this is standard output. */\n \tprotected PrintWriter out;\n \n \t/** Git repository the command was invoked within. */\n \tprotected Repository db;\n \n+\t/**\n+\t * Set the name this command can be invoked as on the command line.\n+\t * \n+\t * @param name\n+\t *            the name of the command.\n+\t */\n+\tpublic void setCommandName(final String name) {\n+\t\tcommandName = name;\n+\t}\n+\n \tvoid init(final Repository repo) {\n \t\ttry {\n \t\t\tout = new PrintWriter(new BufferedWriter(new OutputStreamWriter(\n@@ -93,6 +105,13 @@ public abstract class TextBuiltin {\n \t */\n \tpublic abstract void execute(String[] args) throws Exception;\n \n+\t/**\n+\t * @return the repository this command accesses.\n+\t */\n+\tpublic Repository getRepository() {\n+\t\treturn db;\n+\t}\n+\n \tprotected ObjectId resolve(final String s) throws IOException {\n \t\tfinal ObjectId r = db.resolve(s);\n \t\tif (r == null)\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/SubcommandHandler.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/SubcommandHandler.java\nnew file mode 100644\nindex 0000000..2318a03\n--- /dev/null\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/opt/SubcommandHandler.java\n@@ -0,0 +1,149 @@\n+/*\n+ * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>\n+ *\n+ * All rights reserved.\n+ *\n+ * Redistribution and use in source and binary forms, with or\n+ * without modification, are permitted provided that the following\n+ * conditions are met:\n+ *\n+ * - Redistributions of source code must retain the above copyright\n+ *   notice, this list of conditions and the following disclaimer.\n+ *\n+ * - Redistributions in binary form must reproduce the above\n+ *   copyright notice, this list of conditions and the following\n+ *   disclaimer in the documentation and/or other materials provided\n+ *   with the distribution.\n+ *\n+ * - Neither the name of the Git Development Community nor the\n+ *   names of its contributors may be used to endorse or promote\n+ *   products derived from this software without specific prior\n+ *   written permission.\n+ *\n+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n+ * CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+package org.spearce.jgit.pgm.opt;\n+\n+import java.lang.reflect.Constructor;\n+import java.lang.reflect.InvocationTargetException;\n+import java.text.MessageFormat;\n+\n+import org.kohsuke.args4j.CmdLineException;\n+import org.kohsuke.args4j.CmdLineParser;\n+import org.kohsuke.args4j.OptionDef;\n+import org.kohsuke.args4j.spi.OptionHandler;\n+import org.kohsuke.args4j.spi.Parameters;\n+import org.kohsuke.args4j.spi.Setter;\n+import org.spearce.jgit.pgm.Main;\n+import org.spearce.jgit.pgm.TextBuiltin;\n+\n+/**\n+ * Custom Argument handler for jgit command selection.\n+ * <p>\n+ * Translates a single argument string to a {@link TextBuiltin} instance which\n+ * we can execute at runtime with the remaining arguments of the parser.\n+ */\n+public class SubcommandHandler extends OptionHandler<TextBuiltin> {\n+\tprivate static String mypackage() {\n+\t\tfinal String p = Main.class.getName();\n+\t\tfinal int dot = p.lastIndexOf('.');\n+\t\treturn p.substring(0, dot);\n+\t}\n+\n+\t/**\n+\t * Create a new handler for the command name.\n+\t * <p>\n+\t * This constructor is used only by args4j.\n+\t * \n+\t * @param parser\n+\t * @param option\n+\t * @param setter\n+\t */\n+\tpublic SubcommandHandler(final CmdLineParser parser,\n+\t\t\tfinal OptionDef option, final Setter<? super TextBuiltin> setter) {\n+\t\tsuper(parser, option, setter);\n+\t}\n+\n+\t@Override\n+\tpublic int parseArguments(final Parameters params) throws CmdLineException {\n+\t\tfinal String name = params.getParameter(0);\n+\t\tfinal StringBuilder s = new StringBuilder();\n+\t\ts.append(mypackage());\n+\t\ts.append('.');\n+\t\tboolean upnext = true;\n+\t\tfor (int i = 0; i < name.length(); i++) {\n+\t\t\tfinal char c = name.charAt(i);\n+\t\t\tif (c == '-') {\n+\t\t\t\tupnext = true;\n+\t\t\t\tcontinue;\n+\t\t\t}\n+\t\t\tif (upnext)\n+\t\t\t\ts.append(Character.toUpperCase(c));\n+\t\t\telse\n+\t\t\t\ts.append(c);\n+\t\t\tupnext = false;\n+\t\t}\n+\n+\t\tfinal Class<?> clazz;\n+\t\ttry {\n+\t\t\tclazz = Class.forName(s.toString());\n+\t\t} catch (ClassNotFoundException e) {\n+\t\t\tthrow new CmdLineException(MessageFormat.format(\n+\t\t\t\t\t\"{0} is not a jgit command\", name));\n+\t\t}\n+\n+\t\tif (!TextBuiltin.class.isAssignableFrom(clazz))\n+\t\t\tthrow new CmdLineException(MessageFormat.format(\n+\t\t\t\t\t\"{0} is not a jgit command\", name));\n+\n+\t\tfinal Constructor<?> cons;\n+\t\ttry {\n+\t\t\tcons = clazz.getDeclaredConstructor();\n+\t\t} catch (SecurityException e) {\n+\t\t\tthrow new CmdLineException(\"Cannot create \" + name, e);\n+\t\t} catch (NoSuchMethodException e) {\n+\t\t\tthrow new CmdLineException(\"Cannot create \" + name, e);\n+\t\t}\n+\t\tcons.setAccessible(true);\n+\n+\t\tfinal TextBuiltin cmd;\n+\t\ttry {\n+\t\t\tcmd = (TextBuiltin) cons.newInstance();\n+\t\t} catch (InstantiationException e) {\n+\t\t\tthrow new CmdLineException(\"Cannot create \" + name, e);\n+\t\t} catch (IllegalAccessException e) {\n+\t\t\tthrow new CmdLineException(\"Cannot create \" + name, e);\n+\t\t} catch (InvocationTargetException e) {\n+\t\t\tthrow new CmdLineException(\"Cannot create \" + name, e);\n+\t\t}\n+\n+\t\tcmd.setCommandName(name);\n+\t\tsetter.addValue(cmd);\n+\n+\t\t// Force option parsing to stop. Everything after us should\n+\t\t// be arguments known only to this command and must not be\n+\t\t// recognized by the current parser.\n+\t\t//\n+\t\towner.stopOptionParsing();\n+\n+\t\treturn 1;\n+\t}\n+\n+\t@Override\n+\tpublic String getDefaultMetaVariable() {\n+\t\treturn \"command\";\n+\t}\n+}\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83802","messageId":"1216345461-59382-18-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-17-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 17/28] Support automatic command line parsing for TextBuiltin subclasses","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:44:10Z","receivedAt":"2008-07-18T01:44:10Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"By default the execute method will parse the supplied arguments\nand then invoke run().  Newer style builtins will override the\nrun method, rather than the execute method, and take advantage of\nthe standard parsing support.\n\nSigned-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../src/org/spearce/jgit/pgm/TextBuiltin.java      |   69 +++++++++++++++++++-\n 1 files changed, 67 insertions(+), 2 deletions(-)\n\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/TextBuiltin.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/TextBuiltin.java\nindex 0f39f11..c4a55f4 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/TextBuiltin.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/TextBuiltin.java\n@@ -43,9 +43,13 @@ import java.io.IOException;\n import java.io.OutputStreamWriter;\n import java.io.PrintWriter;\n \n+import org.kohsuke.args4j.CmdLineException;\n+import org.kohsuke.args4j.Option;\n import org.spearce.jgit.lib.Constants;\n import org.spearce.jgit.lib.ObjectId;\n import org.spearce.jgit.lib.Repository;\n+import org.spearce.jgit.pgm.opt.CmdLineParser;\n+import org.spearce.jgit.revwalk.RevWalk;\n \n /**\n  * Abstract command which can be invoked from the command line.\n@@ -67,12 +71,18 @@ public abstract class TextBuiltin {\n \n \tprivate String commandName;\n \n+\t@Option(name = \"--help\", usage = \"display this help text\", aliases = { \"-h\" })\n+\tprivate boolean help;\n+\n \t/** Stream to output to, typically this is standard output. */\n \tprotected PrintWriter out;\n \n \t/** Git repository the command was invoked within. */\n \tprotected Repository db;\n \n+\t/** RevWalk used during command line parsing, if it was required. */\n+\tprotected RevWalk argWalk;\n+\n \t/**\n \t * Set the name this command can be invoked as on the command line.\n \t * \n@@ -94,7 +104,7 @@ public abstract class TextBuiltin {\n \t}\n \n \t/**\n-\t * Perform the action(s) of this command.\n+\t * Parse arguments and run this command.\n \t * \n \t * @param args\n \t *            command line arguments passed after the command name.\n@@ -103,7 +113,62 @@ public abstract class TextBuiltin {\n \t *             framework will catch the exception and print a message on\n \t *             standard error.\n \t */\n-\tpublic abstract void execute(String[] args) throws Exception;\n+\tpublic void execute(String[] args) throws Exception {\n+\t\tparseArguments(args);\n+\t\trun();\n+\t}\n+\n+\t/**\n+\t * Parses the command line arguments prior to running.\n+\t * <p>\n+\t * This method should only be invoked by {@link #execute(String[])}, prior\n+\t * to calling {@link #run()}. The default implementation parses all\n+\t * arguments into this object's instance fields.\n+\t * \n+\t * @param args\n+\t *            the arguments supplied on the command line, if any.\n+\t */\n+\tprotected void parseArguments(final String[] args) {\n+\t\tfinal CmdLineParser clp = new CmdLineParser(this);\n+\t\ttry {\n+\t\t\tclp.parseArgument(args);\n+\t\t} catch (CmdLineException err) {\n+\t\t\tif (!help) {\n+\t\t\t\tSystem.err.println(\"fatal: \" + err.getMessage());\n+\t\t\t\tSystem.exit(1);\n+\t\t\t}\n+\t\t}\n+\n+\t\tif (help) {\n+\t\t\tSystem.err.print(\"jgit \");\n+\t\t\tSystem.err.print(commandName);\n+\t\t\tclp.printSingleLineUsage(System.err);\n+\t\t\tSystem.err.println();\n+\n+\t\t\tif (help) {\n+\t\t\t\tSystem.err.println();\n+\t\t\t\tclp.printUsage(System.err);\n+\t\t\t\tSystem.err.println();\n+\t\t\t}\n+\t\t\tSystem.exit(1);\n+\t\t}\n+\n+\t\targWalk = clp.getRevWalkGently();\n+\t}\n+\n+\t/**\n+\t * Perform the actions of this command.\n+\t * <p>\n+\t * This method should only be invoked by {@link #execute(String[])}.\n+\t * \n+\t * @throws Exception\n+\t *             an error occurred while processing the command. The main\n+\t *             framework will catch the exception and print a message on\n+\t *             standard error.\n+\t */\n+\tprotected void run() throws Exception {\n+\t\tthrow die(\"Override either execute (legacy) or run (new style).\");\n+\t}\n \n \t/**\n \t * @return the repository this command accesses.\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83811","messageId":"1216345461-59382-19-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-18-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 18/28] Convert diff-tree program to args4j","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:44:11Z","receivedAt":"2008-07-18T01:44:11Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Signed-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../src/org/spearce/jgit/pgm/DiffTree.java         |   57 ++++++++------------\n 1 files changed, 23 insertions(+), 34 deletions(-)\n\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/DiffTree.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/DiffTree.java\nindex 17858ba..b3f6738 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/DiffTree.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/DiffTree.java\n@@ -40,50 +40,39 @@ package org.spearce.jgit.pgm;\n import java.util.ArrayList;\n import java.util.List;\n \n+import org.kohsuke.args4j.Argument;\n+import org.kohsuke.args4j.Option;\n import org.spearce.jgit.lib.FileMode;\n+import org.spearce.jgit.pgm.opt.PathTreeFilterHandler;\n+import org.spearce.jgit.treewalk.AbstractTreeIterator;\n import org.spearce.jgit.treewalk.TreeWalk;\n import org.spearce.jgit.treewalk.filter.AndTreeFilter;\n-import org.spearce.jgit.treewalk.filter.OrTreeFilter;\n-import org.spearce.jgit.treewalk.filter.PathFilter;\n import org.spearce.jgit.treewalk.filter.TreeFilter;\n \n class DiffTree extends TextBuiltin {\n+\t@Option(name = \"--recursive\", usage = \"recurse into subtrees\", aliases = { \"-r\" })\n+\tprivate boolean recursive;\n+\n+\t@Argument(index = 0, metaVar = \"tree-ish\", required = true)\n+\tvoid tree_0(final AbstractTreeIterator c) {\n+\t\ttrees.add(c);\n+\t}\n+\n+\t@Argument(index = 1, metaVar = \"tree-ish\", required = true)\n+\tprivate final List<AbstractTreeIterator> trees = new ArrayList<AbstractTreeIterator>();\n+\n+\t@Option(name = \"--\", metaVar = \"path\", multiValued = true, handler = PathTreeFilterHandler.class)\n+\tprivate TreeFilter pathFilter = TreeFilter.ALL;\n+\n \t@Override\n-\tpublic void execute(String[] args) throws Exception {\n+\tprotected void run() throws Exception {\n \t\tfinal TreeWalk walk = new TreeWalk(db);\n-\t\tfinal List<String> argList = new ArrayList<String>();\n-\t\tList<TreeFilter> pathLimiter = null;\n-\t\tfor (final String a : args) {\n-\t\t\tif (pathLimiter != null)\n-\t\t\t\tpathLimiter.add(PathFilter.create(a));\n-\t\t\telse if (\"--\".equals(a))\n-\t\t\t\tpathLimiter = new ArrayList<TreeFilter>();\n-\t\t\telse if (\"-r\".equals(a))\n-\t\t\t\twalk.setRecursive(true);\n-\t\t\telse\n-\t\t\t\targList.add(a);\n-\t\t}\n-\n-\t\tfinal TreeFilter pathFilter;\n-\t\tif (pathLimiter == null || pathLimiter.isEmpty())\n-\t\t\tpathFilter = TreeFilter.ALL;\n-\t\telse if (pathLimiter.size() == 1)\n-\t\t\tpathFilter = pathLimiter.get(0);\n-\t\telse\n-\t\t\tpathFilter = OrTreeFilter.create(pathLimiter);\n+\t\twalk.reset();\n+\t\twalk.setRecursive(recursive);\n+\t\tfor (final AbstractTreeIterator i : trees)\n+\t\t\twalk.addTree(i);\n \t\twalk.setFilter(AndTreeFilter.create(TreeFilter.ANY_DIFF, pathFilter));\n \n-\t\tif (argList.size() == 0)\n-\t\t\targList.add(\"HEAD\");\n-\t\tif (argList.size() == 1) {\n-\t\t\tfinal String a = argList.get(0);\n-\t\t\targList.clear();\n-\t\t\targList.add(a + \"^^{tree}\");\n-\t\t\targList.add(a + \"^{tree}\");\n-\t\t}\n-\t\tfor (final String a : argList)\n-\t\t\twalk.addTree(resolve(a));\n-\n \t\tfinal int nTree = walk.getTreeCount();\n \t\twhile (walk.next()) {\n \t\t\tfor (int i = 1; i < nTree; i++)\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83800","messageId":"1216345461-59382-20-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-19-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 19/28] Convert fetch program to args4j","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:44:12Z","receivedAt":"2008-07-18T01:44:12Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Signed-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../src/org/spearce/jgit/pgm/Fetch.java            |   27 ++++++-------------\n 1 files changed, 9 insertions(+), 18 deletions(-)\n\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Fetch.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Fetch.java\nindex e5a0dce..194f669 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Fetch.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Fetch.java\n@@ -37,9 +37,9 @@\n \n package org.spearce.jgit.pgm;\n \n-import java.util.ArrayList;\n import java.util.List;\n \n+import org.kohsuke.args4j.Argument;\n import org.spearce.jgit.lib.RefUpdate;\n import org.spearce.jgit.lib.TextProgressMonitor;\n import org.spearce.jgit.transport.FetchResult;\n@@ -48,26 +48,17 @@ import org.spearce.jgit.transport.TrackingRefUpdate;\n import org.spearce.jgit.transport.Transport;\n \n class Fetch extends TextBuiltin {\n-\t@Override\n-\tpublic void execute(String[] args) throws Exception {\n-\t\tint argi = 0;\n-\t\tfor (; argi < args.length; argi++) {\n-\t\t\tfinal String a = args[argi];\n-\t\t\tif (\"--\".equals(a)) {\n-\t\t\t\targi++;\n-\t\t\t\tbreak;\n-\t\t\t} else\n-\t\t\t\tbreak;\n-\t\t}\n-\t\tif (args.length == 0)\n-\t\t\targs = new String[] { \"origin\" };\n+\t@Argument(index = 0, metaVar = \"uri-ish\")\n+\tprivate String remote = \"origin\";\n \n-\t\tfinal Transport tn = Transport.open(db, args[argi++]);\n+\t@Argument(index = 1, metaVar = \"refspec\")\n+\tprivate List<RefSpec> toget;\n+\n+\t@Override\n+\tprotected void run() throws Exception {\n+\t\tfinal Transport tn = Transport.open(db, remote);\n \t\tfinal FetchResult r;\n \t\ttry {\n-\t\t\tfinal List<RefSpec> toget = new ArrayList<RefSpec>();\n-\t\t\tfor (; argi < args.length; argi++)\n-\t\t\t\ttoget.add(new RefSpec(args[argi]));\n \t\t\tr = tn.fetch(new TextProgressMonitor(), toget);\n \t\t\tif (r.getTrackingRefUpdates().isEmpty())\n \t\t\t\treturn;\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83804","messageId":"1216345461-59382-21-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-20-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 20/28] Convert index-pack program to args4j","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:44:13Z","receivedAt":"2008-07-18T01:44:13Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Signed-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../src/org/spearce/jgit/pgm/IndexPack.java        |   35 +++++++-------------\n 1 files changed, 12 insertions(+), 23 deletions(-)\n\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/IndexPack.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/IndexPack.java\nindex 5f4134d..5eacaa4 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/IndexPack.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/IndexPack.java\n@@ -40,39 +40,28 @@ package org.spearce.jgit.pgm;\n import java.io.BufferedInputStream;\n import java.io.File;\n \n+import org.kohsuke.args4j.Argument;\n+import org.kohsuke.args4j.Option;\n import org.spearce.jgit.lib.TextProgressMonitor;\n \n class IndexPack extends TextBuiltin {\n-\t@Override\n-\tpublic void execute(final String[] args) throws Exception {\n-\t\tboolean fixThin = false;\n-\t\tint argi = 0;\n-\t\tint version = 0;\n-\t\tfor (; argi < args.length; argi++) {\n-\t\t\tfinal String a = args[argi];\n-\t\t\tif (\"--fix-thin\".equals(a))\n-\t\t\t\tfixThin = true;\n-\t\t\telse if (a.startsWith(\"--index-version=\"))\n-\t\t\t\tversion = Integer.parseInt(a.substring(a.indexOf('=') + 1));\n-\t\t\telse if (\"--\".equals(a)) {\n-\t\t\t\targi++;\n-\t\t\t\tbreak;\n-\t\t\t} else\n-\t\t\t\tbreak;\n-\t\t}\n+\t@Option(name = \"--fix-thin\", usage = \"fix a thin pack to be complete\")\n+\tprivate boolean fixThin;\n+\n+\t@Option(name = \"--index-version\", usage = \"index file format to create\")\n+\tprivate int indexVersion;\n \n-\t\tif (argi == args.length)\n-\t\t\tthrow die(\"usage: index-pack base\");\n-\t\telse if (argi + 1 < args.length)\n-\t\t\tthrow die(\"too many arguments\");\n+\t@Argument(index = 0, required = true, metaVar = \"base\")\n+\tprivate File base;\n \n-\t\tfinal File base = new File(args[argi]);\n+\t@Override\n+\tprotected void run() throws Exception {\n \t\tfinal BufferedInputStream in;\n \t\tfinal org.spearce.jgit.transport.IndexPack ip;\n \t\tin = new BufferedInputStream(System.in);\n \t\tip = new org.spearce.jgit.transport.IndexPack(db, in, base);\n \t\tip.setFixThin(fixThin);\n-\t\tip.setIndexVersion(version);\n+\t\tip.setIndexVersion(indexVersion);\n \t\tip.index(new TextProgressMonitor());\n \t}\n }\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83812","messageId":"1216345461-59382-22-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-21-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 21/28] Convert ls-remote program to args4j","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:44:14Z","receivedAt":"2008-07-18T01:44:14Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Signed-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../src/org/spearce/jgit/pgm/LsRemote.java         |   23 +++++--------------\n 1 files changed, 6 insertions(+), 17 deletions(-)\n\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/LsRemote.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/LsRemote.java\nindex 921bcff..391a04d 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/LsRemote.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/LsRemote.java\n@@ -37,30 +37,19 @@\n \n package org.spearce.jgit.pgm;\n \n+import org.kohsuke.args4j.Argument;\n import org.spearce.jgit.lib.AnyObjectId;\n import org.spearce.jgit.lib.Ref;\n import org.spearce.jgit.transport.FetchConnection;\n import org.spearce.jgit.transport.Transport;\n \n class LsRemote extends TextBuiltin {\n-\t@Override\n-\tpublic void execute(final String[] args) throws Exception {\n-\t\tint argi = 0;\n-\t\tfor (; argi < args.length; argi++) {\n-\t\t\tfinal String a = args[argi];\n-\t\t\tif (\"--\".equals(a)) {\n-\t\t\t\targi++;\n-\t\t\t\tbreak;\n-\t\t\t} else\n-\t\t\t\tbreak;\n-\t\t}\n+\t@Argument(index = 0, metaVar = \"uri-ish\", required = true)\n+\tprivate String remote;\n \n-\t\tif (argi == args.length)\n-\t\t\tthrow die(\"usage: url\");\n-\t\telse if (argi + 1 < args.length)\n-\t\t\tthrow die(\"too many arguments\");\n-\n-\t\tfinal Transport tn = Transport.open(db, args[argi]);\n+\t@Override\n+\tprotected void run() throws Exception {\n+\t\tfinal Transport tn = Transport.open(db, remote);\n \t\tfinal FetchConnection c = tn.openFetch();\n \t\ttry {\n \t\t\tfor (final Ref r : c.getRefs()) {\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83805","messageId":"1216345461-59382-23-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-22-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 22/28] Convert ls-tree program to args4j","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:44:15Z","receivedAt":"2008-07-18T01:44:15Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Signed-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../src/org/spearce/jgit/pgm/LsTree.java           |   42 ++++++--------------\n 1 files changed, 12 insertions(+), 30 deletions(-)\n\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/LsTree.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/LsTree.java\nindex a0a7216..8d4937f 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/LsTree.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/LsTree.java\n@@ -37,40 +37,26 @@\n \n package org.spearce.jgit.pgm;\n \n-import java.io.File;\n-\n+import org.kohsuke.args4j.Argument;\n+import org.kohsuke.args4j.Option;\n import org.spearce.jgit.lib.Constants;\n import org.spearce.jgit.lib.FileMode;\n-import org.spearce.jgit.treewalk.FileTreeIterator;\n+import org.spearce.jgit.treewalk.AbstractTreeIterator;\n import org.spearce.jgit.treewalk.TreeWalk;\n \n class LsTree extends TextBuiltin {\n-\t@Override\n-\tpublic void execute(final String[] args) throws Exception {\n-\t\tfinal TreeWalk walk = new TreeWalk(db);\n-\t\tint argi = 0;\n-\t\tfor (; argi < args.length; argi++) {\n-\t\t\tfinal String a = args[argi];\n-\t\t\tif (\"--\".equals(a)) {\n-\t\t\t\targi++;\n-\t\t\t\tbreak;\n-\t\t\t} else if (\"-r\".equals(a))\n-\t\t\t\twalk.setRecursive(true);\n-\t\t\telse\n-\t\t\t\tbreak;\n-\t\t}\n+\t@Option(name = \"--recursive\", usage = \"recurse into subtrees\", aliases = { \"-r\" })\n+\tprivate boolean recursive;\n \n-\t\tif (argi == args.length)\n-\t\t\tthrow die(\"usage: [-r] treename\");\n-\t\telse if (argi + 1 < args.length)\n-\t\t\tthrow die(\"too many arguments\");\n+\t@Argument(index = 0, required = true, metaVar = \"tree-ish\")\n+\tprivate AbstractTreeIterator tree;\n \n+\t@Override\n+\tprotected void run() throws Exception {\n+\t\tfinal TreeWalk walk = new TreeWalk(db);\n \t\twalk.reset(); // drop the first empty tree, which we do not need here\n-\t\tfinal String n = args[argi];\n-\t\tif (is_WorkDir(n))\n-\t\t\twalk.addTree(new FileTreeIterator(new File(n)));\n-\t\telse\n-\t\t\twalk.addTree(resolve(n));\n+\t\twalk.setRecursive(recursive);\n+\t\twalk.addTree(tree);\n \n \t\twhile (walk.next()) {\n \t\t\tfinal FileMode mode = walk.getFileMode(0);\n@@ -88,8 +74,4 @@ class LsTree extends TextBuiltin {\n \t\t\tout.println();\n \t\t}\n \t}\n-\n-\tprivate boolean is_WorkDir(final String name) {\n-\t\treturn new File(name).isDirectory();\n-\t}\n }\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83813","messageId":"1216345461-59382-24-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-23-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 23/28] Convert merge-base program to args4j","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:44:16Z","receivedAt":"2008-07-18T01:44:16Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Signed-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../src/org/spearce/jgit/pgm/MergeBase.java        |   37 ++++++++++++--------\n 1 files changed, 22 insertions(+), 15 deletions(-)\n\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/MergeBase.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/MergeBase.java\nindex c1648a0..c0ddd3b 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/MergeBase.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/MergeBase.java\n@@ -37,27 +37,34 @@\n \n package org.spearce.jgit.pgm;\n \n+import java.util.ArrayList;\n+import java.util.List;\n+\n+import org.kohsuke.args4j.Argument;\n+import org.kohsuke.args4j.Option;\n import org.spearce.jgit.revwalk.RevCommit;\n-import org.spearce.jgit.revwalk.RevWalk;\n import org.spearce.jgit.revwalk.filter.RevFilter;\n \n class MergeBase extends TextBuiltin {\n-\t@Override\n-\tpublic void execute(final String[] args) throws Exception {\n-\t\tfinal RevWalk walk = new RevWalk(db);\n-\t\tint max = 1;\n-\t\tfor (final String a : args) {\n-\t\t\tif (\"--\".equals(a))\n-\t\t\t\tbreak;\n-\t\t\telse if (\"--all\".equals(a))\n-\t\t\t\tmax = Integer.MAX_VALUE;\n-\t\t\telse\n-\t\t\t\twalk.markStart(walk.parseCommit(resolve(a)));\n-\t\t}\n+\t@Option(name = \"--all\", usage = \"display all possible merge bases\")\n+\tprivate boolean all;\n \n-\t\twalk.setRevFilter(RevFilter.MERGE_BASE);\n+\t@Argument(index = 0, metaVar = \"commit-ish\", required = true)\n+\tvoid commit_0(final RevCommit c) {\n+\t\tcommits.add(c);\n+\t}\n+\n+\t@Argument(index = 1, metaVar = \"commit-ish\", required = true)\n+\tprivate final List<RevCommit> commits = new ArrayList<RevCommit>();\n+\n+\t@Override\n+\tprotected void run() throws Exception {\n+\t\tfor (final RevCommit c : commits)\n+\t\t\targWalk.markStart(c);\n+\t\targWalk.setRevFilter(RevFilter.MERGE_BASE);\n+\t\tint max = all ? Integer.MAX_VALUE : 1;\n \t\twhile (max-- > 0) {\n-\t\t\tfinal RevCommit b = walk.next();\n+\t\t\tfinal RevCommit b = argWalk.next();\n \t\t\tif (b == null)\n \t\t\t\tbreak;\n \t\t\tout.println(b.getId());\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83808","messageId":"1216345461-59382-25-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-24-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 24/28] Convert push program to args4j","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:44:17Z","receivedAt":"2008-07-18T01:44:17Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Signed-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../src/org/spearce/jgit/pgm/Push.java             |   95 +++++++++-----------\n 1 files changed, 44 insertions(+), 51 deletions(-)\n\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Push.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Push.java\nindex 5671cc5..df6c664 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Push.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Push.java\n@@ -37,9 +37,12 @@\n \n package org.spearce.jgit.pgm;\n \n+import java.util.ArrayList;\n import java.util.Collection;\n-import java.util.LinkedList;\n+import java.util.List;\n \n+import org.kohsuke.args4j.Argument;\n+import org.kohsuke.args4j.Option;\n import org.spearce.jgit.lib.Ref;\n import org.spearce.jgit.lib.TextProgressMonitor;\n import org.spearce.jgit.transport.PushResult;\n@@ -49,64 +52,54 @@ import org.spearce.jgit.transport.Transport;\n import org.spearce.jgit.transport.RemoteRefUpdate.Status;\n \n class Push extends TextBuiltin {\n+\t@Argument(index = 0, metaVar = \"uri-ish\")\n+\tprivate String remote = \"origin\";\n \n+\t@Argument(index = 1, metaVar = \"refspec\")\n+\tprivate final List<RefSpec> refSpecs = new ArrayList<RefSpec>();\n+\n+\t@Option(name = \"--all\")\n+\tvoid addAll(final boolean ignored) {\n+\t\trefSpecs.add(Transport.REFSPEC_PUSH_ALL);\n+\t}\n+\n+\t@Option(name = \"--tags\")\n+\tvoid addTags(final boolean ignored) {\n+\t\trefSpecs.add(Transport.REFSPEC_TAGS);\n+\t}\n+\n+\t@Option(name = \"--verbose\", aliases = { \"-v\" })\n \tprivate boolean verbose = false;\n \n+\t@Option(name = \"--thin\")\n+\tprivate boolean thin = Transport.DEFAULT_PUSH_THIN;\n+\n+\t@Option(name = \"--no-thin\")\n+\tvoid nothin(final boolean ignored) {\n+\t\tthin = false;\n+\t}\n+\n+\t@Option(name = \"--force\", aliases = { \"-f\" })\n+\tprivate boolean force;\n+\n+\t@Option(name = \"--receive-pack\", metaVar = \"path\")\n+\tprivate String receivePack;\n+\n \tprivate boolean first = true;\n \n \t@Override\n-\tpublic void execute(String[] args) throws Exception {\n-\t\tfinal LinkedList<RefSpec> refSpecs = new LinkedList<RefSpec>();\n-\t\tBoolean thin = null;\n-\t\tString exec = null;\n-\t\tboolean forceAll = false;\n-\n-\t\tint argi = 0;\n-\t\tfor (; argi < args.length; argi++) {\n-\t\t\tfinal String a = args[argi];\n-\t\t\tif (\"--thin\".equals(a))\n-\t\t\t\tthin = true;\n-\t\t\telse if (\"--no-thin\".equals(a))\n-\t\t\t\tthin = false;\n-\t\t\telse if (\"-f\".equals(a) || \"--force\".equals(a))\n-\t\t\t\tforceAll = true;\n-\t\t\telse if (a.startsWith(\"--exec=\"))\n-\t\t\t\texec = a.substring(\"--exec=\".length());\n-\t\t\telse if (a.startsWith(\"--receive-pack=\"))\n-\t\t\t\texec = a.substring(\"--receive-pack=\".length());\n-\t\t\telse if (\"--tags\".equals(a))\n-\t\t\t\trefSpecs.add(Transport.REFSPEC_TAGS);\n-\t\t\telse if (\"--all\".equals(a))\n-\t\t\t\trefSpecs.add(Transport.REFSPEC_PUSH_ALL);\n-\t\t\telse if (\"-v\".equals(a))\n-\t\t\t\tverbose = true;\n-\t\t\telse if (\"--\".equals(a)) {\n-\t\t\t\targi++;\n-\t\t\t\tbreak;\n-\t\t\t} else if (a.startsWith(\"-\"))\n-\t\t\t\tdie(\"usage: push [--all] [--tags] [--force] [--thin]\\n\"\n-\t\t\t\t\t\t+ \"[--receive-pack=<git-receive-pack>] [<repository> [<refspec>]...]\");\n-\t\t\telse\n-\t\t\t\tbreak;\n+\tprotected void run() throws Exception {\n+\t\tif (force) {\n+\t\t\tfinal List<RefSpec> orig = new ArrayList<RefSpec>(refSpecs);\n+\t\t\trefSpecs.clear();\n+\t\t\tfor (final RefSpec spec : orig)\n+\t\t\t\trefSpecs.add(spec.setForceUpdate(true));\n \t\t}\n \n-\t\tfinal String repository;\n-\t\tif (argi == args.length)\n-\t\t\trepository = \"origin\";\n-\t\telse\n-\t\t\trepository = args[argi++];\n-\t\tfinal Transport transport = Transport.open(db, repository);\n-\t\tif (thin != null)\n-\t\t\ttransport.setPushThin(thin);\n-\t\tif (exec != null)\n-\t\t\ttransport.setOptionReceivePack(exec);\n-\n-\t\tfor (; argi < args.length; argi++) {\n-\t\t\tRefSpec spec = new RefSpec(args[argi]);\n-\t\t\tif (forceAll)\n-\t\t\t\tspec = spec.setForceUpdate(true);\n-\t\t\trefSpecs.add(spec);\n-\t\t}\n+\t\tfinal Transport transport = Transport.open(db, remote);\n+\t\ttransport.setPushThin(thin);\n+\t\tif (receivePack != null)\n+\t\t\ttransport.setOptionReceivePack(receivePack);\n \t\tfinal Collection<RemoteRefUpdate> toPush = transport\n \t\t\t\t.findRemoteRefUpdatesFor(refSpecs);\n \n-- \n1.5.6.3.569.ga9185\n"},{"id":"83806","messageId":"1216345461-59382-26-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-25-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 25/28] Convert show-ref program to args4j","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:44:18Z","receivedAt":"2008-07-18T01:44:18Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Signed-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../src/org/spearce/jgit/pgm/ShowRef.java          |    2 +-\n 1 files changed, 1 insertions(+), 1 deletions(-)\n\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/ShowRef.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/ShowRef.java\nindex 576e342..6dfba3e 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/ShowRef.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/ShowRef.java\n@@ -44,7 +44,7 @@ import org.spearce.jgit.lib.Ref;\n \n class ShowRef extends TextBuiltin {\n \t@Override\n-\tpublic void execute(String[] args) throws Exception {\n+\tprotected void run() throws Exception {\n \t\tfor (final Ref r : new TreeMap<String, Ref>(db.getAllRefs()).values()) {\n \t\t\tshow(r.getObjectId(), r.getName());\n \t\t\tif (r.getPeeledObjectId() != null)\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83810","messageId":"1216345461-59382-27-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-26-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 26/28] Convert tag program to args4j","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:44:19Z","receivedAt":"2008-07-18T01:44:19Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Signed-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../src/org/spearce/jgit/pgm/Tag.java              |   79 ++++++++------------\n 1 files changed, 32 insertions(+), 47 deletions(-)\n\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Tag.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Tag.java\nindex d59616b..a7bd037 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Tag.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/Tag.java\n@@ -37,48 +37,35 @@\n \n package org.spearce.jgit.pgm;\n \n+import org.kohsuke.args4j.Argument;\n+import org.kohsuke.args4j.Option;\n+import org.spearce.jgit.errors.MissingObjectException;\n import org.spearce.jgit.lib.Constants;\n+import org.spearce.jgit.lib.ObjectId;\n+import org.spearce.jgit.lib.ObjectLoader;\n import org.spearce.jgit.lib.PersonIdent;\n \n class Tag extends TextBuiltin {\n+\t@Option(name = \"-f\", usage = \"force replacing an existing tag\")\n+\tprivate boolean force;\n+\n+\t@Option(name = \"-m\", metaVar = \"message\", usage = \"tag message\")\n+\tprivate String message = \"\";\n+\n+\t@Argument(index = 0, required = true, metaVar = \"name\")\n+\tprivate String tagName;\n+\n+\t@Argument(index = 1, metaVar = \"object\")\n+\tprivate ObjectId object;\n+\n \t@Override\n-\tpublic void execute(String[] args) throws Exception {\n-\t\tString tagName = null;\n-\t\tString message = null;\n-\t\tString ref = \"HEAD\";\n-\t\tboolean force = false;\n-               if (args.length == 0)\n-                       usage();\n-\t\tfor (int i = 0; i < args.length; ++i) {\n-\t\t\tif (args[i].equals(\"-f\")) {\n-\t\t\t\tforce = true;\n-\t\t\t\tcontinue;\n-\t\t\t}\n-\t\t\tif (args[i].equals(\"-m\")) {\n-\t\t\t\tif (i < args.length - 2)\n-\t\t\t\t\tmessage = args[i++] + \"\\n\";\n-\t\t\t\telse\n-\t\t\t\t\tusage();\n-\t\t\t\tcontinue;\n-\t\t\t}\n-\t\t\tif (args[i].startsWith(\"-m\")) {\n-\t\t\t\tmessage = args[i].substring(2) + \"\\n\";\n-\t\t\t\tcontinue;\n-\t\t\t}\n-\t\t\tif (args[i].startsWith(\"-\") && i == args.length - 1)\n-\t\t\t\tusage();\n-\t\t\tif (i == args.length - 2) {\n-\t\t\t\ttagName = args[i];\n-\t\t\t\tref = args[i+1];\n-\t\t\t\t++i;\n-\t\t\t\tcontinue;\n-\t\t\t}\n-\t\t\tif (i == args.length - 1) {\n-\t\t\t\ttagName = args[i];\n-\t\t\t\tcontinue;\n-\t\t\t}\n-\t\t\tusage();\n+\tprotected void run() throws Exception {\n+\t\tif (object == null) {\n+\t\t\tobject = db.resolve(Constants.HEAD);\n+\t\t\tif (object == null)\n+\t\t\t\tthrow die(\"Cannot resolve \" + Constants.HEAD);\n \t\t}\n+\n \t\tif (!tagName.startsWith(Constants.TAGS_PREFIX + \"/\"))\n \t\t\ttagName = Constants.TAGS_PREFIX + \"/\" + tagName;\n \t\tif (!force && db.resolve(tagName) != null) {\n@@ -86,19 +73,17 @@ class Tag extends TextBuiltin {\n \t\t\t\t\t+ tagName.substring(Constants.TAGS_PREFIX.length() + 1)\n \t\t\t\t\t+ \"' exists\");\n \t\t}\n+\n+\t\tfinal ObjectLoader ldr = db.openObject(object);\n+\t\tif (ldr == null)\n+\t\t\tthrow new MissingObjectException(object, \"any\");\n+\n \t\torg.spearce.jgit.lib.Tag tag = new org.spearce.jgit.lib.Tag(db);\n-\t\ttag.setObjId(db.resolve(ref));\n-\t\tif (message != null) {\n-\t\t\tmessage = message.replaceAll(\"\\r\", \"\");\n-\t\t\ttag.setMessage(message);\n-\t\t\ttag.setTagger(new PersonIdent(db));\n-\t\t\ttag.setType(\"commit\");\n-\t\t}\n+\t\ttag.setObjId(object);\n+\t\ttag.setType(Constants.typeString(ldr.getType()));\n+\t\ttag.setTagger(new PersonIdent(db));\n+\t\ttag.setMessage(message.replaceAll(\"\\r\", \"\"));\n \t\ttag.setTag(tagName.substring(Constants.TAGS_PREFIX.length() + 1));\n \t\ttag.tag();\n \t}\n-\n-\tprivate void usage() {\n-               throw die(\"Usage: [-m message] [-f] tag [head]\");\n-\t}\n }\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83809","messageId":"1216345461-59382-28-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-27-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 27/28] Convert rev-list, log, glog programs to args4j","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:44:20Z","receivedAt":"2008-07-18T01:44:20Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Signed-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../org/spearce/jgit/pgm/RevWalkTextBuiltin.java   |  146 +++++++++++---------\n 1 files changed, 80 insertions(+), 66 deletions(-)\n\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/RevWalkTextBuiltin.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/RevWalkTextBuiltin.java\nindex 2aba3c5..97fe7a4 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/RevWalkTextBuiltin.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/RevWalkTextBuiltin.java\n@@ -41,9 +41,14 @@ import java.util.ArrayList;\n import java.util.EnumSet;\n import java.util.List;\n \n+import org.kohsuke.args4j.Argument;\n+import org.kohsuke.args4j.Option;\n import org.spearce.jgit.lib.Constants;\n+import org.spearce.jgit.lib.ObjectId;\n+import org.spearce.jgit.pgm.opt.PathTreeFilterHandler;\n import org.spearce.jgit.revwalk.ObjectWalk;\n import org.spearce.jgit.revwalk.RevCommit;\n+import org.spearce.jgit.revwalk.RevFlag;\n import org.spearce.jgit.revwalk.RevObject;\n import org.spearce.jgit.revwalk.RevSort;\n import org.spearce.jgit.revwalk.RevWalk;\n@@ -53,98 +58,105 @@ import org.spearce.jgit.revwalk.filter.CommitterRevFilter;\n import org.spearce.jgit.revwalk.filter.MessageRevFilter;\n import org.spearce.jgit.revwalk.filter.RevFilter;\n import org.spearce.jgit.treewalk.filter.AndTreeFilter;\n-import org.spearce.jgit.treewalk.filter.PathFilter;\n-import org.spearce.jgit.treewalk.filter.PathFilterGroup;\n import org.spearce.jgit.treewalk.filter.TreeFilter;\n \n abstract class RevWalkTextBuiltin extends TextBuiltin {\n \tRevWalk walk;\n \n+\t@Option(name = \"--objects\")\n \tboolean objects = false;\n \n+\t@Option(name = \"--parents\")\n \tboolean parents = false;\n \n+\t@Option(name = \"--total-count\")\n \tboolean count = false;\n \n \tchar[] outbuffer = new char[Constants.OBJECT_ID_LENGTH * 2];\n \n-\t@Override\n-\tpublic final void execute(String[] args) throws Exception {\n-\t\tfinal EnumSet<RevSort> sorting = EnumSet.noneOf(RevSort.class);\n-\t\tfinal List<String> argList = new ArrayList<String>();\n-\t\tfinal List<RevFilter> revLimiter = new ArrayList<RevFilter>();\n-\t\tList<PathFilter> pathLimiter = null;\n-\t\tfor (final String a : args) {\n-\t\t\tif (pathLimiter != null)\n-\t\t\t\tpathLimiter.add(PathFilter.create(a));\n-\t\t\telse if (\"--\".equals(a))\n-\t\t\t\tpathLimiter = new ArrayList<PathFilter>();\n-\t\t\telse if (a.startsWith(\"--author=\"))\n-\t\t\t\trevLimiter.add(AuthorRevFilter.create(a.substring(\"--author=\"\n-\t\t\t\t\t\t.length())));\n-\t\t\telse if (a.startsWith(\"--committer=\"))\n-\t\t\t\trevLimiter.add(CommitterRevFilter.create(a\n-\t\t\t\t\t\t.substring(\"--committer=\".length())));\n-\t\t\telse if (a.startsWith(\"--grep=\"))\n-\t\t\t\trevLimiter.add(MessageRevFilter.create(a.substring(\"--grep=\"\n-\t\t\t\t\t\t.length())));\n-\t\t\telse if (\"--objects\".equals(a))\n-\t\t\t\tobjects = true;\n-\t\t\telse if (\"--date-order\".equals(a))\n-\t\t\t\tsorting.add(RevSort.COMMIT_TIME_DESC);\n-\t\t\telse if (\"--topo-order\".equals(a))\n-\t\t\t\tsorting.add(RevSort.TOPO);\n-\t\t\telse if (\"--reverse\".equals(a))\n-\t\t\t\tsorting.add(RevSort.REVERSE);\n-\t\t\telse if (\"--boundary\".equals(a))\n-\t\t\t\tsorting.add(RevSort.BOUNDARY);\n-\t\t\telse if (\"--parents\".equals(a))\n-\t\t\t\tparents = true;\n-\t\t\telse if (\"--total-count\".equals(a))\n-\t\t\t\tcount = true;\n-\t\t\telse\n-\t\t\t\targList.add(a);\n-\t\t}\n+\tprivate final EnumSet<RevSort> sorting = EnumSet.noneOf(RevSort.class);\n+\n+\tprivate void enableRevSort(final RevSort type, final boolean on) {\n+\t\tif (on)\n+\t\t\tsorting.add(type);\n+\t\telse\n+\t\t\tsorting.remove(type);\n+\t}\n+\n+\t@Option(name = \"--date-order\")\n+\tvoid enableDateOrder(final boolean on) {\n+\t\tenableRevSort(RevSort.COMMIT_TIME_DESC, on);\n+\t}\n+\n+\t@Option(name = \"--topo-order\")\n+\tvoid enableTopoOrder(final boolean on) {\n+\t\tenableRevSort(RevSort.TOPO, on);\n+\t}\n+\n+\t@Option(name = \"--reverse\")\n+\tvoid enableReverse(final boolean on) {\n+\t\tenableRevSort(RevSort.REVERSE, on);\n+\t}\n+\n+\t@Option(name = \"--boundary\")\n+\tvoid enableBoundary(final boolean on) {\n+\t\tenableRevSort(RevSort.BOUNDARY, on);\n+\t}\n+\n+\t@Argument(index = 0, metaVar = \"commit-ish\")\n+\tprivate final List<RevCommit> commits = new ArrayList<RevCommit>();\n+\n+\t@Option(name = \"--\", metaVar = \"path\", multiValued = true, handler = PathTreeFilterHandler.class)\n+\tprivate TreeFilter pathFilter = TreeFilter.ALL;\n+\n+\tprivate final List<RevFilter> revLimiter = new ArrayList<RevFilter>();\n \n+\t@Option(name = \"--author\")\n+\tvoid addAuthorRevFilter(final String who) {\n+\t\trevLimiter.add(AuthorRevFilter.create(who));\n+\t}\n+\n+\t@Option(name = \"--committer\")\n+\tvoid addCommitterRevFilter(final String who) {\n+\t\trevLimiter.add(CommitterRevFilter.create(who));\n+\t}\n+\n+\t@Option(name = \"--grep\")\n+\tvoid addCMessageRevFilter(final String msg) {\n+\t\trevLimiter.add(MessageRevFilter.create(msg));\n+\t}\n+\n+\t@Override\n+\tprotected void run() throws Exception {\n \t\twalk = createWalk();\n \t\tfor (final RevSort s : sorting)\n \t\t\twalk.sort(s, true);\n \n-\t\tif (pathLimiter != null && !pathLimiter.isEmpty())\n-\t\t\twalk.setTreeFilter(AndTreeFilter.create(PathFilterGroup\n-\t\t\t\t\t.create(pathLimiter), TreeFilter.ANY_DIFF));\n+\t\tif (pathFilter != TreeFilter.ALL)\n+\t\t\twalk.setTreeFilter(AndTreeFilter.create(pathFilter,\n+\t\t\t\t\tTreeFilter.ANY_DIFF));\n \n \t\tif (revLimiter.size() == 1)\n \t\t\twalk.setRevFilter(revLimiter.get(0));\n \t\telse if (revLimiter.size() > 1)\n \t\t\twalk.setRevFilter(AndRevFilter.create(revLimiter));\n \n-\t\tfinal long start = System.currentTimeMillis();\n-\t\tboolean have_revision = false;\n-\t\tboolean not = false;\n-\t\tfor (String a : argList) {\n-\t\t\tif (\"--not\".equals(a)) {\n-\t\t\t\tnot = true;\n-\t\t\t\tcontinue;\n-\t\t\t}\n-\t\t\tboolean menot = false;\n-\t\t\tif (a.startsWith(\"^\")) {\n-\t\t\t\ta = a.substring(1);\n-\t\t\t\tmenot = true;\n-\t\t\t}\n-\t\t\tfinal RevCommit c = walk.parseCommit(resolve(a));\n-\t\t\tif (not ^ menot)\n-\t\t\t\twalk.markUninteresting(c);\n-\t\t\telse {\n+\t\tif (commits.isEmpty()) {\n+\t\t\tfinal ObjectId head = db.resolve(Constants.HEAD);\n+\t\t\tif (head == null)\n+\t\t\t\tthrow die(\"Cannot resolve \" + Constants.HEAD);\n+\t\t\tcommits.add(walk.parseCommit(head));\n+\t\t}\n+\t\tfor (final RevCommit c : commits) {\n+\t\t\tfinal RevCommit real = argWalk == walk ? c : walk.parseCommit(c);\n+\t\t\tif (c.has(RevFlag.UNINTERESTING))\n+\t\t\t\twalk.markUninteresting(real);\n+\t\t\telse\n \t\t\t\twalk.markStart(c);\n-\t\t\t\thave_revision = true;\n-\t\t\t}\n \t\t}\n-\t\tif (!have_revision)\n-\t\t\twalk.markStart(walk.parseCommit(resolve(\"HEAD\")));\n-\n-\t\tint n = walkLoop();\n \n+\t\tfinal long start = System.currentTimeMillis();\n+\t\tfinal int n = walkLoop();\n \t\tif (count) {\n \t\t\tfinal long end = System.currentTimeMillis();\n \t\t\tSystem.err.print(n);\n@@ -158,7 +170,9 @@ abstract class RevWalkTextBuiltin extends TextBuiltin {\n \tprotected RevWalk createWalk() {\n \t\tif (objects)\n \t\t\treturn new ObjectWalk(db);\n-\t\treturn new RevWalk(db);\n+\t\tif (argWalk == null)\n+\t\t\targWalk = new RevWalk(db);\n+\t\treturn argWalk;\n \t}\n \n \tprotected int walkLoop() throws Exception {\n-- \n1.5.6.3.569.ga9185\n"},{"id":"83807","messageId":"1216345461-59382-29-git-send-email-spearce@spearce.org","threadId":"14517","inReplyTo":"1216345461-59382-28-git-send-email-spearce@spearce.org","subject":"[JGIT PATCH 28/28] Remove support for legacy style TextBuiltins","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-07-18T01:44:21Z","receivedAt":"2008-07-18T01:44:21Z","isPatch":true,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Now that all builtins use the new automatic parsing support\nwe want to require that they override run() and do not try\nto override execute().\n\nSigned-off-by: Shawn O. Pearce <spearce@spearce.org>\n---\n .../src/org/spearce/jgit/pgm/TextBuiltin.java      |    6 ++----\n 1 files changed, 2 insertions(+), 4 deletions(-)\n\ndiff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/TextBuiltin.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/TextBuiltin.java\nindex c4a55f4..9f90c16 100644\n--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/TextBuiltin.java\n+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/TextBuiltin.java\n@@ -113,7 +113,7 @@ public abstract class TextBuiltin {\n \t *             framework will catch the exception and print a message on\n \t *             standard error.\n \t */\n-\tpublic void execute(String[] args) throws Exception {\n+\tpublic final void execute(String[] args) throws Exception {\n \t\tparseArguments(args);\n \t\trun();\n \t}\n@@ -166,9 +166,7 @@ public abstract class TextBuiltin {\n \t *             framework will catch the exception and print a message on\n \t *             standard error.\n \t */\n-\tprotected void run() throws Exception {\n-\t\tthrow die(\"Override either execute (legacy) or run (new style).\");\n-\t}\n+\tprotected abstract void run() throws Exception;\n \n \t/**\n \t * @return the repository this command accesses.\n-- \n1.5.6.3.569.ga9185\n"}]}