James Moger
2012-12-05 8295dd6cab32df383a30e4bd78e4aff17cfa2187
Global and per-repository setting to throttle prolific repos in Activity page (issue-173)
9 files modified
84 ■■■■ changed files
distrib/gitblit.properties 8 ●●●●● patch | view | raw | blame | history
docs/04_releases.mkd 1 ●●●● patch | view | raw | blame | history
src/com/gitblit/GitBlit.java 14 ●●●●● patch | view | raw | blame | history
src/com/gitblit/client/EditRepositoryDialog.java 9 ●●●●● patch | view | raw | blame | history
src/com/gitblit/models/RepositoryModel.java 1 ●●●● patch | view | raw | blame | history
src/com/gitblit/utils/ActivityUtils.java 6 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/GitBlitWebApp.properties 5 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/EditRepositoryPage.html 15 ●●●● patch | view | raw | blame | history
src/com/gitblit/wicket/pages/EditRepositoryPage.java 25 ●●●●● patch | view | raw | blame | history
distrib/gitblit.properties
@@ -522,6 +522,14 @@
# SINCE 0.8.0
web.allowFlashCopyToClipboard = true
# Default maximum number of commits that a repository may contribute to the
# activity page, regardless of the selected duration.  This setting may be valuable
# for an extremely busy server.  This value may also be configed per-repository
# in Edit Repository. 0 disables this throttle.
#
# SINCE 1.2.0
web.maxActivityCommits = 0
# Default number of entries to include in RSS Syndication links
#
# SINCE 0.5.0
docs/04_releases.mkd
@@ -73,6 +73,7 @@
#### changes
- Added optional global and per-repository activity page commit contribution throttle to help tame *really* active repositories (issue 173)
- Added support for symlinks in tree page and commit page (issue 171)
- All access restricted servlets (e.g. DownloadZip, RSS, etc) will try to authenticate using X509 certificates, container principals, cookies, and BASIC headers, in that order.
- Added *groovy* and *scala* to *web.prettyPrintExtensions*
src/com/gitblit/GitBlit.java
@@ -1602,6 +1602,7 @@
            } catch (Exception e) {
                model.lastGC = new Date(0);
            }
            model.maxActivityCommits = getConfig(config, "maxActivityCommits", settings.getInteger(Keys.web.maxActivityCommits, 0));
            model.origin = config.getString("remote", "origin", "url");
            if (model.origin != null) {
                model.origin = model.origin.replace('\\', '/');
@@ -2068,10 +2069,21 @@
                repository.federationStrategy.name());
        config.setBoolean(Constants.CONFIG_GITBLIT, null, "isFederated", repository.isFederated);
        config.setString(Constants.CONFIG_GITBLIT, null, "gcThreshold", repository.gcThreshold);
        config.setInt(Constants.CONFIG_GITBLIT, null, "gcPeriod", repository.gcPeriod);
        if (repository.gcPeriod == settings.getInteger(Keys.git.defaultGarbageCollectionPeriod, 7)) {
            // use default from config
            config.unset(Constants.CONFIG_GITBLIT, null, "gcPeriod");
        } else {
            config.setInt(Constants.CONFIG_GITBLIT, null, "gcPeriod", repository.gcPeriod);
        }
        if (repository.lastGC != null) {
            config.setString(Constants.CONFIG_GITBLIT, null, "lastGC", new SimpleDateFormat(Constants.ISO8601).format(repository.lastGC));
        }
        if (repository.maxActivityCommits == settings.getInteger(Keys.web.maxActivityCommits, 0)) {
            // use default from config
            config.unset(Constants.CONFIG_GITBLIT, null, "maxActivityCommits");
        } else {
            config.setInt(Constants.CONFIG_GITBLIT, null, "maxActivityCommits", repository.maxActivityCommits);
        }
        updateList(config, "federationSets", repository.federationSets);
        updateList(config, "preReceiveScript", repository.preReceiveScripts);
