James Moger
2014-04-01 e5d0bacbf746e09a9194822b231cb27090f58973
src/main/java/com/gitblit/transport/ssh/commands/PluginDispatcher.java
@@ -19,6 +19,7 @@
import java.util.List;
import org.kohsuke.args4j.Argument;
import org.kohsuke.args4j.Option;
import ro.fortsoft.pf4j.PluginDependency;
import ro.fortsoft.pf4j.PluginDescriptor;
@@ -26,6 +27,8 @@
import ro.fortsoft.pf4j.PluginWrapper;
import com.gitblit.manager.IGitblit;
import com.gitblit.models.PluginRegistry.PluginRegistration;
import com.gitblit.models.PluginRegistry.PluginRelease;
import com.gitblit.models.UserModel;
import com.gitblit.utils.FlipTable;
import com.gitblit.utils.FlipTable.Borders;
@@ -46,7 +49,8 @@
      register(user, StopPlugin.class);
      register(user, ShowPlugin.class);
      register(user, RemovePlugin.class);
      register(user, UploadPlugin.class);
      register(user, InstallPlugin.class);
      register(user, AvailablePlugins.class);
   }
   @CommandMetaData(name = "list", aliases = { "ls" }, description = "List the loaded plugins")
@@ -283,11 +287,97 @@
      }
   }
   
   @CommandMetaData(name = "receive", aliases= { "upload" }, description = "Upload a plugin to the server", hidden = true)
   public static class UploadPlugin extends SshCommand {
   @CommandMetaData(name = "install", description = "Download and installs a plugin", hidden = true)
   public static class InstallPlugin extends SshCommand {
      @Argument(index = 0, required = true, metaVar = "<URL>|<ID>|<NAME>", usage = "the id, name, or the url of the plugin to download and install")
      protected String urlOrIdOrName;
      @Option(name = "--version", usage = "The specific version to install")
      private String version;
      @Override
      public void run() throws UnloggedFailure {
         IGitblit gitblit = getContext().getGitblit();
         try {
            String ulc = urlOrIdOrName.toLowerCase();
            if (ulc.startsWith("http://") || ulc.startsWith("https://")) {
               if (gitblit.installPlugin(urlOrIdOrName)) {
                  stdout.println(String.format("Installed %s", urlOrIdOrName));
               } else {
                  new UnloggedFailure(1, String.format("Failed to install %s", urlOrIdOrName));
               }
            } else {
               PluginRelease pv = gitblit.lookupRelease(urlOrIdOrName, version);
               if (pv == null) {
                  throw new UnloggedFailure(1,  String.format("Plugin \"%s\" is not in the registry!", urlOrIdOrName));
               }
               if (gitblit.installPlugin(pv)) {
                  stdout.println(String.format("Installed %s", urlOrIdOrName));
               } else {
                  throw new UnloggedFailure(1, String.format("Failed to install %s", urlOrIdOrName));
               }
            }
         } catch (Exception e) {
            log.error("Failed to install " + urlOrIdOrName, e);
            throw new UnloggedFailure(1, String.format("Failed to install %s", urlOrIdOrName), e);
         }
      }
   }
   @CommandMetaData(name = "available", description = "List the available plugins")
   public static class AvailablePlugins extends ListFilterCommand<PluginRegistration> {
      @Option(name = "--refresh", aliases = { "-r" }, usage = "refresh the plugin registry")
      protected boolean refresh;
      @Override
      protected List<PluginRegistration> getItems() throws UnloggedFailure {
         IGitblit gitblit = getContext().getGitblit();
         if (refresh) {
            gitblit.refreshRegistry();
         }
         List<PluginRegistration> list = gitblit.getRegisteredPlugins();
         return list;
      }
      @Override
      protected boolean matches(String filter, PluginRegistration t) {
         return t.id.matches(filter) || t.name.matches(filter);
      }
      @Override
      protected void asTable(List<PluginRegistration> list) {
         String[] headers;
         if (verbose) {
            String [] h = { "Name", "Description", "Installed", "Release", "State", "Id", "Provider" };
            headers = h;
         } else {
            String [] h = { "Name", "Description", "Installed", "Release", "State" };
            headers = h;
         }
         Object[][] data = new Object[list.size()][];
         for (int i = 0; i < list.size(); i++) {
            PluginRegistration p = list.get(i);
            if (verbose) {
               data[i] = new Object[] {p.name, p.description, p.installedRelease, p.currentRelease, p.getInstallState(), p.id, p.provider};
            } else {
               data[i] = new Object[] {p.name, p.description, p.installedRelease, p.currentRelease, p.getInstallState()};
            }
         }
         stdout.println(FlipTable.of(headers, data, Borders.BODY_HCOLS));
      }
      @Override
      protected void asTabbed(List<PluginRegistration> list) {
         for (PluginRegistration p : list) {
            if (verbose) {
               outTabbed(p.name, p.description, p.currentRelease, p.getInstallState(), p.id, p.provider);
            } else {
               outTabbed(p.name, p.description, p.currentRelease, p.getInstallState());
            }
         }
      }
   }
}