James Moger
2011-12-22 cb57ec6ca96a6da2f5ae697070f3e52d8f940578
Filtering repositories and activity pages via url parameters (issue-27)
8 files modified
177 ■■■■■ changed files
docs/04_releases.mkd 6 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/WicketUtils.java 8 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/ActivityPage.java 43 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/RepositoriesPage.java 24 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/ReviewProposalPage.java 2 ●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/RootPage.java 80 ●●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/SendProposalPage.java 2 ●●● patch | view | raw | blame | history
src/com/gitblit/wicket/panels/RepositoriesPanel.java 12 ●●●● patch | view | raw | blame | history
docs/04_releases.mkd
@@ -30,6 +30,12 @@
- added: optional flash-based 1-step *copy to clipboard* of the primary repository url
- added: javascript-based 3-step (click, ctrl+c, enter) *copy to clipboard* of the primary repository url  
   **New:** *web.allowFlashCopyToClipboard = true*  
- added: Name, regex, set, and team filtering of the repositories list and the activity page via url parameters (issue 27)
    Here are some url examples:
    localhost/gb?r=myrepo.git  *(specific repository)*
    localhost/gb?x=my  *(regex matching. encoding may be an issue. YMMV)*
    localhost/gb?set=animal,mineral  *(animal and mineral federation sets)*
    localhost/qb/activity?team=qa,qa2 *(qa and qa2 teams)*
- improved: empty repositories now link to a new *empty repository* page which gives some direction to the user for the next step in using Gitblit.  This page displays the primary push/clone url of the repository and gives sample syntax for the git command-line client. (issue 31)
- improved: unit testing framework has been migrated to JUnit4 syntax and the test suite has been redesigned to run all unit tests, including rpc, federation, and git push/clone tests
src/com/gitblit/wicket/WicketUtils.java
@@ -369,10 +369,18 @@
        return params.getInt("pg", 1);
    }
    public static String getRegEx(PageParameters params) {
        return params.getString("x", "");
    }
    public static String getSet(PageParameters params) {
        return params.getString("set", "");
    }
    public static String getTeam(PageParameters params) {
        return params.getString("team", "");
    }
    public static int getDaysBack(PageParameters params) {
        return params.getInt("db", 14);
    }
