James Moger
2014-05-09 b4ed66fda03d83fd281ca9cbeae0a1c7785489e4
Move delete repository function into the edit page
11 files modified
186 ■■■■■ changed files
releases.moxie 5 ●●●● patch | view | raw | blame | history
src/main/distrib/data/gitblit.properties 2 ●●● patch | view | raw | blame | history
src/main/java/com/gitblit/manager/GitblitManager.java 5 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/manager/IRepositoryManager.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/manager/RepositoryManager.java 17 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.html 2 ●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java 34 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.html 9 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java 50 ●●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.html 4 ●●●● patch | view | raw | blame | history
src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.java 49 ●●●●● patch | view | raw | blame | history
releases.moxie
@@ -10,7 +10,8 @@
    text: ~
    security: ~
    fixes: ~
    changes: ~
    changes:
    - Move repository deletion functions to the edit repository page AND allow deletion to be disabled (pr-180, ticket-67)
    additions:
    - Add FORK_REPOSITORY RPC request type (issue-371, pr-161, ticket-65)
    - Add object type (ot) parameter for RSS queries to retrieve tag details (pr-165, ticket-66)
@@ -18,6 +19,8 @@
    contributors:
    - Manisha Gayathri
    - Gerard Smyth
    settings:
    - { name: 'web.allowDeletingNonEmptyRepositories', defaultValue: 'true' }
}
#
src/main/distrib/data/gitblit.properties
@@ -766,7 +766,7 @@
# SINCE 0.5.0
web.allowCookieAuthentication = true
# Allow deleting of non empty repositories through the user interface.
# Allow deletion of non-empty repositories. This is enforced for all delete vectors.
#
# SINCE 1.6.0
web.allowDeletingNonEmptyRepositories = true
src/main/java/com/gitblit/manager/GitblitManager.java
@@ -1015,6 +1015,11 @@
    }
    @Override
    public boolean canDelete(RepositoryModel model) {
        return repositoryManager.canDelete(model);
    }
    @Override
    public boolean deleteRepositoryModel(RepositoryModel model) {
        return repositoryManager.deleteRepositoryModel(model);
    }
