From 030fd739b3151162c4e84e9c63ce57532af45219 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Thu, 10 Apr 2014 18:58:08 -0400
Subject: [PATCH] Support hidden commands and hide create-repo and review

---
 src/main/java/com/gitblit/transport/ssh/commands/DispatchCommand.java |   63 +++++++++++++++++++++++++++++--
 1 files changed, 58 insertions(+), 5 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 b6944ea..83707f7 100644
--- a/src/main/java/com/gitblit/transport/ssh/commands/DispatchCommand.java
+++ b/src/main/java/com/gitblit/transport/ssh/commands/DispatchCommand.java
@@ -27,7 +27,13 @@
 import org.apache.sshd.server.Environment;
 import org.kohsuke.args4j.Argument;
 
+import com.gitblit.git.GitblitReceivePackFactory;
+import com.gitblit.git.GitblitUploadPackFactory;
+import com.gitblit.git.RepositoryResolver;
+import com.gitblit.transport.ssh.AbstractGitCommand;
 import com.gitblit.transport.ssh.CommandMetaData;
+import com.gitblit.transport.ssh.SshKeyAuthenticator;
+import com.gitblit.transport.ssh.SshDaemonClient;
 import com.gitblit.utils.cli.SubcommandHandler;
 import com.google.common.base.Charsets;
 import com.google.common.base.Strings;
@@ -95,11 +101,11 @@
           bc.setName(getName() + " " + commandName);
         }
         bc.setArguments(args.toArray(new String[args.size()]));
-      } else if (!args.isEmpty()) {
-        throw new UnloggedFailure(1, commandName + " does not take arguments");
       }
 
-      provideStateTo(cmd);
+      provideBaseStateTo(cmd);
+      provideGitState(cmd);
+      reset();
       //atomicCmd.set(cmd);
       cmd.start(env);
 
@@ -136,7 +142,7 @@
   }
 
   @Override
-protected String usage() {
+  protected String usage() {
     final StringBuilder usage = new StringBuilder();
     usage.append("Available commands");
     if (!getName().isEmpty()) {
@@ -154,9 +160,12 @@
     String format = "%-" + maxLength + "s   %s";
     for (String name : Sets.newTreeSet(m.keySet())) {
       final Class<? extends Command> c = m.get(name);
-      usage.append("   ");
       CommandMetaData meta = c.getAnnotation(CommandMetaData.class);
       if (meta != null) {
+        if (meta.hidden()) {
+        	continue;
+        }
+        usage.append("   ");
         usage.append(String.format(format, name,
             Strings.nullToEmpty(meta.description())));
       }
@@ -173,4 +182,48 @@
     usage.append("\n");
     return usage.toString();
   }
+
+  // This is needed because we are not using provider or
+  // clazz.newInstance() for DispatchCommand
+  private void reset() {
+	  args = new ArrayList<String>();
+  }
+
+  private void provideGitState(Command cmd) {
+	  if (cmd instanceof AbstractGitCommand) {
+		AbstractGitCommand a = (AbstractGitCommand) cmd;
+		a.setRepositoryResolver(repositoryResolver);
+		a.setUploadPackFactory(gitblitUploadPackFactory);
+		a.setReceivePackFactory(gitblitReceivePackFactory);
+	  } else if (cmd instanceof DispatchCommand) {
+		DispatchCommand d = (DispatchCommand)cmd;
+		d.setRepositoryResolver(repositoryResolver);
+		d.setUploadPackFactory(gitblitUploadPackFactory);
+		d.setReceivePackFactory(gitblitReceivePackFactory);
+		d.setAuthenticator(authenticator);
+	  } else if (cmd instanceof BaseKeyCommand) {
+		  BaseKeyCommand k = (BaseKeyCommand)cmd;
+		  k.setAuthenticator(authenticator);
+	  }
+  }
+
+  private RepositoryResolver<SshDaemonClient> repositoryResolver;
+  public void setRepositoryResolver(RepositoryResolver<SshDaemonClient> repositoryResolver) {
+	  this.repositoryResolver = repositoryResolver;
+  }
+
+  private GitblitUploadPackFactory<SshDaemonClient> gitblitUploadPackFactory;
+  public void setUploadPackFactory(GitblitUploadPackFactory<SshDaemonClient> gitblitUploadPackFactory) {
+	  this.gitblitUploadPackFactory = gitblitUploadPackFactory;
+  }
+
+  private GitblitReceivePackFactory<SshDaemonClient> gitblitReceivePackFactory;
+  public void setReceivePackFactory(GitblitReceivePackFactory<SshDaemonClient> gitblitReceivePackFactory) {
+	  this.gitblitReceivePackFactory = gitblitReceivePackFactory;
+  }
+
+  private SshKeyAuthenticator authenticator;
+  public void setAuthenticator(SshKeyAuthenticator authenticator) {
+	this.authenticator = authenticator;
+  }
 }

--
Gitblit v1.9.1