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,6 +766,11 @@ # SINCE 0.5.0 web.allowCookieAuthentication = true # Allow deletion of non-empty repositories. This is enforced for all delete vectors. # # SINCE 1.6.0 web.allowDeletingNonEmptyRepositories = true # Config file for storing project metadata # # SINCE 1.2.0 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" /> <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" /> <input class="btn" type="submit" value="Cancel" wicket:message="value:gb.cancel" wicket:id="cancel" /> <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,38 +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() { if (app().repositories().deleteRepositoryModel(entry)) { // redirect to the owning page if (entry.isPersonalRepository()) { setResponsePage(getPage().getClass(), WicketUtils.newUsernameParameter(entry.projectPath.substring(1))); } else { setResponsePage(getPage().getClass(), WicketUtils.newProjectParameter(entry.projectPath)); } } else { error(MessageFormat.format(getString("gb.repositoryDeleteFailed"), entry)); } } }; 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,37 +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() { if (app().repositories().deleteRepositoryModel(entry)) { if (dp instanceof SortableRepositoriesProvider) { info(MessageFormat.format(getString("gb.repositoryDeleted"), entry)); ((SortableRepositoriesProvider) dp).remove(entry); } else { setResponsePage(getPage().getClass(), getPage().getPageParameters()); } } else { error(MessageFormat.format(getString("gb.repositoryDeleteFailed"), entry)); } } }; 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",