- Simplified repository creation, offer simple README generation, and insertion of a pre-defined .gitignore file (ticket-76) | - 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) | - 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) | - 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) | - Add setting to control default thread pool size for miscellaneous background tasks (ticket-92) | ||||
dependencyChanges: | dependencyChanges: | ||||
- Update to javax.mail 1.5.1 (issue-417, ticket-58) | - Update to javax.mail 1.5.1 (issue-417, ticket-58) |
import com.gitblit.Constants.AccessPermission; | import com.gitblit.Constants.AccessPermission; | ||||
import com.gitblit.Constants.AccountType; | import com.gitblit.Constants.AccountType; | ||||
import com.gitblit.Constants.Transport; | |||||
import com.gitblit.manager.IRuntimeManager; | import com.gitblit.manager.IRuntimeManager; | ||||
import com.gitblit.models.TeamModel; | import com.gitblit.models.TeamModel; | ||||
import com.gitblit.models.UserModel; | import com.gitblit.models.UserModel; | ||||
private static final String EMAILONMYTICKETCHANGES = "emailMeOnMyTicketChanges"; | private static final String EMAILONMYTICKETCHANGES = "emailMeOnMyTicketChanges"; | ||||
private static final String TRANSPORT = "transport"; | |||||
private static final String ACCOUNTTYPE = "accountType"; | private static final String ACCOUNTTYPE = "accountType"; | ||||
private static final String DISABLED = "disabled"; | private static final String DISABLED = "disabled"; | ||||
String val = model.getPreferences().getLocale().getLanguage() + "_" + model.getPreferences().getLocale().getCountry(); | String val = model.getPreferences().getLocale().getLanguage() + "_" + model.getPreferences().getLocale().getCountry(); | ||||
config.setString(USER, model.username, LOCALE, val); | config.setString(USER, model.username, LOCALE, val); | ||||
} | } | ||||
config.setBoolean(USER, model.username, EMAILONMYTICKETCHANGES, model.getPreferences().isEmailMeOnMyTicketChanges()); | 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 | // user roles | ||||
// preferences | // preferences | ||||
user.getPreferences().setLocale(config.getString(USER, username, LOCALE)); | user.getPreferences().setLocale(config.getString(USER, username, LOCALE)); | ||||
user.getPreferences().setEmailMeOnMyTicketChanges(config.getBoolean(USER, username, EMAILONMYTICKETCHANGES, true)); | user.getPreferences().setEmailMeOnMyTicketChanges(config.getBoolean(USER, username, EMAILONMYTICKETCHANGES, true)); | ||||
user.getPreferences().setTransport(Transport.fromString(config.getString(USER, username, TRANSPORT))); | |||||
// user roles | // user roles | ||||
Set<String> roles = new HashSet<String>(Arrays.asList(config.getStringList( | Set<String> roles = new HashSet<String>(Arrays.asList(config.getStringList( |
import java.util.Collections; | import java.util.Collections; | ||||
import java.util.Comparator; | import java.util.Comparator; | ||||
import java.util.HashSet; | import java.util.HashSet; | ||||
import java.util.Iterator; | |||||
import java.util.List; | import java.util.List; | ||||
import java.util.Set; | import java.util.Set; | ||||
} | } | ||||
}); | }); | ||||
// 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; | return list; | ||||
} | } | ||||
import java.util.Map; | import java.util.Map; | ||||
import java.util.TreeMap; | import java.util.TreeMap; | ||||
import com.gitblit.Constants.Transport; | |||||
import com.gitblit.utils.StringUtils; | import com.gitblit.utils.StringUtils; | ||||
/** | /** | ||||
private Boolean emailMeOnMyTicketChanges; | private Boolean emailMeOnMyTicketChanges; | ||||
private Transport transport; | |||||
private final Map<String, UserRepositoryPreferences> repositoryPreferences = new TreeMap<String, UserRepositoryPreferences>(); | private final Map<String, UserRepositoryPreferences> repositoryPreferences = new TreeMap<String, UserRepositoryPreferences>(); | ||||
public UserPreferences(String username) { | public UserPreferences(String username) { | ||||
public void setEmailMeOnMyTicketChanges(boolean value) { | public void setEmailMeOnMyTicketChanges(boolean value) { | ||||
this.emailMeOnMyTicketChanges = value; | this.emailMeOnMyTicketChanges = value; | ||||
} | } | ||||
public Transport getTransport() { | |||||
return transport; | |||||
} | |||||
public void setTransport(Transport transport) { | |||||
this.transport = transport; | |||||
} | |||||
} | } |
gb.comment = Comment | gb.comment = Comment | ||||
gb.sshKeyCommentDescription = Enter an optional comment. If blank, the comment will be extracted from the key data. | gb.sshKeyCommentDescription = Enter an optional comment. If blank, the comment will be extracted from the key data. | ||||
gb.permission = Permission | gb.permission = Permission | ||||
gb.sshKeyPermissionDescription = Specify the access permission for the SSH key | |||||
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 |
<div wicket:id="emailAddress"></div> | <div wicket:id="emailAddress"></div> | ||||
<div wicket:id="language"></div> | <div wicket:id="language"></div> | ||||
<div wicket:id="emailMeOnMyTicketChanges"></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> | <div class="form-actions"><input class="btn btn-appmenu" type="submit" value="Save" wicket:message="value:gb.save" wicket:id="save" /></div> | ||||
</form> | </form> |
import org.apache.wicket.model.IModel; | import org.apache.wicket.model.IModel; | ||||
import org.apache.wicket.model.Model; | import org.apache.wicket.model.Model; | ||||
import com.gitblit.Constants.Transport; | |||||
import com.gitblit.GitBlitException; | import com.gitblit.GitBlitException; | ||||
import com.gitblit.Keys; | import com.gitblit.Keys; | ||||
import com.gitblit.models.Menu.ParameterMenuItem; | import com.gitblit.models.Menu.ParameterMenuItem; | ||||
final IModel<String> emailAddress = Model.of(user.emailAddress == null ? "" : user.emailAddress); | final IModel<String> emailAddress = Model.of(user.emailAddress == null ? "" : user.emailAddress); | ||||
final IModel<Language> language = Model.of(preferredLanguage); | final IModel<Language> language = Model.of(preferredLanguage); | ||||
final IModel<Boolean> emailMeOnMyTicketChanges = Model.of(user.getPreferences().isEmailMeOnMyTicketChanges()); | final IModel<Boolean> emailMeOnMyTicketChanges = Model.of(user.getPreferences().isEmailMeOnMyTicketChanges()); | ||||
final IModel<Transport> transport = Model.of(user.getPreferences().getTransport()); | |||||
prefs.add(new TextOption("displayName", | prefs.add(new TextOption("displayName", | ||||
getString("gb.displayName"), | getString("gb.displayName"), | ||||
getString("gb.emailMeOnMyTicketChangesDescription"), | getString("gb.emailMeOnMyTicketChangesDescription"), | ||||
emailMeOnMyTicketChanges).setVisible(app().notifier().isSendingMail())); | 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") { | prefs.add(new AjaxButton("save") { | ||||
private static final long serialVersionUID = 1L; | private static final long serialVersionUID = 1L; | ||||
} | } | ||||
user.getPreferences().setEmailMeOnMyTicketChanges(emailMeOnMyTicketChanges.getObject()); | user.getPreferences().setEmailMeOnMyTicketChanges(emailMeOnMyTicketChanges.getObject()); | ||||
user.getPreferences().setTransport(transport.getObject()); | |||||
try { | try { | ||||
app().gitblit().reviseUser(user.username, user); | app().gitblit().reviseUser(user.username, user); |