src/com/gitblit/client/EditRepositoryDialog.java
@@ -124,6 +124,8 @@
    private JComboBox gcPeriod;
    
    private JTextField gcThreshold;
    private JComboBox maxActivityCommits;
    private RegistrantPermissionsPanel usersPalette;
@@ -225,6 +227,10 @@
        isFrozen = new JCheckBox(Translation.get("gb.isFrozenDescription"),
                anRepository.isFrozen);
        maxActivityCommits = new JComboBox(new Integer [] { 0, 25, 50, 75, 100, 150, 250, 500 });
        maxActivityCommits.setSelectedItem(anRepository.maxActivityCommits);
        mailingListsField = new JTextField(
                ArrayUtils.isEmpty(anRepository.mailingLists) ? ""
                        : StringUtils.flattenStrings(anRepository.mailingLists,
@@ -314,6 +320,8 @@
                        skipSizeCalculation));
        fieldsPanel.add(newFieldPanel(Translation.get("gb.skipSummaryMetrics"),
                skipSummaryMetrics));
        fieldsPanel.add(newFieldPanel(Translation.get("gb.maxActivityCommits"),
                maxActivityCommits));
        fieldsPanel.add(newFieldPanel(Translation.get("gb.mailingLists"),
                mailingListsField));
@@ -561,6 +569,7 @@
        repository.showReadme = showReadme.isSelected();
        repository.skipSizeCalculation = skipSizeCalculation.isSelected();
        repository.skipSummaryMetrics = skipSummaryMetrics.isSelected();
        repository.maxActivityCommits = (Integer) maxActivityCommits.getSelectedItem();
        
        repository.isFrozen = isFrozen.isSelected();
        repository.allowForks = allowForks.isSelected();
src/com/gitblit/models/RepositoryModel.java
@@ -78,6 +78,7 @@
    public boolean verifyCommitter;
    public String gcThreshold;
    public int gcPeriod;
    public int maxActivityCommits;
    
    public transient boolean isCollectingGarbage;
    public Date lastGC;
