From c75304637f5535e634e57d4ed933c0fdb594d890 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Fri, 28 Oct 2011 08:08:00 -0400 Subject: [PATCH] Added a list branches rpc --- docs/02_rpc.mkd | 7 +++ src/com/gitblit/RpcFilter.java | 2 tests/com/gitblit/tests/RpcTests.java | 16 ++++++-- src/com/gitblit/GitBlitException.java | 4 ++ src/com/gitblit/utils/RpcUtils.java | 21 ++++++++++ src/com/gitblit/RpcServlet.java | 27 +++++++++++++ src/com/gitblit/Constants.java | 2 7 files changed, 72 insertions(+), 7 deletions(-) diff --git a/docs/02_rpc.mkd b/docs/02_rpc.mkd index 13bf8ef..bf2cf24 100644 --- a/docs/02_rpc.mkd +++ b/docs/02_rpc.mkd @@ -18,6 +18,7 @@ <tr><th>req=</th><th>name=</th><th>post body</th><th>response body</th></tr> <tr><td colspan='5'><em>web.enableRpcServlet=true</em></td></tr> <tr><td>LIST_REPOSITORIES</td><td>-</td><td>-</td><td>-</td><td>Map<String, RepositoryModel></td></tr> +<tr><td>LIST_BRANCHES</td><td>-</td><td>-</td><td>-</td><td>Map<String, List<String>></td></tr> <tr><td colspan='5'><em>web.enableRpcManagement=true</em></td></tr> <tr><td>CREATE_REPOSITORY</td><td>repository name</td><td><em>admin</em></td><td>RepositoryModel</td><td>-</td></tr> <tr><td>EDIT_REPOSITORY</td><td>repository name</td><td><em>admin</em></td><td>RepositoryModel</td><td>-</td></tr> @@ -208,6 +209,9 @@ <pre> { "bootDate": "2011-10-22T12:13:00Z", + "version": "0.7.0-SNAPSHOT", + "releaseDate": "PENDING", + "isGO": true, "systemProperties": { "file.encoding": "Cp1252", "java.home": "C:\\Program Files\\Java\\jdk1.6.0_26\\jre", @@ -226,6 +230,7 @@ }, "heapAllocated": 128057344, "heapFree": 120399168, - "heapSize": 1899560960 + "heapSize": 1899560960, + "servletContainer": "jetty/7.4.3.v20110701" } </pre> \ No newline at end of file diff --git a/src/com/gitblit/Constants.java b/src/com/gitblit/Constants.java index 450c11f..2514305 100644 --- a/src/com/gitblit/Constants.java +++ b/src/com/gitblit/Constants.java @@ -201,7 +201,7 @@ * a client. */ public static enum RpcRequest { - LIST_REPOSITORIES, CREATE_REPOSITORY, EDIT_REPOSITORY, DELETE_REPOSITORY, + LIST_REPOSITORIES, LIST_BRANCHES, CREATE_REPOSITORY, EDIT_REPOSITORY, DELETE_REPOSITORY, LIST_USERS, CREATE_USER, EDIT_USER, DELETE_USER, LIST_REPOSITORY_MEMBERS, SET_REPOSITORY_MEMBERS, LIST_FEDERATION_REGISTRATIONS, LIST_FEDERATION_RESULTS, LIST_FEDERATION_PROPOSALS, LIST_FEDERATION_SETS, LIST_SETTINGS, EDIT_SETTINGS, diff --git a/src/com/gitblit/GitBlitException.java b/src/com/gitblit/GitBlitException.java index 360f9f0..7ab0f99 100644 --- a/src/com/gitblit/GitBlitException.java +++ b/src/com/gitblit/GitBlitException.java @@ -31,6 +31,10 @@ super(message); } + public GitBlitException(Throwable cause) { + super(cause); + } + /** * Exception to indicate that the client should prompt for credentials * because the requested action requires authentication. diff --git a/src/com/gitblit/RpcFilter.java b/src/com/gitblit/RpcFilter.java index 551ca3c..e768a51 100644 --- a/src/com/gitblit/RpcFilter.java +++ b/src/com/gitblit/RpcFilter.java @@ -64,7 +64,7 @@ return; } - boolean adminRequest = requestType.exceeds(RpcRequest.LIST_REPOSITORIES); + boolean adminRequest = requestType.exceeds(RpcRequest.LIST_BRANCHES); // conditionally reject all rpc requests if (!GitBlit.getBoolean(Keys.web.enableRpcServlet, true)) { diff --git a/src/com/gitblit/RpcServlet.java b/src/com/gitblit/RpcServlet.java index 53628a0..b068a39 100644 --- a/src/com/gitblit/RpcServlet.java +++ b/src/com/gitblit/RpcServlet.java @@ -27,11 +27,15 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.eclipse.jgit.lib.Repository; + import com.gitblit.Constants.RpcRequest; +import com.gitblit.models.RefModel; import com.gitblit.models.RepositoryModel; import com.gitblit.models.ServerSettings; import com.gitblit.models.UserModel; import com.gitblit.utils.HttpUtils; +import com.gitblit.utils.JGitUtils; import com.gitblit.utils.RpcUtils; /** @@ -86,6 +90,29 @@ repositories.put(url, model); } result = repositories; + } else if (RpcRequest.LIST_BRANCHES.equals(reqType)) { + // list all branches in all repositories accessible to user + Map<String, List<String>> allBranches = new HashMap<String, List<String>>(); + List<RepositoryModel> models = GitBlit.self().getRepositoryModels(user); + for (RepositoryModel model : models) { + if (!model.hasCommits) { + // skip empty repository + continue; + } + // get branches + Repository repository = GitBlit.self().getRepository(model.name); + List<RefModel> refs = JGitUtils.getLocalBranches(repository, false, -1); + refs.addAll(JGitUtils.getRemoteBranches(repository, false, -1)); + if (refs.size() > 0) { + List<String> branches = new ArrayList<String>(); + for (RefModel ref : refs) { + branches.add(ref.getName()); + } + allBranches.put(model.name, branches); + } + repository.close(); + } + result = allBranches; } else if (RpcRequest.LIST_USERS.equals(reqType)) { // list users List<String> names = GitBlit.self().getAllUsernames(); diff --git a/src/com/gitblit/utils/RpcUtils.java b/src/com/gitblit/utils/RpcUtils.java index e584151..faa910b 100644 --- a/src/com/gitblit/utils/RpcUtils.java +++ b/src/com/gitblit/utils/RpcUtils.java @@ -62,6 +62,9 @@ private static final Type SETS_TYPE = new TypeToken<Collection<FederationSet>>() { }.getType(); + private static final Type BRANCHES_TYPE = new TypeToken<Map<String, Collection<String>>>() { + }.getType(); + /** * * @param remoteURL @@ -386,6 +389,24 @@ } /** + * Retrieves a map of all branches in the Gitblit server keyed by + * repository. + * + * @param serverUrl + * @param account + * @param password + * @return + * @throws IOException + */ + public static Map<String, Collection<String>> getAllBranches(String serverUrl, + String account, char[] password) throws IOException { + String url = asLink(serverUrl, RpcRequest.LIST_BRANCHES); + Map<String, Collection<String>> allReferences = JsonUtils.retrieveJson(url, + BRANCHES_TYPE, account, password); + return allReferences; + } + + /** * Do the specified administrative action on the Gitblit server. * * @param request diff --git a/tests/com/gitblit/tests/RpcTests.java b/tests/com/gitblit/tests/RpcTests.java index 2860f32..637d488 100644 --- a/tests/com/gitblit/tests/RpcTests.java +++ b/tests/com/gitblit/tests/RpcTests.java @@ -16,6 +16,7 @@ package com.gitblit.tests; import java.io.IOException; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -220,25 +221,32 @@ public void testUpdateSettings() throws Exception { Map<String, String> updated = new HashMap<String, String>(); - + // grab current setting ServerSettings settings = RpcUtils.getSettings(url, account, password.toCharArray()); boolean showSizes = settings.get(Keys.web.showRepositorySizes).getBoolean(true); showSizes = !showSizes; - + // update setting updated.put(Keys.web.showRepositorySizes, String.valueOf(showSizes)); boolean success = RpcUtils.updateSettings(updated, "http://localhost:8080/gb", account, password.toCharArray()); assertTrue("Failed to update server settings", success); - + // confirm setting change settings = RpcUtils.getSettings(url, account, password.toCharArray()); boolean newValue = settings.get(Keys.web.showRepositorySizes).getBoolean(false); assertEquals(newValue, showSizes); - + // restore setting newValue = !newValue; updated.put(Keys.web.showRepositorySizes, String.valueOf(newValue)); } + + public void testBranches() throws Exception { + Map<String, Collection<String>> branches = RpcUtils.getAllBranches(url, account, + password.toCharArray()); + assertTrue(branches != null); + assertTrue(branches.size() > 0); + } } -- Gitblit v1.9.1