From 166e6a131d0693d20b3cc08f252705608d24d5f0 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Wed, 27 Apr 2011 21:56:56 -0400
Subject: [PATCH] Improve repo folder detection. Fail gracefully on create repo error.

---
 src/com/gitblit/wicket/BasePage.html                 |    6 +
 src/com/gitblit/GitBlit.java                         |  110 +++++++++++++++++++-----------------
 src/com/gitblit/wicket/pages/RepositoriesPage.java   |    2 
 src/com/gitblit/wicket/pages/EditRepositoryPage.java |    8 ++
 src/com/gitblit/GitBlitException.java                |   10 +++
 src/com/gitblit/wicket/resources/gitblit.css         |   19 ++++++
 src/com/gitblit/utils/JGitUtils.java                 |    9 +-
 src/com/gitblit/wicket/resources/bullet_error.png    |    0 
 8 files changed, 103 insertions(+), 61 deletions(-)

diff --git a/src/com/gitblit/GitBlit.java b/src/com/gitblit/GitBlit.java
index a626be8..e557c93 100644
--- a/src/com/gitblit/GitBlit.java
+++ b/src/com/gitblit/GitBlit.java
@@ -2,6 +2,7 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -30,7 +31,7 @@
 
 	private FileResolver<Void> repositoryResolver;
 
-	private File repositories;
+	private File repositoriesFolder;
 
 	private boolean exportAll;
 
@@ -93,13 +94,63 @@
 		userCookie.setPath("/");
 		response.addCookie(userCookie);
 	}
+	
+	public List<String> getRepositoryList() {
+		return JGitUtils.getRepositoryList(repositoriesFolder, exportAll, storedSettings.getBoolean(Keys.git.nestedRepositories, true));
+	}
 
