src/main/java/com/gitblit/transport/ssh/commands/ListCommand.java
@@ -22,9 +22,11 @@ import org.kohsuke.args4j.Option; import com.gitblit.utils.JsonUtils; /** * Parent class of a list command. * * * @author James Moger * * @param <T> @@ -34,27 +36,40 @@ @Option(name = "--verbose", aliases = { "-v" }, usage = "verbose") protected boolean verbose; @Option(name = "--tabbed", aliases = { "-t" }, usage = "as tabbed output") @Option(name = "--tabbed", usage = "generate tabbed-text output") protected boolean tabbed; @Option(name = "--json", usage = "generate JSON output") protected boolean json; private DateFormat df; protected abstract List<T> getItems() throws UnloggedFailure; protected void validateOutputFormat() throws UnloggedFailure { if (tabbed && json) { throw new UnloggedFailure(1, "Please specify --tabbed OR --json, not both!"); } } @Override public void run() throws UnloggedFailure { validateOutputFormat(); List<T> list = getItems(); if (tabbed) { asTabbed(list); } else if (json) { asJSON(list); } else { asTable(list); } } protected abstract void asTable(List<T> list); protected abstract void asTabbed(List<T> list); protected void outTabbed(Object... values) { StringBuilder pattern = new StringBuilder(); for (int i = 0; i < values.length; i++) { @@ -63,7 +78,11 @@ pattern.setLength(pattern.length() - 1); stdout.println(String.format(pattern.toString(), values)); } protected void asJSON(List<T> list) { stdout.println(JsonUtils.toJsonString(list)); } protected String formatDate(Date date) { if (df == null) { df = new SimpleDateFormat("yyyy-MM-dd"); src/main/java/com/gitblit/transport/ssh/commands/ListFilterCommand.java
File was renamed from src/main/java/com/gitblit/transport/ssh/commands/ListRegexCommand.java @@ -23,31 +23,33 @@ import com.gitblit.utils.StringUtils; /** * List command that accepts a regex filter parameter. * * List command that accepts a filter parameter. * * @author James Moger * * @param <T> */ public abstract class ListRegexCommand<T> extends ListCommand<T> { public abstract class ListFilterCommand<T> extends ListCommand<T> { @Argument(index = 0, metaVar = "REGEX", usage = "regex filter expression") protected String regexFilter; protected abstract boolean matches(T t); @Argument(index = 0, metaVar = "FILTER", usage = "filter expression") private String filter; protected abstract boolean matches(String filter, T t); @Override public void run() throws UnloggedFailure { validateOutputFormat(); List<T> list = getItems(); List<T> filtered; if (StringUtils.isEmpty(regexFilter)) { // no regex filter if (StringUtils.isEmpty(filter)) { // no filter filtered = list; } else { // regex filter the list // filter the list filtered = new ArrayList<T>(); for (T t : list) { if (matches(t)) { if (matches(filter, t)) { filtered.add(t); } } @@ -55,6 +57,8 @@ if (tabbed) { asTabbed(filtered); } else if (json) { asJSON(filtered); } else { asTable(filtered); } src/main/java/com/gitblit/transport/ssh/gitblit/ProjectsDispatcher.java
@@ -22,7 +22,7 @@ import com.gitblit.models.UserModel; import com.gitblit.transport.ssh.commands.CommandMetaData; import com.gitblit.transport.ssh.commands.DispatchCommand; import com.gitblit.transport.ssh.commands.ListRegexCommand; import com.gitblit.transport.ssh.commands.ListFilterCommand; import com.gitblit.utils.FlipTable; import com.gitblit.utils.FlipTable.Borders; @@ -36,7 +36,7 @@ /* List projects */ @CommandMetaData(name = "list", aliases= { "ls" }, description = "List projects") public static class ListProjects extends ListRegexCommand<ProjectModel> { public static class ListProjects extends ListFilterCommand<ProjectModel> { @Override protected List<ProjectModel> getItems() { @@ -48,8 +48,8 @@ } @Override protected boolean matches(ProjectModel p) { return p.name.matches(regexFilter); protected boolean matches(String filter, ProjectModel p) { return p.name.matches(filter); } @Override src/main/java/com/gitblit/transport/ssh/gitblit/RepositoriesDispatcher.java
@@ -22,7 +22,7 @@ import com.gitblit.models.UserModel; import com.gitblit.transport.ssh.commands.CommandMetaData; import com.gitblit.transport.ssh.commands.DispatchCommand; import com.gitblit.transport.ssh.commands.ListRegexCommand; import com.gitblit.transport.ssh.commands.ListFilterCommand; import com.gitblit.utils.ArrayUtils; import com.gitblit.utils.FlipTable; import com.gitblit.utils.FlipTable.Borders; @@ -38,7 +38,7 @@ /* List repositories */ @CommandMetaData(name = "list", aliases = { "ls" }, description = "List repositories") public static class ListRepositories extends ListRegexCommand<RepositoryModel> { public static class ListRepositories extends ListFilterCommand<RepositoryModel> { @Override protected List<RepositoryModel> getItems() { @@ -49,8 +49,8 @@ } @Override protected boolean matches(RepositoryModel r) { return r.name.matches(regexFilter); protected boolean matches(String filter, RepositoryModel r) { return r.name.matches(filter); } @Override src/main/java/com/gitblit/transport/ssh/gitblit/UsersDispatcher.java
@@ -25,7 +25,7 @@ import com.gitblit.models.UserModel; import com.gitblit.transport.ssh.commands.CommandMetaData; import com.gitblit.transport.ssh.commands.DispatchCommand; import com.gitblit.transport.ssh.commands.ListRegexCommand; import com.gitblit.transport.ssh.commands.ListFilterCommand; import com.gitblit.transport.ssh.commands.SshCommand; import com.gitblit.utils.FlipTable; import com.gitblit.utils.FlipTable.Borders; @@ -96,7 +96,7 @@ } @CommandMetaData(name = "list", aliases= { "ls" }, description = "List users") public static class ListUsers extends ListRegexCommand<UserModel> { public static class ListUsers extends ListFilterCommand<UserModel> { @Override protected List<UserModel> getItems() { @@ -106,8 +106,8 @@ } @Override protected boolean matches(UserModel u) { return u.username.matches(regexFilter); protected boolean matches(String filter, UserModel u) { return u.username.matches(filter); } @Override