From b4ed66fda03d83fd281ca9cbeae0a1c7785489e4 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Fri, 09 May 2014 09:55:19 -0400
Subject: [PATCH] Move delete repository function into the edit page

---
 src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.html      |    4 -
 src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.html |    9 --
 src/main/java/com/gitblit/manager/IRepositoryManager.java           |    9 ++
 src/main/java/com/gitblit/manager/GitblitManager.java               |    5 +
 src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.html      |    2 
 src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.java      |   49 ------------
 releases.moxie                                                      |    5 +
 src/main/distrib/data/gitblit.properties                            |    2 
 src/main/java/com/gitblit/manager/RepositoryManager.java            |   17 ++++
 src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java |   50 ------------
 src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java      |   34 ++++++++
 11 files changed, 74 insertions(+), 112 deletions(-)

diff --git a/releases.moxie b/releases.moxie
index 96a0ae9..a5cfed9 100644
--- a/releases.moxie
+++ b/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' }
 }
 
 #
diff --git a/src/main/distrib/data/gitblit.properties b/src/main/distrib/data/gitblit.properties
index 30e9789..ab5311c 100644
--- a/src/main/distrib/data/gitblit.properties
+++ b/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
diff --git a/src/main/java/com/gitblit/manager/GitblitManager.java b/src/main/java/com/gitblit/manager/GitblitManager.java
index 2782e72..16c71ba 100644
--- a/src/main/java/com/gitblit/manager/GitblitManager.java
+++ b/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);
 	}
diff --git a/src/main/java/com/gitblit/manager/IRepositoryManager.java b/src/main/java/com/gitblit/manager/IRepositoryManager.java
index 69177f1..f5cf03f 100644
--- a/src/main/java/com/gitblit/manager/IRepositoryManager.java
+++ b/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.
 	 *
diff --git a/src/main/java/com/gitblit/manager/RepositoryManager.java b/src/main/java/com/gitblit/manager/RepositoryManager.java
index 7351eb9..c141f08 100644
--- a/src/main/java/com/gitblit/manager/RepositoryManager.java
+++ b/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
diff --git a/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.html b/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.html
index f82ac3d..b7a1976 100644
--- a/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.html
+++ b/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>
 
diff --git a/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java
index cd0da5f..412c0ec 100644
--- a/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java
+++ b/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);
 	}
 
diff --git a/src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.html b/src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.html
index d5a87d3..33345a0 100644
--- a/src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.html
+++ b/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>
diff --git a/src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java b/src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java
index 2c84ac0..8630d20 100644
--- a/src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java
+++ b/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);
 		}
diff --git a/src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.html b/src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.html
index 0cf3ef2..c3ec2e2 100644
--- a/src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.html
+++ b/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>
diff --git a/src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.java b/src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.java
index 40cd77e..54e2aab 100644
--- a/src/main/java/com/gitblit/wicket/panels/RepositoriesPanel.java
+++ b/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",

--
Gitblit v1.9.1