From 6b18b0761b726fd9aef1ebcc21b760378f7d4b5c Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Mon, 16 Jun 2014 17:36:12 -0400
Subject: [PATCH] Merge release 1.6.0

---
 src/main/java/com/gitblit/wicket/panels/RepositoryNamePanel.java |  172 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 172 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..f381a45
--- /dev/null
+++ b/src/main/java/com/gitblit/wicket/panels/RepositoryNamePanel.java
@@ -0,0 +1,172 @@
+/*
+ * 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 org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+
+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 final IModel<String> projectPath;
+
+	private DropDownChoice<String> pathChoice;
+
+	private final IModel<String> repoName;
+
+	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 defaultPath = null;
+		String defaultName = null;
+		Set<String> pathNames = 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) {
+					pathNames.add("/");
+				} else {
+					pathNames.add(project.name + "/");
+				}
+			}
+		}
+
+		// add the user's personal project namespace
+		if (user.canAdmin() || user.canCreate()) {
+			pathNames.add(user.getPersonalPath() + "/");
+		}
+
+		if (!StringUtils.isEmpty(repository.name)) {
+			// editing a repository name
+			// set the defaultProject to the current repository project
+			if (StringUtils.isEmpty(repository.projectPath)) {
+				defaultPath = "/";
+				defaultName = repository.name;
+			} else {
+				defaultPath = repository.projectPath + "/";
+				defaultName = repository.name.substring(defaultPath.length());
+			}
+			pathNames.add(defaultPath);
+		}
+
+		// if default project is not already set, set preference based on the user permissions
+		if (defaultPath == null) {
+			if (user.canAdmin()) {
+				defaultPath = "/";
+			} else if (user.canCreate()) {
+				defaultPath = user.getPersonalPath() + "/";
+			}
+		}
+
+		projectPath = Model.of(defaultPath);
+		pathChoice = new DropDownChoice<String>("projectPath", projectPath, new ArrayList<String>(pathNames));
+		repoName = Model.of(defaultName);
+		nameField = new TextField<String>("name", repoName);
+
+		// only enable project selection if we actually have multiple choices
+		add(pathChoice.setEnabled(pathNames.size() > 1));
+		add(nameField);
+		add(new TextField<String>("description"));
+	}
+
+	public void setEditable(boolean editable) {
+		// only enable project selection if we actually have multiple choices
+		pathChoice.setEnabled(pathChoice.getChoices().size() > 1 && editable);
+		nameField.setEnabled(editable);
+	}
+
+	public boolean updateModel(RepositoryModel repositoryModel) {
+		// confirm a project path was selected
+		if (StringUtils.isEmpty(projectPath.getObject())) {
+			error(getString("gb.pleaseSelectProject"));
+			return false;
+		}
+
+		// confirm a repository name was entered
+		if (StringUtils.isEmpty(repoName.getObject())) {
+			error(getString("gb.pleaseSetRepositoryName"));
+			return false;
+		}
+
+		String project = projectPath.getObject();
+		String name = repoName.getObject();
+
+		fullName = (project + 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;
+
+		return true;
+	}
+
+	@Override
+	protected boolean getStatelessHint() {
+		return false;
+	}
+}
\ No newline at end of file

--
Gitblit v1.9.1