diff options
Diffstat (limited to 'src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java')
-rw-r--r-- | src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java | 404 |
1 files changed, 210 insertions, 194 deletions
diff --git a/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java b/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java index 412c0ecc..f891595c 100644 --- a/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java +++ b/src/main/java/com/gitblit/wicket/pages/EditRepositoryPage.java @@ -29,7 +29,6 @@ import java.util.Set; import org.apache.wicket.PageParameters;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
-import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.extensions.markup.html.form.palette.Palette;
import org.apache.wicket.markup.html.WebMarkupContainer;
@@ -40,7 +39,6 @@ import org.apache.wicket.markup.html.form.ChoiceRenderer; import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
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;
@@ -48,6 +46,7 @@ import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
+import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.util.CollectionModel;
import org.apache.wicket.model.util.ListModel;
import org.eclipse.jgit.lib.Repository;
@@ -69,14 +68,23 @@ import com.gitblit.utils.StringUtils; import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.StringChoiceRenderer;
import com.gitblit.wicket.WicketUtils;
+import com.gitblit.wicket.panels.AccessPolicyPanel;
import com.gitblit.wicket.panels.BasePanel.JavascriptEventConfirmation;
import com.gitblit.wicket.panels.BulletListPanel;
+import com.gitblit.wicket.panels.CheckboxOption;
+import com.gitblit.wicket.panels.ChoiceOption;
import com.gitblit.wicket.panels.RegistrantPermissionsPanel;
+import com.gitblit.wicket.panels.RepositoryNamePanel;
+import com.gitblit.wicket.panels.TextOption;
public class EditRepositoryPage extends RootSubPage {
private final boolean isCreate;
+ RepositoryNamePanel namePanel;
+
+ AccessPolicyPanel accessPolicyPanel;
+
private boolean isAdmin;
RepositoryModel repositoryModel;
@@ -196,7 +204,7 @@ public class EditRepositoryPage extends RootSubPage { }
}
final Palette<UserChoice> ownersPalette = new Palette<UserChoice>("owners", new ListModel<UserChoice>(owners), new CollectionModel<UserChoice>(
- persons), new ChoiceRenderer<UserChoice>(null, "userId"), 12, true);
+ persons), new ChoiceRenderer<UserChoice>(null, "userId"), 12, false);
// indexed local branches palette
List<String> allLocalBranches = new ArrayList<String>();
@@ -263,60 +271,9 @@ public class EditRepositoryPage extends RootSubPage { @Override
protected void onSubmit() {
try {
- // confirm a repository name was entered
- if (repositoryModel.name == null && StringUtils.isEmpty(repositoryModel.name)) {
- error(getString("gb.pleaseSetRepositoryName"));
- return;
- }
-
- // ensure name is trimmed
- repositoryModel.name = repositoryModel.name.trim();
-
- // automatically convert backslashes to forward slashes
- repositoryModel.name = repositoryModel.name.replace('\\', '/');
- // Automatically replace // with /
- repositoryModel.name = repositoryModel.name.replace("//", "/");
-
- // prohibit folder paths
- if (repositoryModel.name.startsWith("/")) {
- error(getString("gb.illegalLeadingSlash"));
- return;
- }
- if (repositoryModel.name.startsWith("../")) {
- error(getString("gb.illegalRelativeSlash"));
+ if (!namePanel.updateModel(repositoryModel)) {
return;
}
- if (repositoryModel.name.contains("/../")) {
- error(getString("gb.illegalRelativeSlash"));
- return;
- }
- if (repositoryModel.name.endsWith("/")) {
- repositoryModel.name = repositoryModel.name.substring(0, repositoryModel.name.length() - 1);
- }
-
- // confirm valid characters in repository name
- Character c = StringUtils.findInvalidCharacter(repositoryModel.name);
- if (c != null) {
- error(MessageFormat.format(getString("gb.illegalCharacterRepositoryName"),
- c));
- return;
- }
-
- if (user.canCreate() && !user.canAdmin() && allowEditName) {
- // ensure repository name begins with the user's path
- if (!repositoryModel.name.startsWith(user.getPersonalPath())) {
- error(MessageFormat.format(getString("gb.illegalPersonalRepositoryLocation"),
- user.getPersonalPath()));
- return;
- }
-
- if (repositoryModel.name.equals(user.getPersonalPath())) {
- // reset path prefix and show error
- repositoryModel.name = user.getPersonalPath() + "/";
- error(getString("gb.pleaseSetRepositoryName"));
- return;
- }
- }
// confirm access restriction selection
if (repositoryModel.accessRestriction == null) {
@@ -426,33 +383,15 @@ public class EditRepositoryPage extends RootSubPage { }
} catch (GitBlitException e) {
error(e.getMessage());
+ namePanel.resetModel(repositoryModel);
return;
}
setRedirect(false);
- if (isCreate) {
- setResponsePage(RepositoriesPage.class);
- } else {
- setResponsePage(SummaryPage.class, WicketUtils.newRepositoryParameter(repositoryModel.name));
- }
+ setResponsePage(SummaryPage.class, WicketUtils.newRepositoryParameter(repositoryModel.name));
}
};
- // do not let the browser pre-populate these fields
- form.add(new SimpleAttributeModifier("autocomplete", "off"));
-
- // field names reflective match RepositoryModel fields
- form.add(new TextField<String>("name").setEnabled(allowEditName));
- form.add(new TextField<String>("description"));
- form.add(ownersPalette);
- form.add(new CheckBox("allowForks").setEnabled(app().settings().getBoolean(Keys.web.allowForking, true)));
- DropDownChoice<AccessRestrictionType> accessRestriction = new DropDownChoice<AccessRestrictionType>("accessRestriction",
- AccessRestrictionType.choices(app().settings().getBoolean(Keys.git.allowAnonymousPushes, false)), new AccessRestrictionRenderer());
- form.add(accessRestriction);
- form.add(new CheckBox("isFrozen"));
- // TODO enable origin definition
- form.add(new TextField<String>("origin").setEnabled(false/* isCreate */));
-
- // allow relinking HEAD to a branch or tag other than master on edit repository
+ // Determine available refs & branches
List<String> availableRefs = new ArrayList<String>();
List<String> availableBranches = new ArrayList<String>();
if (!ArrayUtils.isEmpty(repositoryModel.availableRefs)) {
@@ -465,58 +404,79 @@ public class EditRepositoryPage extends RootSubPage { }
}
}
- form.add(new DropDownChoice<String>("HEAD", availableRefs).setEnabled(availableRefs.size() > 0));
- boolean gcEnabled = app().settings().getBoolean(Keys.git.enableGarbageCollection, false);
- int defaultGcPeriod = app().settings().getInteger(Keys.git.defaultGarbageCollectionPeriod, 7);
- if (repositoryModel.gcPeriod == 0) {
- repositoryModel.gcPeriod = defaultGcPeriod;
- }
- List<Integer> gcPeriods = Arrays.asList(1, 2, 3, 4, 5, 7, 10, 14 );
- form.add(new DropDownChoice<Integer>("gcPeriod", gcPeriods, new GCPeriodRenderer()).setEnabled(gcEnabled));
- form.add(new TextField<String>("gcThreshold").setEnabled(gcEnabled));
+ // do not let the browser pre-populate these fields
+ form.add(new SimpleAttributeModifier("autocomplete", "off"));
- // federation strategies - remove ORIGIN choice if this repository has
- // no origin.
- List<FederationStrategy> federationStrategies = new ArrayList<FederationStrategy>(
- Arrays.asList(FederationStrategy.values()));
- if (StringUtils.isEmpty(repositoryModel.origin)) {
- federationStrategies.remove(FederationStrategy.FEDERATE_ORIGIN);
- }
- form.add(new DropDownChoice<FederationStrategy>("federationStrategy", federationStrategies,
- new FederationTypeRenderer()));
- form.add(new CheckBox("acceptNewPatchsets"));
- form.add(new CheckBox("acceptNewTickets")); - form.add(new CheckBox("requireApproval"));
- form.add(new DropDownChoice<String>("mergeTo", availableBranches).setEnabled(availableBranches.size() > 0));
- form.add(new CheckBox("useIncrementalPushTags"));
- form.add(new CheckBox("showRemoteBranches"));
- form.add(new CheckBox("skipSizeCalculation"));
- form.add(new CheckBox("skipSummaryMetrics"));
- List<Integer> maxActivityCommits = Arrays.asList(-1, 0, 25, 50, 75, 100, 150, 200, 250, 500);
- form.add(new DropDownChoice<Integer>("maxActivityCommits", maxActivityCommits, new MaxActivityCommitsRenderer()));
- metricAuthorExclusions = new Model<String>(ArrayUtils.isEmpty(repositoryModel.metricAuthorExclusions) ? ""
- : StringUtils.flattenStrings(repositoryModel.metricAuthorExclusions, " "));
- form.add(new TextField<String>("metricAuthorExclusions", metricAuthorExclusions));
+ //
+ //
+ // GENERAL
+ //
+ namePanel = new RepositoryNamePanel("namePanel", repositoryModel);
+ namePanel.setEditable(allowEditName);
+ form.add(namePanel);
- mailingLists = new Model<String>(ArrayUtils.isEmpty(repositoryModel.mailingLists) ? ""
- : StringUtils.flattenStrings(repositoryModel.mailingLists, " "));
- form.add(new TextField<String>("mailingLists", mailingLists));
- form.add(indexedBranchesPalette);
+ // XXX AccessPolicyPanel is defined later.
- List<AuthorizationControl> acList = Arrays.asList(AuthorizationControl.values());
- final RadioChoice<AuthorizationControl> authorizationControl = new RadioChoice<Constants.AuthorizationControl>(
- "authorizationControl", acList, new AuthorizationControlRenderer());
- form.add(authorizationControl);
+ form.add(new ChoiceOption<String>("head",
+ getString("gb.headRef"),
+ getString("gb.headRefDescription"),
+ new PropertyModel<String>(repositoryModel, "HEAD"),
+ availableRefs));
- final CheckBox verifyCommitter = new CheckBox("verifyCommitter");
- verifyCommitter.setOutputMarkupId(true);
- form.add(verifyCommitter);
+ //
+ // PERMISSIONS
+ //
+ form.add(ownersPalette);
form.add(usersPalette);
form.add(teamsPalette);
- form.add(federationSetsPalette);
+
+ //
+ // TICKETS
+ //
+ form.add(new CheckboxOption("acceptNewPatchsets",
+ getString("gb.acceptNewPatchsets"),
+ getString("gb.acceptNewPatchsetsDescription"),
+ new PropertyModel<Boolean>(repositoryModel, "acceptNewPatchsets")));
+
+ form.add(new CheckboxOption("acceptNewTickets",
+ getString("gb.acceptNewTickets"),
+ getString("gb.acceptNewTicketsDescription"),
+ new PropertyModel<Boolean>(repositoryModel, "acceptNewPatchsets")));
+
+ form.add(new CheckboxOption("requireApproval",
+ getString("gb.requireApproval"),
+ getString("gb.requireApprovalDescription"),
+ new PropertyModel<Boolean>(repositoryModel, "requireApproval")));
+
+ form.add(new ChoiceOption<String>("mergeTo",
+ getString("gb.mergeTo"),
+ getString("gb.mergeToDescription"),
+ new PropertyModel<String>(repositoryModel, "mergeTo"),
+ availableBranches));
+
+ //
+ // RECEIVE
+ //
+ form.add(new CheckboxOption("isFrozen",
+ getString("gb.isFrozen"),
+ getString("gb.isFrozenDescription"),
+ new PropertyModel<Boolean>(repositoryModel, "isFrozen")));
+
+ form.add(new CheckboxOption("incrementalPushTags",
+ getString("gb.enableIncrementalPushTags"),
+ getString("gb.useIncrementalPushTagsDescription"),
+ new PropertyModel<Boolean>(repositoryModel, "useIncrementalPushTags")));
+
+ final CheckBox verifyCommitter = new CheckBox("checkbox", new PropertyModel<Boolean>(repositoryModel, "verifyCommitter"));
+ verifyCommitter.setOutputMarkupId(true);
+ form.add(new CheckboxOption("verifyCommitter",
+ getString("gb.verifyCommitter"),
+ getString("gb.verifyCommitterDescription") + "<br/>" + getString("gb.verifyCommitterNote"),
+ verifyCommitter).setIsHtmlDescription(true));
+
form.add(preReceivePalette);
form.add(new BulletListPanel("inheritedPreReceive", getString("gb.inherited"), app().repositories()
.getPreReceiveScriptsInherited(repositoryModel)));
@@ -528,17 +488,125 @@ public class EditRepositoryPage extends RootSubPage { customFieldsSection.add(customFieldsListView);
form.add(customFieldsSection.setVisible(!app().settings().getString(Keys.groovy.customFields, "").isEmpty()));
+ //
+ // FEDERATION
+ //
+ List<FederationStrategy> federationStrategies = new ArrayList<FederationStrategy>(
+ Arrays.asList(FederationStrategy.values()));
+ // federation strategies - remove ORIGIN choice if this repository has no origin.
+ if (StringUtils.isEmpty(repositoryModel.origin)) {
+ federationStrategies.remove(FederationStrategy.FEDERATE_ORIGIN);
+ }
+
+ form.add(new ChoiceOption<FederationStrategy>("federationStrategy",
+ getString("gb.federationStrategy"),
+ getString("gb.federationStrategyDescription"),
+ new DropDownChoice<FederationStrategy>(
+ "choice",
+ new PropertyModel<FederationStrategy>(repositoryModel, "federationStrategy"),
+ federationStrategies,
+ new FederationTypeRenderer())));
+
+ form.add(federationSetsPalette);
+
+ //
+ // SEARCH
+ //
+ form.add(indexedBranchesPalette);
+
+ //
+ // GARBAGE COLLECTION
+ //
+ boolean gcEnabled = app().settings().getBoolean(Keys.git.enableGarbageCollection, false);
+ int defaultGcPeriod = app().settings().getInteger(Keys.git.defaultGarbageCollectionPeriod, 7);
+ if (repositoryModel.gcPeriod == 0) {
+ repositoryModel.gcPeriod = defaultGcPeriod;
+ }
+ List<Integer> gcPeriods = Arrays.asList(1, 2, 3, 4, 5, 7, 10, 14 );
+ form.add(new ChoiceOption<Integer>("gcPeriod",
+ getString("gb.gcPeriod"),
+ getString("gb.gcPeriodDescription"),
+ new DropDownChoice<Integer>("choice",
+ new PropertyModel<Integer>(repositoryModel, "gcPeriod"),
+ gcPeriods,
+ new GCPeriodRenderer())).setEnabled(gcEnabled));
+
+ form.add(new TextOption("gcThreshold",
+ getString("gb.gcThreshold"),
+ getString("gb.gcThresholdDescription"),
+ "span1",
+ new PropertyModel<String>(repositoryModel, "gcThreshold")).setEnabled(gcEnabled));
+
+ //
+ // MISCELLANEOUS
+ //
+
+ form.add(new TextOption("origin",
+ getString("gb.origin"),
+ getString("gb.originDescription"),
+ "span6",
+ new PropertyModel<String>(repositoryModel, "origin")).setEnabled(false));
+
+ form.add(new CheckboxOption("showRemoteBranches",
+ getString("gb.showRemoteBranches"),
+ getString("gb.showRemoteBranchesDescription"),
+ new PropertyModel<Boolean>(repositoryModel, "showRemoteBranches")));
+
+ form.add(new CheckboxOption("skipSizeCalculation",
+ getString("gb.skipSizeCalculation"),
+ getString("gb.skipSizeCalculationDescription"),
+ new PropertyModel<Boolean>(repositoryModel, "skipSizeCalculation")));
+
+ form.add(new CheckboxOption("skipSummaryMetrics",
+ getString("gb.skipSummaryMetrics"),
+ getString("gb.skipSummaryMetricsDescription"),
+ new PropertyModel<Boolean>(repositoryModel, "skipSummaryMetrics")));
+
+ List<Integer> maxActivityCommits = Arrays.asList(-1, 0, 25, 50, 75, 100, 150, 200, 250, 500);
+ form.add(new ChoiceOption<Integer>("maxActivityCommits",
+ getString("gb.maxActivityCommits"),
+ getString("gb.maxActivityCommitsDescription"),
+ new DropDownChoice<Integer>("choice",
+ new PropertyModel<Integer>(repositoryModel, "maxActivityCommits"),
+ maxActivityCommits,
+ new MaxActivityCommitsRenderer())));
+
+ List<CommitMessageRenderer> renderers = Arrays.asList(CommitMessageRenderer.values());
+ form.add(new ChoiceOption<CommitMessageRenderer>("commitMessageRenderer",
+ getString("gb.commitMessageRenderer"),
+ getString("gb.commitMessageRendererDescription"),
+ new DropDownChoice<CommitMessageRenderer>("choice",
+ new PropertyModel<CommitMessageRenderer>(repositoryModel, "commitMessageRenderer"),
+ renderers)));
+
+ metricAuthorExclusions = new Model<String>(ArrayUtils.isEmpty(repositoryModel.metricAuthorExclusions) ? ""
+ : StringUtils.flattenStrings(repositoryModel.metricAuthorExclusions, " "));
+
+ form.add(new TextOption("metricAuthorExclusions",
+ getString("gb.metricAuthorExclusions"),
+ getString("gb.metricAuthorExclusions"),
+ "span6",
+ metricAuthorExclusions));
+
+ mailingLists = new Model<String>(ArrayUtils.isEmpty(repositoryModel.mailingLists) ? ""
+ : StringUtils.flattenStrings(repositoryModel.mailingLists, " "));
+
+ form.add(new TextOption("mailingLists",
+ getString("gb.mailingLists"),
+ getString("gb.mailingLists"),
+ "span6",
+ mailingLists));
+
+
// initial enable/disable of permission controls
if (repositoryModel.accessRestriction.equals(AccessRestrictionType.NONE)) {
// anonymous everything, disable all controls
usersPalette.setEnabled(false);
teamsPalette.setEnabled(false);
- authorizationControl.setEnabled(false);
verifyCommitter.setEnabled(false);
} else {
// authenticated something
// enable authorization controls
- authorizationControl.setEnabled(true);
verifyCommitter.setEnabled(true);
boolean allowFineGrainedControls = repositoryModel.authorizationControl.equals(AuthorizationControl.NAMED);
@@ -546,15 +614,18 @@ public class EditRepositoryPage extends RootSubPage { teamsPalette.setEnabled(allowFineGrainedControls);
}
- accessRestriction.add(new AjaxFormComponentUpdatingBehavior("onchange") {
+ //
+ // ACCESS POLICY PANEL (GENERAL)
+ //
+ AjaxFormChoiceComponentUpdatingBehavior callback = new AjaxFormChoiceComponentUpdatingBehavior() {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
- // enable/disable permissions panel based on access restriction
+ accessPolicyPanel.updateModel(repositoryModel);
+
boolean allowAuthorizationControl = repositoryModel.accessRestriction.exceeds(AccessRestrictionType.NONE);
- authorizationControl.setEnabled(allowAuthorizationControl);
verifyCommitter.setEnabled(allowAuthorizationControl);
boolean allowFineGrainedControls = allowAuthorizationControl && repositoryModel.authorizationControl.equals(AuthorizationControl.NAMED);
@@ -565,41 +636,19 @@ public class EditRepositoryPage extends RootSubPage { repositoryModel.authorizationControl = AuthorizationControl.NAMED;
}
- target.addComponent(authorizationControl);
target.addComponent(verifyCommitter);
target.addComponent(usersPalette);
target.addComponent(teamsPalette);
}
- });
-
- authorizationControl.add(new AjaxFormChoiceComponentUpdatingBehavior() {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- protected void onUpdate(AjaxRequestTarget target) {
- // enable/disable permissions panel based on access restriction
- boolean allowAuthorizationControl = repositoryModel.accessRestriction.exceeds(AccessRestrictionType.NONE);
- authorizationControl.setEnabled(allowAuthorizationControl);
-
- boolean allowFineGrainedControls = allowAuthorizationControl && repositoryModel.authorizationControl.equals(AuthorizationControl.NAMED);
- usersPalette.setEnabled(allowFineGrainedControls);
- teamsPalette.setEnabled(allowFineGrainedControls);
-
- if (allowFineGrainedControls) {
- repositoryModel.authorizationControl = AuthorizationControl.NAMED;
- }
+ };
- target.addComponent(authorizationControl);
- target.addComponent(usersPalette);
- target.addComponent(teamsPalette);
- }
- });
+ accessPolicyPanel = new AccessPolicyPanel("accessPolicyPanel", repositoryModel, callback);
+ form.add(accessPolicyPanel);
- List<CommitMessageRenderer> renderers = Arrays.asList(CommitMessageRenderer.values());
- DropDownChoice<CommitMessageRenderer> messageRendererChoice = new DropDownChoice<CommitMessageRenderer>("commitMessageRenderer", renderers);
- form.add(messageRendererChoice);
+ //
+ // FORM CONTROLS
+ //
form.add(new Button("save"));
Button cancel = new Button("cancel") {
private static final long serialVersionUID = 1L;
@@ -632,7 +681,15 @@ public class EditRepositoryPage extends RootSubPage { if (canDelete) {
if (app().repositories().deleteRepositoryModel(latestModel)) {
info(MessageFormat.format(getString("gb.repositoryDeleted"), latestModel));
- setResponsePage(RepositoriesPage.class);
+ if (latestModel.isPersonalRepository()) {
+ // redirect to user's profile page
+ String prefix = app().settings().getString(Keys.git.userRepositoryPrefix, "~");
+ String username = latestModel.projectPath.substring(prefix.length());
+ setResponsePage(UserPage.class, WicketUtils.newUsernameParameter(username));
+ } else {
+ // redirect to server repositories page
+ setResponsePage(RepositoriesPage.class);
+ }
} else {
error(MessageFormat.format(getString("gb.repositoryDeleteFailed"), latestModel));
}
@@ -697,26 +754,6 @@ public class EditRepositoryPage extends RootSubPage { }
}
- private class AccessRestrictionRenderer implements IChoiceRenderer<AccessRestrictionType> {
-
- private static final long serialVersionUID = 1L;
-
- private final Map<AccessRestrictionType, String> map;
-
- public AccessRestrictionRenderer() {
- map = getAccessRestrictions();
- }
-
- @Override
- public String getDisplayValue(AccessRestrictionType type) {
- return map.get(type);
- }
-
- @Override
- public String getIdValue(AccessRestrictionType type, int index) {
- return Integer.toString(index);
- }
- }
private class FederationTypeRenderer implements IChoiceRenderer<FederationStrategy> {
@@ -739,27 +776,6 @@ public class EditRepositoryPage extends RootSubPage { }
}
- private class AuthorizationControlRenderer implements IChoiceRenderer<AuthorizationControl> {
-
- private static final long serialVersionUID = 1L;
-
- private final Map<AuthorizationControl, String> map;
-
- public AuthorizationControlRenderer() {
- map = getAuthorizationControls();
- }
-
- @Override
- public String getDisplayValue(AuthorizationControl type) {
- return map.get(type);
- }
-
- @Override
- public String getIdValue(AuthorizationControl type, int index) {
- return Integer.toString(index);
- }
- }
-
private class GCPeriodRenderer implements IChoiceRenderer<Integer> {
private static final long serialVersionUID = 1L;
|