src/com/gitblit/utils/ActivityUtils.java
@@ -106,7 +106,11 @@
                    }
                    List<RevCommit> commits = JGitUtils.getRevLog(repository,
                            branch, thresholdDate);
                    for (RevCommit commit : commits) {
                    if (model.maxActivityCommits > 0 && commits.size() > model.maxActivityCommits) {
                        // trim commits to maximum count
                        commits = commits.subList(0,  model.maxActivityCommits);
                    }
                    for (RevCommit commit : commits) {
                        Date date = JGitUtils.getCommitDate(commit);
                        String dateStr = df.format(date);
                        if (!activity.containsKey(dateStr)) {
src/com/gitblit/wicket/GitBlitWebApp.properties
@@ -430,4 +430,7 @@
gb.clientCertificateBundleSent = Client certificate bundle for {0} sent
gb.enterKeystorePassword = Please enter the Gitblit keystore password
gb.warning = warning
gb.jceWarning = Your Java Runtime Environment does not have the \"JCE Unlimited Strength Jurisdiction Policy\" files.\nThis will limit the length of passwords you may use to encrypt your keystores to 7 characters.\nThese policy files are an optional download from Oracle.\n\nWould you like to continue and generate the certificate infrastructure anyway?\n\nAnswering No will direct your browser to Oracle's download page so that you may download the policy files.
gb.jceWarning = Your Java Runtime Environment does not have the \"JCE Unlimited Strength Jurisdiction Policy\" files.\nThis will limit the length of passwords you may use to encrypt your keystores to 7 characters.\nThese policy files are an optional download from Oracle.\n\nWould you like to continue and generate the certificate infrastructure anyway?\n\nAnswering No will direct your browser to Oracle's download page so that you may download the policy files.
gb.maxActivityCommits = max activity commits
gb.maxActivityCommitsDescription = maximum number of commits to contribute to the Activity page
gb.noMaximum = no maximum
src/com/gitblit/wicket/pages/EditRepositoryPage.html
@@ -39,8 +39,9 @@
                <tr><th><wicket:message key="gb.showReadme"></wicket:message></th><td class="edit"><label class="checkbox"><input type="checkbox" wicket:id="showReadme" tabindex="10" /> &nbsp;<span class="help-inline"><wicket:message key="gb.showReadmeDescription"></wicket:message></span></label></td></tr>
                <tr><th><wicket:message key="gb.skipSizeCalculation"></wicket:message></th><td class="edit"><label class="checkbox"><input type="checkbox" wicket:id="skipSizeCalculation" tabindex="11" /> &nbsp;<span class="help-inline"><wicket:message key="gb.skipSizeCalculationDescription"></wicket:message></span></label></td></tr>
                <tr><th><wicket:message key="gb.skipSummaryMetrics"></wicket:message></th><td class="edit"><label class="checkbox"><input type="checkbox" wicket:id="skipSummaryMetrics" tabindex="12" /> &nbsp;<span class="help-inline"><wicket:message key="gb.skipSummaryMetricsDescription"></wicket:message></span></label></td></tr>
                <tr><th><wicket:message key="gb.maxActivityCommits"></wicket:message></th><td class="edit"><select class="span2" wicket:id="maxActivityCommits" tabindex="13" /> &nbsp;<span class="help-inline"><wicket:message key="gb.maxActivityCommitsDescription"></wicket:message></span></td></tr>
                <tr><th colspan="2"><hr/></th></tr>
                <tr><th><wicket:message key="gb.mailingLists"></wicket:message></th><td class="edit"><input class="span8" type="text" wicket:id="mailingLists" size="40" tabindex="13" /></td></tr>
                <tr><th><wicket:message key="gb.mailingLists"></wicket:message></th><td class="edit"><input class="span8" type="text" wicket:id="mailingLists" size="40" tabindex="14" /></td></tr>
            </tbody>
        </table>
        </div>
@@ -49,15 +50,15 @@
        <div class="tab-pane" id="permissions">
            <table class="plain">
                <tbody class="settings">
                    <tr><th><wicket:message key="gb.owner"></wicket:message></th><td class="edit"><select class="span2" wicket:id="owner" tabindex="14" /> &nbsp;<span class="help-inline"><wicket:message key="gb.ownerDescription"></wicket:message></span></td></tr>
                    <tr><th><wicket:message key="gb.owner"></wicket:message></th><td class="edit"><select class="span2" wicket:id="owner" tabindex="15" /> &nbsp;<span class="help-inline"><wicket:message key="gb.ownerDescription"></wicket:message></span></td></tr>
                    <tr><th colspan="2"><hr/></th></tr>
                    <tr><th><wicket:message key="gb.accessRestriction"></wicket:message></th><td class="edit"><select class="span4" wicket:id="accessRestriction" tabindex="15" /></td></tr>
                    <tr><th><wicket:message key="gb.accessRestriction"></wicket:message></th><td class="edit"><select class="span4" wicket:id="accessRestriction" tabindex="16" /></td></tr>
                    <tr><th colspan="2"><hr/></th></tr>
                    <tr><th><wicket:message key="gb.authorizationControl"></wicket:message></th><td style="padding:2px;"><span class="authorizationControl" wicket:id="authorizationControl"></span></td></tr>
                    <tr><th colspan="2"><hr/></th></tr>
                    <tr><th><wicket:message key="gb.isFrozen"></wicket:message></th><td class="edit"><label class="checkbox"><input type="checkbox" wicket:id="isFrozen" tabindex="18" /> &nbsp;<span class="help-inline"><wicket:message key="gb.isFrozenDescription"></wicket:message></span></label></td></tr>
                    <tr><th><wicket:message key="gb.allowForks"></wicket:message></th><td class="edit"><label class="checkbox"><input type="checkbox" wicket:id="allowForks" tabindex="19" /> &nbsp;<span class="help-inline"><wicket:message key="gb.allowForksDescription"></wicket:message></span></label></td></tr>
                    <tr><th><wicket:message key="gb.verifyCommitter"></wicket:message></th><td class="edit"><label class="checkbox"><input type="checkbox" wicket:id="verifyCommitter" tabindex="20" /> &nbsp;<span class="help-inline"><wicket:message key="gb.verifyCommitterDescription"></wicket:message></span><br/><span class="help-inline" style="padding-left:10px;"><wicket:message key="gb.verifyCommitterNote"></wicket:message></span></label></td></tr>
                    <tr><th><wicket:message key="gb.isFrozen"></wicket:message></th><td class="edit"><label class="checkbox"><input type="checkbox" wicket:id="isFrozen" tabindex="17" /> &nbsp;<span class="help-inline"><wicket:message key="gb.isFrozenDescription"></wicket:message></span></label></td></tr>
                    <tr><th><wicket:message key="gb.allowForks"></wicket:message></th><td class="edit"><label class="checkbox"><input type="checkbox" wicket:id="allowForks" tabindex="18" /> &nbsp;<span class="help-inline"><wicket:message key="gb.allowForksDescription"></wicket:message></span></label></td></tr>
                    <tr><th><wicket:message key="gb.verifyCommitter"></wicket:message></th><td class="edit"><label class="checkbox"><input type="checkbox" wicket:id="verifyCommitter" tabindex="19" /> &nbsp;<span class="help-inline"><wicket:message key="gb.verifyCommitterDescription"></wicket:message></span><br/><span class="help-inline" style="padding-left:10px;"><wicket:message key="gb.verifyCommitterNote"></wicket:message></span></label></td></tr>
                    <tr><th colspan="2"><hr/></th></tr>
                    <tr><th><wicket:message key="gb.userPermissions"></wicket:message></th><td style="padding:2px;"><span wicket:id="users"></span></td></tr>
                    <tr><th colspan="2"><hr/></th></tr>
@@ -70,7 +71,7 @@
        <div class="tab-pane" id="federation">
            <table class="plain">
                <tbody class="settings">
                    <tr><th><wicket:message key="gb.federationStrategy"></wicket:message></th><td class="edit"><select class="span4" wicket:id="federationStrategy" tabindex="21" /></td></tr>
                    <tr><th><wicket:message key="gb.federationStrategy"></wicket:message></th><td class="edit"><select class="span4" wicket:id="federationStrategy" tabindex="20" /></td></tr>
                    <tr><th><wicket:message key="gb.federationSets"></wicket:message></th><td style="padding:2px;"><span wicket:id="federationSets"></span></td></tr>
                </tbody>
            </table>
src/com/gitblit/wicket/pages/EditRepositoryPage.java
@@ -414,6 +414,9 @@
        form.add(new CheckBox("showReadme"));
        form.add(new CheckBox("skipSizeCalculation"));
        form.add(new CheckBox("skipSummaryMetrics"));
        List<Integer> maxActivityCommits  = Arrays.asList(0, 25, 50, 75, 100, 150, 200, 250, 500 );
        form.add(new DropDownChoice<Integer>("maxActivityCommits", maxActivityCommits, new MaxActivityCommitsRenderer()));
        mailingLists = new Model<String>(ArrayUtils.isEmpty(repositoryModel.mailingLists) ? ""
                : StringUtils.flattenStrings(repositoryModel.mailingLists, " "));
        form.add(new TextField<String>("mailingLists", mailingLists));
@@ -654,4 +657,26 @@
        }
    }
    
    private class MaxActivityCommitsRenderer implements IChoiceRenderer<Integer> {
        private static final long serialVersionUID = 1L;
        public MaxActivityCommitsRenderer() {
        }
        @Override
        public String getDisplayValue(Integer value) {
            if (value == 0) {
                return getString("gb.noMaximum");
            } else {
                return value + " " + getString("gb.commits");
            }
        }
        @Override
        public String getIdValue(Integer value, int index) {
            return Integer.toString(index);
        }
    }
}