From 166e6a131d0693d20b3cc08f252705608d24d5f0 Mon Sep 17 00:00:00 2001 From: James Moger Date: Wed, 27 Apr 2011 21:56:56 -0400 Subject: [PATCH] Improve repo folder detection. Fail gracefully on create repo error. --- src/com/gitblit/GitBlit.java | 102 +++++++++--------- src/com/gitblit/GitBlitException.java | 10 ++ src/com/gitblit/utils/JGitUtils.java | 9 +- src/com/gitblit/wicket/BasePage.html | 6 +- .../wicket/pages/EditRepositoryPage.java | 8 +- .../wicket/pages/RepositoriesPage.java | 2 +- .../gitblit/wicket/resources/bullet_error.png | Bin 0 -> 368 bytes src/com/gitblit/wicket/resources/gitblit.css | 19 ++++ 8 files changed, 99 insertions(+), 57 deletions(-) create mode 100644 src/com/gitblit/GitBlitException.java create mode 100644 src/com/gitblit/wicket/resources/bullet_error.png diff --git a/src/com/gitblit/GitBlit.java b/src/com/gitblit/GitBlit.java index a626be84..e557c934 100644 --- a/src/com/gitblit/GitBlit.java +++ b/src/com/gitblit/GitBlit.java @@ -2,6 +2,7 @@ package com.gitblit; import java.io.File; import java.io.IOException; +import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; @@ -30,7 +31,7 @@ public class GitBlit implements ServletContextListener { private FileResolver repositoryResolver; - private File repositories; + private File repositoriesFolder; private boolean exportAll; @@ -93,52 +94,9 @@ public class GitBlit implements ServletContextListener { userCookie.setPath("/"); response.addCookie(userCookie); } - - public void editRepositoryModel(RepositoryModel repository, boolean isCreate) { - Repository r = null; - if (isCreate) { - // create repository - logger.info("create repository " + repository.name); - r = JGitUtils.createRepository(repositories, repository.name, true); - } else { - // load repository - logger.info("edit repository " + repository.name); - try { - r = repositoryResolver.open(null, repository.name); - } catch (RepositoryNotFoundException e) { - logger.error("Repository not found", e); - } catch (ServiceNotEnabledException e) { - logger.error("Service not enabled", e); - } - } - - // update settings - StoredConfig config = JGitUtils.readConfig(r); - config.setString("gitblit", null, "description", repository.description); - config.setString("gitblit", null, "owner", repository.owner); - config.setBoolean("gitblit", null, "useTickets", repository.useTickets); - config.setBoolean("gitblit", null, "useDocs", repository.useDocs); - config.setBoolean("gitblit", null, "restrictedAccess", repository.useRestrictedAccess); - try { - config.save(); - } catch (IOException e) { - logger.error("Failed to save repository config!", e); - } - r.close(); - } - + public List getRepositoryList() { - return JGitUtils.getRepositoryList(repositories, exportAll, storedSettings.getBoolean(Keys.git.nestedRepositories, true)); - } - - public List getRepositories() { - List list = getRepositoryList(); - List repositories = new ArrayList(); - for (String repo : list) { - RepositoryModel model = getRepositoryModel(repo); - repositories.add(model); - } - return repositories; + return JGitUtils.getRepositoryList(repositoriesFolder, exportAll, storedSettings.getBoolean(Keys.git.nestedRepositories, true)); } public Repository getRepository(String repositoryName) { @@ -155,7 +113,17 @@ public class GitBlit implements ServletContextListener { } return r; } - + + public List getRepositoryModels() { + List list = getRepositoryList(); + List repositories = new ArrayList(); + 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(); @@ -174,12 +142,48 @@ public class GitBlit implements ServletContextListener { return model; } + public void editRepositoryModel(RepositoryModel repository, boolean isCreate) throws GitBlitException { + Repository r = null; + if (isCreate) { + 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(repositoriesFolder, repository.name, true); + } else { + // load repository + logger.info("edit repository " + repository.name); + try { + r = repositoryResolver.open(null, repository.name); + } catch (RepositoryNotFoundException e) { + logger.error("Repository not found", e); + } catch (ServiceNotEnabledException e) { + logger.error("Service not enabled", e); + } + } + + // update settings + StoredConfig config = JGitUtils.readConfig(r); + config.setString("gitblit", null, "description", repository.description); + config.setString("gitblit", null, "owner", repository.owner); + config.setBoolean("gitblit", null, "useTickets", repository.useTickets); + config.setBoolean("gitblit", null, "useDocs", repository.useDocs); + config.setBoolean("gitblit", null, "restrictedAccess", repository.useRestrictedAccess); + try { + config.save(); + } catch (IOException e) { + logger.error("Failed to save repository config!", e); + } + r.close(); + } + 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(repositoriesFolder, exportAll); } @Override diff --git a/src/com/gitblit/GitBlitException.java b/src/com/gitblit/GitBlitException.java new file mode 100644 index 00000000..15e38e16 --- /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 4cfed0da..70a938ff 100644 --- a/src/com/gitblit/utils/JGitUtils.java +++ b/src/com/gitblit/utils/JGitUtils.java @@ -94,9 +94,10 @@ public class JGitUtils { 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 class JGitUtils { 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 getFilesInPath(Repository r, String basePath, String objectId) { diff --git a/src/com/gitblit/wicket/BasePage.html b/src/com/gitblit/wicket/BasePage.html index b88192b5..69183b68 100644 --- a/src/com/gitblit/wicket/BasePage.html +++ b/src/com/gitblit/wicket/BasePage.html @@ -21,8 +21,10 @@ - [site name] / [repository name] [page name] -
[Feedback Panel]
+ + [site name] / [repository name] [page name] + + [Feedback Panel] diff --git a/src/com/gitblit/wicket/pages/EditRepositoryPage.java b/src/com/gitblit/wicket/pages/EditRepositoryPage.java index 6201b22b..45fe9e2e 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.markup.html.form.TextField; 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 @@ public class EditRepositoryPage extends BasePage { @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 c834604d..768cea14 100644 --- a/src/com/gitblit/wicket/pages/RepositoriesPage.java +++ b/src/com/gitblit/wicket/pages/RepositoriesPage.java @@ -89,7 +89,7 @@ public class RepositoriesPage extends BasePage { } add(repositoriesMessage); - List rows = GitBlit.self().getRepositories(); + List rows = GitBlit.self().getRepositoryModels(); DataProvider dp = new DataProvider(rows); DataView dataView = new DataView("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 0000000000000000000000000000000000000000..b2e6b7522df3c141007b6ea401f75dd5ceea73dc GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+7==7t978H@CH?vT-=0~up|jD+VIw1tg8l&ms~wl}?)@uR z`MzGD*IV9CJm&3|36BMzuAb0cl*n*V!Ok=8$M@Io*(&9k+0^$(^C(CiQNPu2`mNZ` zM{S$hcxrlh&hY$~a4_lM7gEnSFx5|6Pfcx^=b~RpJUsFChJXH@Wm)D}Gr__`Zaw4w z|Nrc@^0hg?95!cb%a51fJM)(TD!H7|;d1Ow*Bd-LR3#)O>T1#we*A4cXcQ>o)BHoB zaDt78te*Irpe+wm5`O%i+SvHf`humsM4$hDzGVk%7Fa~ct>9bM$Qo&`tgL)^YVUlB zfB%2?tFUzytC;%q@c5kR;jk-WVv