src/com/gitblit/wicket/pages/ActivityPage.java
@@ -17,7 +17,6 @@
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -29,14 +28,10 @@
import org.apache.wicket.behavior.HeaderContributor;
import org.apache.wicket.markup.html.basic.Label;
import com.gitblit.GitBlit;
import com.gitblit.models.Activity;
import com.gitblit.models.Metric;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.UserModel;
import com.gitblit.utils.ActivityUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.WicketUtils;
import com.gitblit.wicket.charting.GoogleChart;
import com.gitblit.wicket.charting.GoogleCharts;
@@ -54,7 +49,7 @@
public class ActivityPage extends RootPage {
    public ActivityPage(PageParameters params) {
        super();
        super(params);
        setupPage("", "");
        // parameters
@@ -94,42 +89,6 @@
            // add activity panel
            add(new ActivityPanel("activityPanel", recentActivity));
        }
    }
    private List<RepositoryModel> getRepositories(PageParameters params) {
        final UserModel user = GitBlitWebSession.get().getUser();
        String set = WicketUtils.getSet(params);
        String repositoryName = WicketUtils.getRepositoryName(params);
        List<RepositoryModel> models = null;
        if (!StringUtils.isEmpty(repositoryName)) {
            // named repository
            models = new ArrayList<RepositoryModel>();
            RepositoryModel model = GitBlit.self().getRepositoryModel(repositoryName);
            if (user.canAccessRepository(model)) {
                models.add(model);
            }
        }
        // get all user accessible repositories
        if (models == null) {
            models = GitBlit.self().getRepositoryModels(user);
        }
        // filter the repositories by the specified set
        if (!StringUtils.isEmpty(set)) {
            List<String> sets = StringUtils.getStringsFromValue(set, ",");
            List<RepositoryModel> setModels = new ArrayList<RepositoryModel>();
            for (RepositoryModel model : models) {
                for (String curr : sets) {
                    if (model.federationSets.contains(curr)) {
                        setModels.add(model);
                    }
                }
            }
            models = setModels;
        }
        return models;
    }
    /**
src/com/gitblit/wicket/pages/RepositoriesPage.java
@@ -20,13 +20,16 @@
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.MessageFormat;
import java.util.List;
import org.apache.wicket.Component;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.resource.ContextRelativeResource;
import com.gitblit.GitBlit;
import com.gitblit.Keys;
import com.gitblit.models.RepositoryModel;
import com.gitblit.utils.MarkdownUtils;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.GitBlitWebSession;
@@ -37,8 +40,16 @@
    public RepositoriesPage() {
        super();
        setupPage("", "");
        setup(null);
    }
    public RepositoriesPage(PageParameters params) {
        super(params);
        setup(params);
    }
    private void setup(PageParameters params) {
        setupPage("", "");
        // check to see if we should display a login message
        boolean authenticateView = GitBlit.getBoolean(Keys.web.authenticateViewPages, true);
        if (authenticateView && !GitBlitWebSession.get().isLoggedIn()) {
@@ -56,14 +67,17 @@
        Component repositoriesMessage = new Label("repositoriesMessage", message)
                .setEscapeModelStrings(false).setVisible(message.length() > 0);
        add(repositoriesMessage);
        RepositoriesPanel repositories = new RepositoriesPanel("repositoriesPanel", showAdmin,
                null, getAccessRestrictions());
        List<RepositoryModel> repositories = getRepositories(params);
        RepositoriesPanel repositoriesPanel = new RepositoriesPanel("repositoriesPanel", showAdmin,
                repositories, true, getAccessRestrictions());
        // push the panel down if we are hiding the admin controls and the
        // welcome message
        if (!showAdmin && !repositoriesMessage.isVisible()) {
            WicketUtils.setCssStyle(repositories, "padding-top:5px;");
            WicketUtils.setCssStyle(repositoriesPanel, "padding-top:5px;");
        }
        add(repositories);
        add(repositoriesPanel);
    }
    private String readMarkdown(String messageSource, String resource) {
src/com/gitblit/wicket/pages/ReviewProposalPage.java
@@ -92,7 +92,7 @@
        List<RepositoryModel> repositories = new ArrayList<RepositoryModel>(
                proposal.repositories.values());
        RepositoriesPanel repositoriesPanel = new RepositoriesPanel("repositoriesPanel", false,
                repositories, getAccessRestrictions());
                repositories, false, getAccessRestrictions());
        add(repositoriesPanel);
    }
src/com/gitblit/wicket/pages/RootPage.java
@@ -18,6 +18,7 @@
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.form.PasswordTextField;
@@ -30,6 +31,8 @@
import com.gitblit.Constants;
import com.gitblit.GitBlit;
import com.gitblit.Keys;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.TeamModel;
import com.gitblit.models.UserModel;
import com.gitblit.utils.StringUtils;
import com.gitblit.wicket.GitBlitWebSession;
@@ -163,4 +166,81 @@
            }
        }
    }
    protected List<RepositoryModel> getRepositories(PageParameters params) {
        final UserModel user = GitBlitWebSession.get().getUser();
        if (params == null) {
            return GitBlit.self().getRepositoryModels(user);
        }
        String repositoryName = WicketUtils.getRepositoryName(params);
        String set = WicketUtils.getSet(params);
        String regex = WicketUtils.getRegEx(params);
        String team = WicketUtils.getTeam(params);
        List<RepositoryModel> models = null;
        if (!StringUtils.isEmpty(repositoryName)) {
            // try named repository
            models = new ArrayList<RepositoryModel>();
            RepositoryModel model = GitBlit.self().getRepositoryModel(repositoryName);
            if (user.canAccessRepository(model)) {
                models.add(model);
            }
        }
        // get all user accessible repositories
        if (models == null) {
            models = GitBlit.self().getRepositoryModels(user);
        }
        if (!StringUtils.isEmpty(regex)) {
            // filter the repositories by the regex
            List<RepositoryModel> accessible = GitBlit.self().getRepositoryModels(user);
            List<RepositoryModel> matchingModels = new ArrayList<RepositoryModel>();
            Pattern pattern = Pattern.compile(regex);
            for (RepositoryModel aModel : accessible) {
                if (pattern.matcher(aModel.name).find()) {
                    matchingModels.add(aModel);
                }
            }
            models = matchingModels;
        } else if (!StringUtils.isEmpty(set)) {
            // filter the repositories by the specified sets
            List<String> sets = StringUtils.getStringsFromValue(set, ",");
            List<RepositoryModel> matchingModels = new ArrayList<RepositoryModel>();
            for (RepositoryModel model : models) {
                for (String curr : sets) {
                    if (model.federationSets.contains(curr)) {
                        matchingModels.add(model);
                    }
                }
            }
            models = matchingModels;
        } else if (!StringUtils.isEmpty(team)) {
            // filter the repositories by the specified teams
            List<String> teams = StringUtils.getStringsFromValue(team, ",");
            // need TeamModels first
            List<TeamModel> teamModels = new ArrayList<TeamModel>();
            for (String name : teams) {
                TeamModel model = GitBlit.self().getTeamModel(name);
                if (model != null) {
                    teamModels.add(model);
                }
            }
            // brute-force our way through finding the matching models
            List<RepositoryModel> matchingModels = new ArrayList<RepositoryModel>();
            for (RepositoryModel repositoryModel : models) {
                for (TeamModel teamModel : teamModels) {
                    if (teamModel.hasRepository(repositoryModel.name)) {
                        matchingModels.add(repositoryModel);
                    }
                }
            }
            models = matchingModels;
        }
        return models;
    }
}
src/com/gitblit/wicket/pages/SendProposalPage.java
@@ -149,7 +149,7 @@
        List<RepositoryModel> repositories = new ArrayList<RepositoryModel>(
                proposal.repositories.values());
        RepositoriesPanel repositoriesPanel = new RepositoriesPanel("repositoriesPanel", false,
                repositories, getAccessRestrictions());
                repositories, false, getAccessRestrictions());
        add(repositoriesPanel);
    }
}
src/com/gitblit/wicket/panels/RepositoriesPanel.java
@@ -62,22 +62,14 @@
    private static final long serialVersionUID = 1L;
    public RepositoriesPanel(String wicketId, final boolean showAdmin,
            List<RepositoryModel> models,
            List<RepositoryModel> models, boolean enableLinks,
            final Map<AccessRestrictionType, String> accessRestrictionTranslations) {
        super(wicketId);
        final boolean linksActive;
        final boolean linksActive = enableLinks;
        final boolean showSize = GitBlit.getBoolean(Keys.web.showRepositorySizes, true);
        final UserModel user = GitBlitWebSession.get().getUser();
        if (models == null) {
            linksActive = true;
            models = GitBlit.self().getRepositoryModels(user);
        } else {
            // disable links if the repositories are already provided
            // the repositories are most likely from a proposal
            linksActive = false;
        }
        final IDataProvider<RepositoryModel> dp;