James Moger
2011-10-28 c75304637f5535e634e57d4ed933c0fdb594d890
Added a list branches rpc
7 files modified
79 ■■■■■ changed files
docs/02_rpc.mkd 7 ●●●● patch | view | raw | blame | history
src/com/gitblit/Constants.java 2 ●●● patch | view | raw | blame | history
src/com/gitblit/GitBlitException.java 4 ●●●● patch | view | raw | blame | history
src/com/gitblit/RpcFilter.java 2 ●●● patch | view | raw | blame | history
src/com/gitblit/RpcServlet.java 27 ●●●●● patch | view | raw | blame | history
src/com/gitblit/utils/RpcUtils.java 21 ●●●●● patch | view | raw | blame | history
tests/com/gitblit/tests/RpcTests.java 16 ●●●● patch | view | raw | blame | history
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>
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,
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.
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)) {
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();
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
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);
    }
}