Add clone transport user preference
diff --git a/releases.moxie b/releases.moxie
index fc139b7..c1e11d9 100644
--- a/releases.moxie
+++ b/releases.moxie
@@ -43,6 +43,7 @@
     - Simplified repository creation, offer simple README generation, and insertion of a pre-defined .gitignore file (ticket-76)
     - Added an extension point for monitoring onStartup and onShutdown (ticket-79)
     - Tag server-side merges when incremental push tags are enabled (issue-432, ticket-85)
+    - Add a user preference for the clone transport (ticket-90)
     - Add setting to control default thread pool size for miscellaneous background tasks (ticket-92)
     dependencyChanges:
     - Update to javax.mail 1.5.1 (issue-417, ticket-58)
diff --git a/src/main/java/com/gitblit/ConfigUserService.java b/src/main/java/com/gitblit/ConfigUserService.java
index 9759eff..0c5b2a5 100644
--- a/src/main/java/com/gitblit/ConfigUserService.java
+++ b/src/main/java/com/gitblit/ConfigUserService.java
@@ -36,6 +36,7 @@
 

 import com.gitblit.Constants.AccessPermission;

 import com.gitblit.Constants.AccountType;

+import com.gitblit.Constants.Transport;

 import com.gitblit.manager.IRuntimeManager;

 import com.gitblit.models.TeamModel;

 import com.gitblit.models.UserModel;

@@ -98,6 +99,8 @@
 

 	private static final String EMAILONMYTICKETCHANGES = "emailMeOnMyTicketChanges";

 

+	private static final String TRANSPORT = "transport";

+

 	private static final String ACCOUNTTYPE = "accountType";

 

 	private static final String DISABLED = "disabled";

@@ -713,7 +716,12 @@
 					String val = model.getPreferences().getLocale().getLanguage() + "_" + model.getPreferences().getLocale().getCountry();

 					config.setString(USER, model.username, LOCALE, val);

 				}

+

 				config.setBoolean(USER, model.username, EMAILONMYTICKETCHANGES, model.getPreferences().isEmailMeOnMyTicketChanges());

+

+				if (model.getPreferences().getTransport() != null) {

+					config.setString(USER, model.username, TRANSPORT, model.getPreferences().getTransport().name());

+				}

 			}

 

 			// user roles

@@ -891,6 +899,7 @@
 					// preferences

 					user.getPreferences().setLocale(config.getString(USER, username, LOCALE));

 					user.getPreferences().setEmailMeOnMyTicketChanges(config.getBoolean(USER, username, EMAILONMYTICKETCHANGES, true));

+					user.getPreferences().setTransport(Transport.fromString(config.getString(USER, username, TRANSPORT)));

 

 					// user roles

 					Set<String> roles = new HashSet<String>(Arrays.asList(config.getStringList(

diff --git a/src/main/java/com/gitblit/GitBlit.java b/src/main/java/com/gitblit/GitBlit.java
index 8179385..f9d9be9 100644
--- a/src/main/java/com/gitblit/GitBlit.java
+++ b/src/main/java/com/gitblit/GitBlit.java
@@ -20,6 +20,7 @@
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
@@ -264,6 +265,24 @@
 			}
 		});
 
+		// consider the user's transport preference
+		RepositoryUrl preferredUrl = null;
+		Transport preferredTransport = user.getPreferences().getTransport();
+		if (preferredTransport != null) {
+			Iterator<RepositoryUrl> itr = list.iterator();
+			while (itr.hasNext()) {
+				RepositoryUrl url = itr.next();
+				if (url.transport.equals(preferredTransport)) {
+					itr.remove();
+					preferredUrl = url;
+					break;
+				}
+			}
+		}
+		if (preferredUrl != null) {
+			list.add(0, preferredUrl);
+		}
+
 		return list;
 	}
 
diff --git a/src/main/java/com/gitblit/models/UserPreferences.java b/src/main/java/com/gitblit/models/UserPreferences.java
index c95b0da..90c034f 100644
--- a/src/main/java/com/gitblit/models/UserPreferences.java
+++ b/src/main/java/com/gitblit/models/UserPreferences.java
@@ -23,6 +23,7 @@
 import java.util.Map;
 import java.util.TreeMap;
 
