From a3de33e71a22268105714e01d09c1c2e28bfe2c3 Mon Sep 17 00:00:00 2001
From: David Ostrovsky <david@ostrovsky.org>
Date: Thu, 10 Apr 2014 18:58:07 -0400
Subject: [PATCH] Fix command dispatching

---
 src/main/java/com/gitblit/transport/ssh/commands/DispatchCommand.java |   44 ++++++++++++++++++++++++++++++--------------
 1 files changed, 30 insertions(+), 14 deletions(-)

diff --git a/src/main/java/com/gitblit/transport/ssh/commands/DispatchCommand.java b/src/main/java/com/gitblit/transport/ssh/commands/DispatchCommand.java
index 0d614a0..b6944ea 100644
--- a/src/main/java/com/gitblit/transport/ssh/commands/DispatchCommand.java
+++ b/src/main/java/com/gitblit/transport/ssh/commands/DispatchCommand.java
@@ -44,9 +44,17 @@
 
   private Set<Class<? extends Command>> commands;
   private Map<String, Class<? extends Command>> map;
+  private Map<String, Command> root;
 
   public DispatchCommand() {
 	  commands = new HashSet<Class<? extends Command>>();
+  }
+
+  public void registerDispatcher(String name, Command cmd) {
+	  if (root == null) {
+		  root = Maps.newHashMap();
+	  }
+	  root.put(name, cmd);
   }
 
   public void registerCommand(Class<? extends Command> cmd) {
@@ -78,20 +86,7 @@
         throw new UnloggedFailure(1, msg.toString());
       }
 
-      final Class<? extends Command> c = getMap().get(commandName);
-      if (c == null) {
-        String msg =
-            (getName().isEmpty() ? "Gitblit" : getName()) + ": "
-                + commandName + ": not found";
-        throw new UnloggedFailure(1, msg);
-      }
-
-      Command cmd = null;
-      try {
-    	  cmd = c.newInstance();
-      } catch (Exception e) {
-    	  throw new UnloggedFailure(1, MessageFormat.format("Failed to instantiate {0} command", commandName));
-      }
+      Command cmd = getCommand();
       if (cmd instanceof BaseCommand) {
         BaseCommand bc = (BaseCommand) cmd;
         if (getName().isEmpty()) {
@@ -119,6 +114,27 @@
     }
   }
 
+  private Command getCommand() throws UnloggedFailure {
+	if (root != null && root.containsKey(commandName)) {
+		return root.get(commandName);
+	}
+	final Class<? extends Command> c = getMap().get(commandName);
+      if (c == null) {
+        String msg =
+            (getName().isEmpty() ? "Gitblit" : getName()) + ": "
+                + commandName + ": not found";
+        throw new UnloggedFailure(1, msg);
+      }
+
+      Command cmd = null;
+      try {
+    	  cmd = c.newInstance();
+      } catch (Exception e) {
+    	  throw new UnloggedFailure(1, MessageFormat.format("Failed to instantiate {0} command", commandName));
+      }
+	return cmd;
+  }
+
   @Override
 protected String usage() {
     final StringBuilder usage = new StringBuilder();

--
Gitblit v1.9.1