From 42972d830611fa4b1aa2c2c49c824a15e1987597 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Tue, 03 Jun 2014 10:38:55 -0400
Subject: [PATCH] Merged #76 "Simplify repository creation with a new page"
---
src/main/java/com/gitblit/wicket/panels/RepositoryNamePanel.java | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 176 insertions(+), 0 deletions(-)
diff --git a/src/main/java/com/gitblit/wicket/panels/RepositoryNamePanel.java b/src/main/java/com/gitblit/wicket/panels/RepositoryNamePanel.java
new file mode 100644
index 0000000..358ff59
--- /dev/null
+++ b/src/main/java/com/gitblit/wicket/panels/RepositoryNamePanel.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright 2014 gitblit.com.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.gitblit.wicket.panels;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.apache.wicket.markup.html.form.DropDownChoice;
+import org.apache.wicket.markup.html.form.TextField;
+
+import com.gitblit.models.ProjectModel;
+import com.gitblit.models.RepositoryModel;
+import com.gitblit.models.UserModel;
+import com.gitblit.utils.StringUtils;
+import com.gitblit.wicket.GitBlitWebSession;
+
+/**
+ * A panel for naming a repository, specifying it's project, and entering a description.
+ *
+ * @author James Moger
+ *
+ */
+public class RepositoryNamePanel extends BasePanel {
+
+ private static final long serialVersionUID = 1L;
+
+ private String fullName;
+
+ private DropDownChoice<String> projectChoice;
+
+ private TextField<String> nameField;
+
+ public RepositoryNamePanel(String wicketId, RepositoryModel repository) {
+ super(wicketId);
+
+ GitBlitWebSession session = GitBlitWebSession.get();
+ UserModel user = session.getUser();
+
+ // build project set for repository destination
+ String defaultProject = null;
+ Set<String> projectNames = new TreeSet<String>();
+
+ // add the registered/known projects
+ for (ProjectModel project : app().projects().getProjectModels(user, false)) {
+ // TODO issue-351: user.canAdmin(project)
+ if (user.canAdmin()) {
+ if (project.isRoot) {
+ projectNames.add("/");
+ } else {
+ projectNames.add(project.name + "/");
+ }
+ }
+ }
+
+ // add the user's personal project namespace
+ if (user.canAdmin() || user.canCreate()) {
+ projectNames.add(user.getPersonalPath() + "/");
+ }
+
+ if (!StringUtils.isEmpty(repository.name)) {
+ // editing a repository name
+ // set the defaultProject to the current repository project
+ defaultProject = repository.projectPath;
+ if (StringUtils.isEmpty(defaultProject)) {
+ defaultProject = "/";
+ } else {
+ defaultProject += "/";
+ }
+
+ projectNames.add(defaultProject);
+ }
+
+ // if default project is not already set, set preference based on the user permissions
+ if (defaultProject == null) {
+ if (user.canAdmin()) {
+ defaultProject = "/";
+ } else if (user.canCreate()) {
+ defaultProject = user.getPersonalPath() + "/";
+ }
+ }
+
+ // update the model which is reflectively mapped to the Wicket fields by name
+ repository.projectPath = defaultProject;
+ if (repository.projectPath.length() > 1 && !StringUtils.isEmpty(repository.name)) {
+ repository.name = repository.name.substring(repository.projectPath.length());
+ }
+ projectChoice = new DropDownChoice<String>("projectPath", new ArrayList<String>(projectNames));
+ nameField = new TextField<String>("name");
+
+ // only enable project selection if we actually have multiple choices
+ add(projectChoice.setEnabled(projectNames.size() > 1));
+ add(nameField);
+ add(new TextField<String>("description"));
+ }
+
+ public void setEditable(boolean editable) {
+ // only enable project selection if we actually have multiple choices
+ projectChoice.setEnabled(projectChoice.getChoices().size() > 1 && editable);
+ nameField.setEnabled(editable);
+ }
+
+ public boolean updateModel(RepositoryModel repositoryModel) {
+ // confirm a project was selected
+ if (StringUtils.isEmpty(repositoryModel.projectPath)) {
+ error(getString("gb.pleaseSelectProject"));
+ return false;
+ }
+
+ // confirm a repository name was entered
+ if (StringUtils.isEmpty(repositoryModel.name)) {
+ error(getString("gb.pleaseSetRepositoryName"));
+ return false;
+ }
+
+ String project = repositoryModel.projectPath;
+
+ fullName = (project + repositoryModel.name).trim();
+ fullName = fullName.replace('\\', '/');
+ fullName = fullName.replace("//", "/");
+ if (fullName.charAt(0) == '/') {
+ fullName = fullName.substring(1);
+ }
+ if (fullName.endsWith("/")) {
+ fullName = fullName.substring(0, fullName.length() - 1);
+ }
+
+ if (fullName.contains("../")) {
+ error(getString("gb.illegalRelativeSlash"));
+ return false;
+ }
+ if (fullName.contains("/../")) {
+ error(getString("gb.illegalRelativeSlash"));
+ return false;
+ }
+
+ // confirm valid characters in repository name
+ Character c = StringUtils.findInvalidCharacter(fullName);
+ if (c != null) {
+ error(MessageFormat.format(getString("gb.illegalCharacterRepositoryName"), c));
+ return false;
+ }
+
+ repositoryModel.name = fullName;
+ repositoryModel.projectPath = null;
+
+ return true;
+ }
+
+ public void resetModel(RepositoryModel repositoryModel) {
+ // restore project and name fields on error condition
+ repositoryModel.projectPath = StringUtils.getFirstPathElement(fullName) + "/";
+ if (repositoryModel.projectPath.length() > 1) {
+ repositoryModel.name = fullName.substring(repositoryModel.projectPath.length());
+ }
+ }
+
+ @Override
+ protected boolean getStatelessHint() {
+ return false;
+ }
+}
--
Gitblit v1.9.1