From 66de92b4e28dae1464b51b688c412d43d3d70add Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Mon, 1 Dec 2014 11:33:46 +0000 Subject: [PATCH] Close repository after each operation This prevents the tests failing when they try to delete the .git files, but there is still a file lock (in Snake YAML), so does not yet fix gh-45. --- .../server/JGitEnvironmentRepository.java | 39 ++++++++++++------- .../JGitEnvironmentRepositoryTests.java | 2 +- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/JGitEnvironmentRepository.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/JGitEnvironmentRepository.java index c40fd900..ff55cf89 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/JGitEnvironmentRepository.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/JGitEnvironmentRepository.java @@ -117,11 +117,11 @@ public class JGitEnvironmentRepository implements EnvironmentRepository { public File getBasedir() { return basedir; } - + public void setSearchPaths(String... searchPaths) { this.searchPaths = searchPaths; } - + public String[] getSearchPaths() { return searchPaths; } @@ -145,8 +145,9 @@ public class JGitEnvironmentRepository implements EnvironmentRepository { @Override public Environment findOne(String application, String profile, String label) { initialize(); + Git git = null; try { - final Git git = createGitClient(); + git = createGitClient(); return loadEnvironment(git, application, profile, label); } catch (GitAPIException e) { @@ -155,9 +156,20 @@ public class JGitEnvironmentRepository implements EnvironmentRepository { catch (Exception e) { throw new IllegalStateException("Cannot load environment", e); } + finally { + try { + if (git != null) { + git.getRepository().close(); + } + } + catch (Exception e) { + logger.warn("Could not close git repository", e); + } + } } - private synchronized Environment loadEnvironment(Git git, String application, String profile, String label) throws GitAPIException { + private synchronized Environment loadEnvironment(Git git, String application, + String profile, String label) throws GitAPIException { SpringApplicationEnvironmentRepository environment = new SpringApplicationEnvironmentRepository(); git.getRepository().getConfig().setString("branch", label, "merge", label); Ref ref = checkout(git, label); @@ -184,7 +196,8 @@ public class JGitEnvironmentRepository implements EnvironmentRepository { CheckoutCommand checkout = git.checkout(); if (shouldTrack(git, label)) { trackBranch(git, checkout, label); - } else { + } + else { // works for tags and local branches checkout.setName(label); } @@ -211,15 +224,16 @@ public class JGitEnvironmentRepository implements EnvironmentRepository { pull.call(); } catch (Exception e) { - logger.warn("Could not pull remote for " + label - + " (current ref=" + ref + ")"); + logger.warn("Could not pull remote for " + label + " (current ref=" + ref + + ")"); } } private Git createGitClient() throws IOException, GitAPIException { if (new File(basedir, ".git").exists()) { return openGitRepository(); - } else { + } + else { return copyRepository(); } } @@ -243,15 +257,13 @@ public class JGitEnvironmentRepository implements EnvironmentRepository { private Git copyFromLocalRepository() throws IOException { Git git; - FileSystemUtils.copyRecursively(new UrlResource(uri).getFile(), - basedir); + FileSystemUtils.copyRecursively(new UrlResource(uri).getFile(), basedir); git = Git.open(basedir); return git; } private Git cloneToBasedir() throws GitAPIException { - CloneCommand clone = Git.cloneRepository().setURI(uri) - .setDirectory(basedir); + CloneCommand clone = Git.cloneRepository().setURI(uri).setDirectory(basedir); if (hasText(username)) { setCredentialsProvider(clone); } @@ -277,8 +289,7 @@ public class JGitEnvironmentRepository implements EnvironmentRepository { FileUtils.delete(basedir, FileUtils.RECURSIVE); } catch (IOException e) { - throw new IllegalStateException( - "Failed to initialize base directory", e); + throw new IllegalStateException("Failed to initialize base directory", e); } } } diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/JGitEnvironmentRepositoryTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/JGitEnvironmentRepositoryTests.java index 079ca57a..2e2b527f 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/JGitEnvironmentRepositoryTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/JGitEnvironmentRepositoryTests.java @@ -45,7 +45,7 @@ public class JGitEnvironmentRepositoryTests { String uri = ConfigServerTestUtils.prepareLocalRepo(); repository.setUri(uri); if (basedir.exists()) { - FileUtils.delete(basedir, FileUtils.RECURSIVE); + FileUtils.delete(basedir, FileUtils.RECURSIVE | FileUtils.RETRY); } }