From fb9813874c811ae06604c30d875e9dce57df9874 Mon Sep 17 00:00:00 2001
From: SHaselbauer <sarah.haselbauer@akquinet.de>
Date: Mon, 21 Jan 2013 16:28:11 -0500
Subject: [PATCH] Merge multiple owners feature (pull request #63, #66)

---
 src/com/gitblit/wicket/pages/EditRepositoryPage.java |   26 ++++++++++++++++++++------
 1 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/src/com/gitblit/wicket/pages/EditRepositoryPage.java b/src/com/gitblit/wicket/pages/EditRepositoryPage.java
index a071b69..9a81bde 100644
--- a/src/com/gitblit/wicket/pages/EditRepositoryPage.java
+++ b/src/com/gitblit/wicket/pages/EditRepositoryPage.java
@@ -61,6 +61,7 @@
 import com.gitblit.models.RepositoryModel;
 import com.gitblit.models.UserModel;
 import com.gitblit.utils.ArrayUtils;
+import com.gitblit.utils.MultiConfigUtil;
 import com.gitblit.utils.StringUtils;
 import com.gitblit.wicket.GitBlitWebSession;
 import com.gitblit.wicket.StringChoiceRenderer;
@@ -70,6 +71,8 @@
 
 public class EditRepositoryPage extends RootSubPage {
 
+	private MultiConfigUtil multiConfigUtil = new MultiConfigUtil();
+	
 	private final boolean isCreate;
 
 	private boolean isAdmin;
@@ -94,7 +97,7 @@
 			// personal create permissions, inject personal repository path
 			model.name = user.getPersonalPath() + "/";
 			model.projectPath = user.getPersonalPath();
-			model.owner = user.username;
+			model.addRepoAdministrator(user.username);
 			// personal repositories are private by default
 			model.accessRestriction = AccessRestrictionType.VIEW;
 			model.authorizationControl = AuthorizationControl.NAMED;
@@ -164,6 +167,12 @@
 		final RegistrantPermissionsPanel teamsPalette = new RegistrantPermissionsPanel("teams", 
 				RegistrantType.TEAM, GitBlit.self().getAllTeamnames(), repositoryTeams, getAccessPermissions());
 
+		// repo administrators palette
+		List admins = multiConfigUtil.convertCollectionToList(repositoryModel.getRepoAdministrators());
+		List persons = GitBlit.self().getAllUsernames();
+		final Palette repoAdministratorsPalette = new Palette("repoAdministrators", new ListModel<String>(admins), new CollectionModel<String>(
+		      persons), new StringChoiceRenderer(), 10, true);
+		
 		// indexed local branches palette
 		List<String> allLocalBranches = new ArrayList<String>();
 		allLocalBranches.add(Constants.DEFAULT_BRANCH);
@@ -326,6 +335,12 @@
 					}
 					repositoryModel.indexedBranches = indexedBranches;
 
+					repositoryModel.removeAllRepoAdministrators();
+					Iterator<String> repoAdmins = repoAdministratorsPalette.getSelectedChoices();
+					while (repoAdmins.hasNext()) {
+						repositoryModel.addRepoAdministrator(repoAdmins.next());
+					}
+					
 					// pre-receive scripts
 					List<String> preReceiveScripts = new ArrayList<String>();
 					Iterator<String> pres = preReceivePalette.getSelectedChoices();
@@ -377,8 +392,7 @@
 		// field names reflective match RepositoryModel fields
 		form.add(new TextField<String>("name").setEnabled(allowEditName));
 		form.add(new TextField<String>("description"));
-		form.add(new DropDownChoice<String>("owner", GitBlit.self().getAllUsernames())
-				.setEnabled(GitBlitWebSession.get().canAdmin() && !repositoryModel.isPersonalRepository()));
+		form.add(repoAdministratorsPalette);
 		form.add(new CheckBox("allowForks").setEnabled(GitBlit.getBoolean(Keys.web.allowForking, true)));
 		DropDownChoice<AccessRestrictionType> accessRestriction = new DropDownChoice<AccessRestrictionType>("accessRestriction", Arrays
 				.asList(AccessRestrictionType.values()), new AccessRestrictionRenderer());
@@ -559,9 +573,9 @@
 						isAdmin = true;
 						return;
 					} else {
-						if (!model.owner.equalsIgnoreCase(user.username)) {
-							// User is not an Admin nor Owner
-							error(getString("gb.errorOnlyAdminOrOwnerMayEditRepository"), true);
+						if (!model.isRepoAdministrator(user.username)) {
+							// User is not an Admin nor RepoAdministrator
+							error(getString("gb.errorOnlyAdminOrRepoAdminMayEditRepository"), true);
 						}
 					}
 				}

--
Gitblit v1.9.1