[JGIT PATCH 9/9] Add debug-show-commands to display the command table
This can be useful to debug the command catalog.
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
.../services/org.spearce.jgit.pgm.TextBuiltin | 2 +
.../src/org/spearce/jgit/pgm/CommandRef.java | 7 ++
.../org/spearce/jgit/pgm/debug/ShowCommands.java | 78 ++++++++++++++++++++
3 files changed, 87 insertions(+), 0 deletions(-)
create mode 100644 org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/debug/ShowCommands.java
diff --git a/org.spearce.jgit.pgm/src/META-INF/services/org.spearce.jgit.pgm.TextBuiltin b/org.spearce.jgit.pgm/src/META-INF/services/org.spearce.jgit.pgm.TextBuiltin
index 69ef046..1ff5a30 100644
--- a/org.spearce.jgit.pgm/src/META-INF/services/org.spearce.jgit.pgm.TextBuiltin
+++ b/org.spearce.jgit.pgm/src/META-INF/services/org.spearce.jgit.pgm.TextBuiltin
@@ -10,3 +10,5 @@ org.spearce.jgit.pgm.Push
org.spearce.jgit.pgm.RevList
org.spearce.jgit.pgm.ShowRev
org.spearce.jgit.pgm.Tag
+
+org.spearce.jgit.pgm.debug.ShowCommands
diff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/CommandRef.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/CommandRef.java
index 40400a7..8bf784b 100644
--- a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/CommandRef.java
+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/CommandRef.java
@@ -120,6 +120,13 @@ public class CommandRef {
}
/**
+ * @return loader for {@link #getImplementationClassName()}.
+ */
+ public ClassLoader getImplementationClassLoader() {
+ return impl.getClassLoader();
+ }
+
+ /**
* @return a new instance of the command implementation.
*/
public TextBuiltin create() {
diff --git a/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/debug/ShowCommands.java b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/debug/ShowCommands.java
new file mode 100644
index 0000000..64ecf7f
--- /dev/null
+++ b/org.spearce.jgit.pgm/src/org/spearce/jgit/pgm/debug/ShowCommands.java
@@ -0,0 +1,78 @@
+package org.spearce.jgit.pgm.debug;
+
+import java.net.URL;
+
+import org.kohsuke.args4j.Option;
+import org.spearce.jgit.pgm.Command;
+import org.spearce.jgit.pgm.CommandCatalog;
+import org.spearce.jgit.pgm.CommandRef;
+import org.spearce.jgit.pgm.TextBuiltin;
+
+@Command(usage = "Display a list of all registered jgit commands")
+class ShowCommands extends TextBuiltin {
+ @Option(name = "--pretty", usage = "alter the detail shown")
+ private Format pretty = Format.USAGE;
+
+ @Override
+ protected void run() throws Exception {
+ final CommandRef[] list = CommandCatalog.all();
+
+ int width = 0;
+ for (final CommandRef c : list)
+ width = Math.max(width, c.getName().length());
+ width += 2;
+
+ for (final CommandRef c : list) {
+ System.err.print(c.isCommon() ? '*' : ' ');
+ System.err.print(' ');
+
+ System.err.print(c.getName());
+ for (int i = c.getName().length(); i < width; i++)
+ System.err.print(' ');
+
+ pretty.print(c);
+ System.err.println();
+ }
+ System.err.println();
+ }
+
+ static enum Format {
+ /** */
+ USAGE {
+ void print(final CommandRef c) {
+ System.err.print(c.getUsage());
+ }
+ },
+
+ /** */
+ CLASSES {
+ void print(final CommandRef c) {
+ System.err.print(c.getImplementationClassName());
+ }
+ },
+
+ /** */
+ URLS {
+ void print(final CommandRef c) {
+ final ClassLoader ldr = c.getImplementationClassLoader();
+
+ String cn = c.getImplementationClassName();
+ cn = cn.replace('.', '/') + ".class";
+
+ final URL url = ldr.getResource(cn);
+ if (url == null) {
+ System.err.print("!! NOT FOUND !!");
+ return;
+ }
+
+ String rn = url.toExternalForm();
+ if (rn.endsWith(cn))
+ rn = rn.substring(0, rn.length() - cn.length());
+
+ System.err.print(rn);
+ }
+ };
+
+ abstract void print(CommandRef c);
+ }
+}
--
1.6.0.rc0.182.gb96c7