+import com.gitblit.Constants.Transport;
 import com.gitblit.utils.StringUtils;
 
 /**
@@ -41,6 +42,8 @@
 
 	private Boolean emailMeOnMyTicketChanges;
 
+	private Transport transport;
+
 	private final Map<String, UserRepositoryPreferences> repositoryPreferences = new TreeMap<String, UserRepositoryPreferences>();
 
 	public UserPreferences(String username) {
@@ -113,4 +116,12 @@
 	public void setEmailMeOnMyTicketChanges(boolean value) {
 		this.emailMeOnMyTicketChanges = value;
 	}
+
+	public Transport getTransport() {
+		return transport;
+	}
+
+	public void setTransport(Transport transport) {
+		this.transport = transport;
+	}
 }
diff --git a/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties b/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties
index c80d45c..eb92e2d 100644
--- a/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties
+++ b/src/main/java/com/gitblit/wicket/GitBlitWebApp.properties
@@ -739,4 +739,6 @@
 gb.comment = Comment
 gb.sshKeyCommentDescription = Enter an optional comment. If blank, the comment will be extracted from the key data.
 gb.permission = Permission
-gb.sshKeyPermissionDescription = Specify the access permission for the SSH key
\ No newline at end of file
+gb.sshKeyPermissionDescription = Specify the access permission for the SSH key
+gb.transportPreference = Transport Preference
+gb.transportPreferenceDescription = Set the transport that you prefer to use for cloning
\ No newline at end of file
diff --git a/src/main/java/com/gitblit/wicket/pages/UserPage.html b/src/main/java/com/gitblit/wicket/pages/UserPage.html
index 017fcb1..8dccfee 100644
--- a/src/main/java/com/gitblit/wicket/pages/UserPage.html
+++ b/src/main/java/com/gitblit/wicket/pages/UserPage.html
@@ -66,6 +66,7 @@
 			<div wicket:id="emailAddress"></div>

 			<div wicket:id="language"></div>

 			<div wicket:id="emailMeOnMyTicketChanges"></div>

+			<div wicket:id="transport"></div>

 			

 			<div class="form-actions"><input class="btn btn-appmenu" type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" /></div>

 		</form>	

diff --git a/src/main/java/com/gitblit/wicket/pages/UserPage.java b/src/main/java/com/gitblit/wicket/pages/UserPage.java
index 00a3627..306eea6 100644
--- a/src/main/java/com/gitblit/wicket/pages/UserPage.java
+++ b/src/main/java/com/gitblit/wicket/pages/UserPage.java
@@ -35,6 +35,7 @@
 import org.apache.wicket.model.IModel;

 import org.apache.wicket.model.Model;

 

+import com.gitblit.Constants.Transport;

 import com.gitblit.GitBlitException;

 import com.gitblit.Keys;

 import com.gitblit.models.Menu.ParameterMenuItem;

@@ -221,6 +222,7 @@
 		final IModel<String> emailAddress = Model.of(user.emailAddress == null ? "" : user.emailAddress);

 		final IModel<Language> language = Model.of(preferredLanguage);

 		final IModel<Boolean> emailMeOnMyTicketChanges = Model.of(user.getPreferences().isEmailMeOnMyTicketChanges());

+		final IModel<Transport> transport = Model.of(user.getPreferences().getTransport());

 

 		prefs.add(new TextOption("displayName",

 				getString("gb.displayName"),

@@ -243,6 +245,24 @@
 				getString("gb.emailMeOnMyTicketChangesDescription"),

 				emailMeOnMyTicketChanges).setVisible(app().notifier().isSendingMail()));

 

+		List<Transport> availableTransports = new ArrayList<>();

+		if (app().gitblit().isServingSSH()) {

+			availableTransports.add(Transport.SSH);

+		}

+		if (app().gitblit().isServingHTTP()) {

+			availableTransports.add(Transport.HTTPS);

+			availableTransports.add(Transport.HTTP);

+		}

+		if (app().gitblit().isServingGIT()) {

+			availableTransports.add(Transport.GIT);

+		}

+

+		prefs.add(new ChoiceOption<Transport>("transport",

+				getString("gb.transportPreference"),

+				getString("gb.transportPreferenceDescription"),

+				transport,

+				availableTransports));

+

 		prefs.add(new AjaxButton("save") {

 

 			private static final long serialVersionUID = 1L;

@@ -261,6 +281,7 @@
 				}

 

 				user.getPreferences().setEmailMeOnMyTicketChanges(emailMeOnMyTicketChanges.getObject());

+				user.getPreferences().setTransport(transport.getObject());

 

 				try {

 					app().gitblit().reviseUser(user.username, user);