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&lt;String, RepositoryModel&gt;</td></tr>
+<tr><td>LIST_BRANCHES</td><td>-</td><td>-</td><td>-</td><td>Map&lt;String, List&lt;String&gt;&gt;</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