-	public void editRepositoryModel(RepositoryModel repository, boolean isCreate) {
+	public Repository getRepository(String repositoryName) {
+		Repository r = null;
+		try {
+			r = repositoryResolver.open(null, repositoryName);
+		} catch (RepositoryNotFoundException e) {
+			r = null;
+			logger.error("Failed to find repository " + repositoryName);
+			e.printStackTrace();
+		} catch (ServiceNotEnabledException e) {
+			r = null;
+			e.printStackTrace();
+		}
+		return r;
+	}
+	
+	public List<RepositoryModel> getRepositoryModels() {
+		List<String> list = getRepositoryList();
+		List<RepositoryModel> repositories = new ArrayList<RepositoryModel>();
+		for (String repo : list) {
+			RepositoryModel model = getRepositoryModel(repo);
+			repositories.add(model);
+		}
+		return repositories;
+	}
+	
+	public RepositoryModel getRepositoryModel(String repositoryName) {
+		Repository r = getRepository(repositoryName);
+		RepositoryModel model = new RepositoryModel();
+		model.name = repositoryName;
+		model.lastChange = JGitUtils.getLastChange(r);
+		StoredConfig config = JGitUtils.readConfig(r);
+		if (config != null) {
+			model.description = config.getString("gitblit", null, "description");
+			model.owner = config.getString("gitblit", null, "owner");
+			model.group = config.getString("gitblit", null, "group");
+			model.useTickets = config.getBoolean("gitblit", "useTickets", false);
+			model.useDocs = config.getBoolean("gitblit", "useDocs", false);
+			model.useRestrictedAccess = config.getBoolean("gitblit", "restrictedAccess", false);
+		}
+		r.close();
+		return model;
+	}
+
+	public void editRepositoryModel(RepositoryModel repository, boolean isCreate) throws GitBlitException {
 		Repository r = null;
 		if (isCreate) {
-			// create repository
+			if (new File(repositoriesFolder, repository.name).exists()) {
+				throw new GitBlitException(MessageFormat.format("Can not create repository {0} because it already exists.", repository.name));
+			}
+			// create repository			
 			logger.info("create repository " + repository.name);
-			r = JGitUtils.createRepository(repositories, repository.name, true);
+			r = JGitUtils.createRepository(repositoriesFolder, repository.name, true);
 		} else {
 			// load repository
 			logger.info("edit repository " + repository.name);
@@ -127,59 +178,12 @@
 		r.close();
 	}
 
-	public List<String> getRepositoryList() {
-		return JGitUtils.getRepositoryList(repositories, exportAll, storedSettings.getBoolean(Keys.git.nestedRepositories, true));
-	}
-
-	public List<RepositoryModel> getRepositories() {
-		List<String> list = getRepositoryList();
-		List<RepositoryModel> repositories = new ArrayList<RepositoryModel>();
-		for (String repo : list) {
-			RepositoryModel model = getRepositoryModel(repo);
-			repositories.add(model);
-		}
-		return repositories;
-	}
-
-	public Repository getRepository(String repositoryName) {
-		Repository r = null;
-		try {
-			r = repositoryResolver.open(null, repositoryName);
-		} catch (RepositoryNotFoundException e) {
-			r = null;
-			logger.error("Failed to find repository " + repositoryName);
-			e.printStackTrace();
-		} catch (ServiceNotEnabledException e) {
-			r = null;
-			e.printStackTrace();
-		}
-		return r;
-	}
-
-	public RepositoryModel getRepositoryModel(String repositoryName) {
-		Repository r = getRepository(repositoryName);
-		RepositoryModel model = new RepositoryModel();
-		model.name = repositoryName;
-		model.lastChange = JGitUtils.getLastChange(r);
-		StoredConfig config = JGitUtils.readConfig(r);
-		if (config != null) {
-			model.description = config.getString("gitblit", null, "description");
-			model.owner = config.getString("gitblit", null, "owner");
-			model.group = config.getString("gitblit", null, "group");
-			model.useTickets = config.getBoolean("gitblit", "useTickets", false);
-			model.useDocs = config.getBoolean("gitblit", "useDocs", false);
-			model.useRestrictedAccess = config.getBoolean("gitblit", "restrictedAccess", false);
-		}
-		r.close();
-		return model;
-	}
-
 	public void setupContext(IStoredSettings settings) {
 		logger.info("Setting up GitBlit context from " + settings.toString());
 		this.storedSettings = settings;
-		repositories = new File(settings.getString(Keys.git.repositoriesFolder, "repos"));
+		repositoriesFolder = new File(settings.getString(Keys.git.repositoriesFolder, "repos"));
 		exportAll = settings.getBoolean(Keys.git.exportAll, true);
-		repositoryResolver = new FileResolver(repositories, exportAll);
+		repositoryResolver = new FileResolver<Void>(repositoriesFolder, exportAll);
 	}
 
 	@Override
diff --git a/src/com/gitblit/GitBlitException.java b/src/com/gitblit/GitBlitException.java
new file mode 100644
index 0000000..15e38e1
--- /dev/null
+++ b/src/com/gitblit/GitBlitException.java
@@ -0,0 +1,10 @@
+package com.gitblit;
+
+public class GitBlitException extends Exception {
+
+	private static final long serialVersionUID = 1L;
+
+	public GitBlitException(String message) {
+		super(message);
+	}
+}
diff --git a/src/com/gitblit/utils/JGitUtils.java b/src/com/gitblit/utils/JGitUtils.java
index 4cfed0d..70a938f 100644
--- a/src/com/gitblit/utils/JGitUtils.java
+++ b/src/com/gitblit/utils/JGitUtils.java
@@ -94,9 +94,10 @@
 				File gitFolder = new File(file, Constants.DOT_GIT);
 				boolean isGitRepository = gitFolder.exists() && gitFolder.isDirectory();
 				
-				// then look for folder.git/HEAD
+				// then look for folder.git/HEAD or folder/HEAD and folder/config
 				if (!isGitRepository) {
-					if (file.getName().endsWith(Constants.DOT_GIT_EXT) && new File(file, Constants.HEAD).exists()) {
+					if ((file.getName().endsWith(Constants.DOT_GIT_EXT) && new File(file, Constants.HEAD).exists())
+							|| (new File(file, "config").exists() && new File(file, Constants.HEAD).exists())) {
 						gitFolder = file;
 						isGitRepository = true;
 					}
@@ -266,13 +267,13 @@
 
 	public static String getRawContentAsString(Repository r, RevBlob blob) {
 		byte [] content = getRawContent(r, blob);
-		return new String(content, Charset.forName("UTF-8"));
+		return new String(content, Charset.forName(Constants.CHARACTER_ENCODING));
 	}
 
 	public static String getRawContentAsString(Repository r, RevCommit commit, String blobPath) {
 		RevObject obj = getRevObject(r, commit.getTree(), blobPath);
 		byte [] content = getRawContent(r, (RevBlob) obj);
-		return new String(content, Charset.forName("UTF-8"));
+		return new String(content, Charset.forName(Constants.CHARACTER_ENCODING));
 	}
 
 	public static List<PathModel> getFilesInPath(Repository r, String basePath, String objectId) {
diff --git a/src/com/gitblit/wicket/BasePage.html b/src/com/gitblit/wicket/BasePage.html
index b88192b..69183b6 100644
--- a/src/com/gitblit/wicket/BasePage.html
+++ b/src/com/gitblit/wicket/BasePage.html
@@ -21,8 +21,10 @@
 					<img src="resources/gitblt_25.png" width="79" height="25" alt="gitblit" class="logo"/>
 				</wicket:link>
 			</a>
-			<a href="/"><span wicket:id="siteName">[site name]</span></a> / <span wicket:id="repositoryName">[repository name]</span> <span wicket:id="pageName">[page name]</span>
-			<div style="float:none;" wicket:id="feedback">[Feedback Panel]</div> 
+			<span>
+				<a href="/"><span wicket:id="siteName">[site name]</span></a> / <span wicket:id="repositoryName">[repository name]</span> <span wicket:id="pageName">[page name]</span>
+			</span>	
+			<span wicket:id="feedback">[Feedback Panel]</span>
 		</div>
 
 		<!-- page content -->
diff --git a/src/com/gitblit/wicket/pages/EditRepositoryPage.java b/src/com/gitblit/wicket/pages/EditRepositoryPage.java
index 6201b22..45fe9e2 100644
--- a/src/com/gitblit/wicket/pages/EditRepositoryPage.java
+++ b/src/com/gitblit/wicket/pages/EditRepositoryPage.java
@@ -9,6 +9,7 @@
 import org.apache.wicket.model.CompoundPropertyModel;
 
 import com.gitblit.GitBlit;
+import com.gitblit.GitBlitException;
 import com.gitblit.wicket.AdminPage;
 import com.gitblit.wicket.BasePage;
 import com.gitblit.wicket.WicketUtils;
@@ -48,7 +49,12 @@
 
 			@Override
 			protected void onSubmit() {
-				GitBlit.self().editRepositoryModel(repositoryModel, isCreate);
+				try {
+					GitBlit.self().editRepositoryModel(repositoryModel, isCreate);
+				} catch (GitBlitException e) {
+					error(e.getMessage());
+					return;
+				}
 				setRedirect(true);
 				setResponsePage(RepositoriesPage.class);
 			}
diff --git a/src/com/gitblit/wicket/pages/RepositoriesPage.java b/src/com/gitblit/wicket/pages/RepositoriesPage.java
index c834604..768cea1 100644
--- a/src/com/gitblit/wicket/pages/RepositoriesPage.java
+++ b/src/com/gitblit/wicket/pages/RepositoriesPage.java
@@ -89,7 +89,7 @@
 		}
 		add(repositoriesMessage);
 
-		List<RepositoryModel> rows = GitBlit.self().getRepositories();
+		List<RepositoryModel> rows = GitBlit.self().getRepositoryModels();
 		DataProvider dp = new DataProvider(rows);
 		DataView<RepositoryModel> dataView = new DataView<RepositoryModel>("repository", dp) {
 			private static final long serialVersionUID = 1L;
diff --git a/src/com/gitblit/wicket/resources/bullet_error.png b/src/com/gitblit/wicket/resources/bullet_error.png
new file mode 100644
index 0000000..b2e6b75
--- /dev/null
+++ b/src/com/gitblit/wicket/resources/bullet_error.png
Binary files differ
diff --git a/src/com/gitblit/wicket/resources/gitblit.css b/src/com/gitblit/wicket/resources/gitblit.css
index 5384546..8317e36 100644
--- a/src/com/gitblit/wicket/resources/gitblit.css
+++ b/src/com/gitblit/wicket/resources/gitblit.css
@@ -628,4 +628,23 @@
 span .headRef {
 	background-color: #ccffcc;
 	border-color: #ccffcc #00cc33 #00cc33 #ccffcc;
+}
+
+.feedbackPanelERROR {	
+	color: red;
+	list-style-image: url(bullet_error.png);
+	font-weight: bold;
+	text-align:left;
+	vertical-align: top;
+	padding:0;	
+	margin:0;	
+}
+
+.feedbackPanelINFO {
+	color: green;
+	list-style: none;
+	font-weight: bold;
+	text-align:center;
+	padding:0;
+	margin:0;
 }
\ No newline at end of file

--
Gitblit v1.9.1