From 3ad13e644f00b01010002f6d9d98343d4f2a4ea3 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Thu, 10 Apr 2014 19:00:05 -0400
Subject: [PATCH] Implement rename user/team and set field user/team commands

---
 src/main/java/com/gitblit/transport/ssh/gitblit/TeamsDispatcher.java |  144 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 141 insertions(+), 3 deletions(-)

diff --git a/src/main/java/com/gitblit/transport/ssh/gitblit/TeamsDispatcher.java b/src/main/java/com/gitblit/transport/ssh/gitblit/TeamsDispatcher.java
index 491cf6a..710ec4e 100644
--- a/src/main/java/com/gitblit/transport/ssh/gitblit/TeamsDispatcher.java
+++ b/src/main/java/com/gitblit/transport/ssh/gitblit/TeamsDispatcher.java
@@ -15,12 +15,14 @@
  */
 package com.gitblit.transport.ssh.gitblit;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.kohsuke.args4j.Argument;
 import org.kohsuke.args4j.Option;
 
 import com.gitblit.Constants.AccessPermission;
+import com.gitblit.GitBlitException;
 import com.gitblit.manager.IGitblit;
 import com.gitblit.models.RegistrantAccessPermission;
 import com.gitblit.models.RepositoryModel;
@@ -45,11 +47,13 @@
 	protected void setup(UserModel user) {
 		// primary team commands
 		register(user, NewTeam.class);
+		register(user, RenameTeam.class);
 		register(user, RemoveTeam.class);
 		register(user, ShowTeam.class);
 		register(user, ListTeams.class);
 
 		// team-specific commands
+		register(user, SetField.class);
 		register(user, Permissions.class);
 		register(user, Members.class);
 	}
@@ -94,11 +98,134 @@
 			team.canCreate = canCreate;
 
 			IGitblit gitblit = getContext().getGitblit();
-			if (gitblit.updateTeamModel(teamname, team)) {
+			try {
+				gitblit.addTeam(team);
 				stdout.println(String.format("%s created.", teamname));
-			} else {
-				throw new UnloggedFailure(1, String.format("Failed to create %s!", teamname));
+			} catch (GitBlitException e) {
+				String msg = String.format("Failed to create %s!", teamname);
+				log.error(msg, e);
+				throw new UnloggedFailure(1, msg);
 			}
+		}
+	}
+
+	@CommandMetaData(name = "rename", aliases = { "mv" }, description = "Rename a team")
+	@UsageExample(syntax = "${cmd} contributors friends", description = "Rename the contributors team to the friends team")
+	public static class RenameTeam extends TeamCommand {
+		@Argument(index = 1, required = true, metaVar = "NEWNAME", usage = "the new team name")
+		protected String newTeamName;
+
+				@Override
+		public void run() throws UnloggedFailure {
+			TeamModel team = getTeam(true);
+			IGitblit gitblit = getContext().getGitblit();
+			if (null != gitblit.getTeamModel(newTeamName)) {
+				throw new UnloggedFailure(1, String.format("Team %s already exists!", newTeamName));
+			}
+
+			// set the new team name
+			team.name = newTeamName;
+
+			try {
+				gitblit.reviseTeam(teamname, team);
+				stdout.println(String.format("Renamed team %s to %s.", teamname, newTeamName));
+			} catch (GitBlitException e) {
+				String msg = String.format("Failed to rename team from %s to %s", teamname, newTeamName);
+				log.error(msg, e);
+				throw new UnloggedFailure(1, msg);
+			}
+		}
+	}
+
+	@CommandMetaData(name = "set", description = "Set the specified field of a team")
+	@UsageExample(syntax = "${cmd} contributors canFork true", description = "Allow the contributors team to fork repositories")
+	public static class SetField extends TeamCommand {
+
+		@Argument(index = 1, required = true, metaVar = "FIELD", usage = "the field to update")
+		protected String fieldName;
+
+		@Argument(index = 2, required = true, metaVar = "VALUE", usage = "the new value")
+		protected List<String> fieldValues = new ArrayList<String>();
+
+		protected enum Field {
+			mailingList, canAdmin, canFork, canCreate;
+
+			static Field fromString(String name) {
+				for (Field field : values()) {
+					if (field.name().equalsIgnoreCase(name)) {
+						return field;
+					}
+				}
+				return null;
+			}
+		}
+
+		@Override
+		protected String getUsageText() {
+			String fields = Joiner.on(", ").join(Field.values());
+			StringBuilder sb = new StringBuilder();
+			sb.append("Valid fields are:\n    ").append(fields);
+			return sb.toString();
+		}
+
+		@Override
+		public void run() throws UnloggedFailure {
+			TeamModel team = getTeam(true);
+
+			Field field = Field.fromString(fieldName);
+			if (field == null) {
+				throw new UnloggedFailure(1, String.format("Unknown field %s", fieldName));
+			}
+
+			String value = Joiner.on(" ").join(fieldValues);
+			IGitblit gitblit = getContext().getGitblit();
+
+			switch(field) {
+			case mailingList:
+				team.mailingLists.clear();
+				team.mailingLists.addAll(fieldValues);
+				break;
+			case canAdmin:
+				team.canAdmin = toBool(value);
+				break;
+			case canFork:
+				team.canFork = toBool(value);
+				break;
+			case canCreate:
+				team.canCreate = toBool(value);
+				break;
+			default:
+				throw new UnloggedFailure(1,  String.format("Field %s was not properly handled by the set command.", fieldName));
+			}
+
+			try {
+				gitblit.reviseTeam(teamname, team);
+				stdout.println(String.format("Set %s.%s = %s", teamname, fieldName, value));
+			} catch (GitBlitException e) {
+				String msg = String.format("Failed to set %s.%s = %s", teamname, fieldName, value);
+				log.error(msg, e);
+				throw new UnloggedFailure(1, msg);
+			}
+		}
+
+		protected boolean toBool(String value) throws UnloggedFailure {
+			String v = value.toLowerCase();
+			if (v.equals("t")
+					|| v.equals("true")
+					|| v.equals("yes")
+					|| v.equals("on")
+					|| v.equals("y")
+					|| v.equals("1")) {
+				return true;
+			} else if (v.equals("f")
+					|| v.equals("false")
+					|| v.equals("no")
+					|| v.equals("off")
+					|| v.equals("n")
+					|| v.equals("0")) {
+				return false;
+			}
+			throw new UnloggedFailure(1,  String.format("Invalid boolean value %s", value));
 		}
 	}
 
@@ -182,6 +309,12 @@
 			IGitblit gitblit = getContext().getGitblit();
 			TeamModel team = getTeam(true);
 
+			boolean canEditMemberships = gitblit.supportsTeamMembershipChanges(team);
+			if (!canEditMemberships) {
+				String msg = String.format("Team %s (%s) does not permit membership changes!", team.name, team.accountType);
+				throw new UnloggedFailure(1, msg);
+			}
+
 			boolean modified = false;
 			if (!ArrayUtils.isEmpty(removals)) {
 				if (removals.contains("ALL")) {
@@ -201,6 +334,11 @@
 					if (u == null) {
 						throw new UnloggedFailure(1,  String.format("Unknown user %s", username));
 					}
+					boolean canEditTeams = gitblit.supportsTeamMembershipChanges(u);
+					if (!canEditTeams) {
+						String msg = String.format("User %s (%s) does not allow team membership changes ", u.username, u.accountType);
+						throw new UnloggedFailure(1, msg);
+					}
 					team.addUser(username);
 				}
 				modified = true;

--
Gitblit v1.9.1