src/main/java/com/gitblit/manager/IRepositoryManager.java
@@ -339,6 +339,15 @@
    void updateConfiguration(Repository r, RepositoryModel repository);
    /**
     * Returns true if the repository can be deleted.
     *
     * @param model
     * @return true if the repository can be deleted
     * @since 1.6.0
     */
    boolean canDelete(RepositoryModel model);
    /**
     * Deletes the repository from the file system and removes the repository
     * permission from all repository users.
     *
src/main/java/com/gitblit/manager/RepositoryManager.java
@@ -1533,6 +1533,17 @@
    }
    /**
     * Returns true if the repository can be deleted.
     *
     * @return true if the repository can be deleted
     */
    @Override
    public boolean canDelete(RepositoryModel repository) {
        return settings.getBoolean(Keys.web.allowDeletingNonEmptyRepositories, true)
                    || !repository.hasCommits;
    }
    /**
     * Deletes the repository from the file system and removes the repository
     * permission from all repository users.
     *
@@ -1553,6 +1564,12 @@
     */
    @Override
    public boolean deleteRepository(String repositoryName) {
        RepositoryModel repository = getRepositoryModel(repositoryName);
        if (!canDelete(repository)) {
            logger.warn("Attempt to delete {} rejected!", repositoryName);
            return false;
        }
        try {
            close(repositoryName);
            // clear the repository cache
src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.html
@@ -112,7 +112,7 @@
<div class="row">
<div class="span12">
    <div class="form-actions"><input class="btn btn-appmenu" type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" /> &nbsp; <input class="btn" type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" /></div>
    <div class="form-actions"><input class="btn btn-appmenu" type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" /> &nbsp; <input class="btn" type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" /> &nbsp; <input class="btn btn-danger" type="submit" value="Delete" wicket:message="value:gb.delete" wicket:id="delete" /></div>
</div>
</div>
src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java
@@ -42,6 +42,7 @@
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.html.form.RadioChoice;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.CompoundPropertyModel;
@@ -68,6 +69,7 @@
import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.StringChoiceRenderer;
import com.gitblit.wicket.WicketUtils;
import com.gitblit.wicket.panels.BasePanel.JavascriptEventConfirmation;
import com.gitblit.wicket.panels.BulletListPanel;
import com.gitblit.wicket.panels.RegistrantPermissionsPanel;
@@ -614,6 +616,38 @@
        cancel.setDefaultFormProcessing(false);
        form.add(cancel);
        // the user can delete if deletions are allowed AND the user is an admin or the personal owner
        // assigned ownership is not sufficient to allow deletion
        boolean canDelete = !isCreate && app().repositories().canDelete(repositoryModel)
                && (user.canAdmin() || user.isMyPersonalRepository(repositoryModel.name));
        Link<Void> delete = new Link<Void>("delete") {
            private static final long serialVersionUID = 1L;
            @Override
            public void onClick() {
                RepositoryModel latestModel = app().repositories().getRepositoryModel(repositoryModel.name);
                boolean canDelete = app().repositories().canDelete(latestModel);
                if (canDelete) {
                    if (app().repositories().deleteRepositoryModel(latestModel)) {
                        info(MessageFormat.format(getString("gb.repositoryDeleted"), latestModel));
                        setResponsePage(RepositoriesPage.class);
                    } else {
                        error(MessageFormat.format(getString("gb.repositoryDeleteFailed"), latestModel));
                    }
                } else {
                    error(MessageFormat.format(getString("gb.repositoryDeleteFailed"), latestModel));
                }
            }
        };
        if (canDelete) {
            delete.add(new JavascriptEventConfirmation("onclick", MessageFormat.format(
                getString("gb.deleteRepository"), repositoryModel)));
        }
        form.add(delete.setVisible(canDelete));
        add(form);
    }
src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.html
@@ -5,15 +5,6 @@
      lang="en"> 
<wicket:panel>
    <wicket:fragment wicket:id="repositoryAdminLinks">
        <span class="link">
            <a wicket:id="tree"><wicket:message key="gb.tree"></wicket:message></a>
            | <a wicket:id="log"><wicket:message key="gb.log"></wicket:message></a>
            | <a wicket:id="editRepository"><wicket:message key="gb.edit">[edit]</wicket:message></a>
            | <a wicket:id="deleteRepository"><wicket:message key="gb.delete">[delete]</wicket:message></a>
        </span>
    </wicket:fragment>
    <wicket:fragment wicket:id="repositoryOwnerLinks">
        <span class="link">
            <a wicket:id="tree"><wicket:message key="gb.tree"></wicket:message></a>
src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java
@@ -15,7 +15,6 @@
 */
package com.gitblit.wicket.panels;
import java.text.MessageFormat;
import java.util.Map;
import org.apache.wicket.Component;
@@ -24,7 +23,6 @@
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.ExternalLink;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.panel.Fragment;
import com.gitblit.Constants.AccessRestrictionType;
@@ -129,54 +127,10 @@
            user = UserModel.ANONYMOUS;
        }
        Fragment repositoryLinks;
        boolean showOwner = entry.isOwner(user.username);
        // owner of personal repository gets admin powers
        boolean showAdmin = isAdmin || entry.isUsersPersonalRepository(user.username);
        if (showAdmin || showOwner) {
            repositoryLinks = new Fragment("repositoryLinks", showAdmin ? "repositoryAdminLinks"
                    : "repositoryOwnerLinks", this);
        if (user.canAdmin(entry)) {
            repositoryLinks = new Fragment("repositoryLinks", "repositoryOwnerLinks", this);
            repositoryLinks.add(new BookmarkablePageLink<Void>("editRepository", EditRepositoryPage.class,
                    WicketUtils.newRepositoryParameter(entry.name)));
            if (showAdmin) {
                Link<Void> deleteLink = new Link<Void>("deleteRepository") {
                    private static final long serialVersionUID = 1L;
                    @Override
                    public void onClick() {
                        // refresh the model
                        RepositoryModel model = app().repositories().getRepositoryModel(entry.name);
                        if (isDeleteAllowed(model) &&
                                app().repositories().deleteRepositoryModel(model)) {
                            // redirect to the owning page
                            if (model.isPersonalRepository()) {
                                setResponsePage(getPage().getClass(), WicketUtils.newUsernameParameter(model.projectPath.substring(1)));
                            } else {
                                setResponsePage(getPage().getClass(), WicketUtils.newProjectParameter(model.projectPath));
                            }
                        } else {
                            error(MessageFormat.format(getString("gb.repositoryDeleteFailed"), model));
                        }
                    }
                    @Override
                    public boolean isEnabled() {
                        return isDeleteAllowed(entry);
                    }
                    private boolean isDeleteAllowed(
                            final RepositoryModel model) {
                        return app().settings().getBoolean(Keys.web.allowDeletingNonEmptyRepositories, true)
                                || !model.hasCommits;
                    }
                };
                if (deleteLink.isEnabled()) {
                    deleteLink.add(new JavascriptEventConfirmation("onclick", MessageFormat.format(
                            localizer.getString("gb.deleteRepository", parent), entry)));
                }
                repositoryLinks.add(deleteLink);
            }
        } else {
            repositoryLinks = new Fragment("repositoryLinks", "repositoryUserLinks", this);
        }
src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.html
@@ -42,10 +42,6 @@
        </div>    
    </wicket:fragment>
    <wicket:fragment wicket:id="repositoryAdminLinks">
        <span class="link"><a wicket:id="editRepository"><wicket:message key="gb.edit">[edit]</wicket:message></a> | <a wicket:id="deleteRepository"><wicket:message key="gb.delete">[delete]</wicket:message></a></span>
    </wicket:fragment>
    <wicket:fragment wicket:id="repositoryOwnerLinks">
        <span class="link"><a wicket:id="editRepository"><wicket:message key="gb.edit">[edit]</wicket:message></a></span>
    </wicket:fragment>
src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.java
@@ -15,7 +15,6 @@
 */
package com.gitblit.wicket.panels;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -320,53 +319,7 @@
                    WicketUtils.setHtmlTooltip(lastChangeLabel, getString("gb.author") + ": " + entry.lastChangeAuthor);
                }
                boolean showOwner = user != null && entry.isOwner(user.username);
                boolean myPersonalRepository = showOwner && entry.isUsersPersonalRepository(user.username);
                if (showAdmin || myPersonalRepository) {
                    Fragment repositoryLinks = new Fragment("repositoryLinks",
                            "repositoryAdminLinks", this);
                    repositoryLinks.add(new BookmarkablePageLink<Void>("editRepository",
                            EditRepositoryPage.class, WicketUtils
                                    .newRepositoryParameter(entry.name)));
                    Link<Void> deleteLink = new Link<Void>("deleteRepository") {
                        private static final long serialVersionUID = 1L;
                        @Override
                        public void onClick() {
                            // refresh the model
                            RepositoryModel model = app().repositories().getRepositoryModel(entry.name);
                            if (isDeleteAllowed(model) &&
                                    app().repositories().deleteRepositoryModel(model)) {
                                if (dp instanceof SortableRepositoriesProvider) {
                                    info(MessageFormat.format(getString("gb.repositoryDeleted"), model));
                                    ((SortableRepositoriesProvider) dp).remove(model);
                                } else {
                                    setResponsePage(getPage().getClass(), getPage().getPageParameters());
                                }
                            } else {
                                error(MessageFormat.format(getString("gb.repositoryDeleteFailed"), model));
                            }
                        }
                        @Override
                        public boolean isEnabled() {
                            return isDeleteAllowed(entry);
                        }
                        private boolean isDeleteAllowed(
                                final RepositoryModel model) {
                            return app().settings().getBoolean(Keys.web.allowDeletingNonEmptyRepositories, true)
                                    || !model.hasCommits;
                        }
                    };
                    if (deleteLink.isEnabled()) {
                        deleteLink.add(new JavascriptEventConfirmation("onclick", MessageFormat.format(
                                getString("gb.deleteRepository"), entry)));
                    }
                    repositoryLinks.add(deleteLink);
                    row.add(repositoryLinks);
                } else if (showOwner) {
                if (user != null && user.canAdmin(entry)) {
                    Fragment repositoryLinks = new Fragment("repositoryLinks",
                            "repositoryOwnerLinks", this);
                    repositoryLinks.add(new BookmarkablePageLink<Void>("editRepository",