diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ConfigServerTestUtils.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ConfigServerTestUtils.java index ed511857..a892d8ac 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ConfigServerTestUtils.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/ConfigServerTestUtils.java @@ -28,10 +28,14 @@ public class ConfigServerTestUtils { public static String prepareLocalRepo() throws IOException { return prepareLocalRepo("target/test-classes", "config-repo", "target/config"); - } - - public static String prepareLocalRepo(String buildDir, String repoPath, String checkoutDir) throws IOException { + + public static String prepareLocalRepo(String repoPath) throws IOException { + return prepareLocalRepo("target/test-classes", repoPath, "target/config"); + } + + public static String prepareLocalRepo(String buildDir, String repoPath, + String checkoutDir) throws IOException { if (!repoPath.startsWith("/")) { repoPath = "/" + repoPath; } 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 da8d93dc..5224c74b 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 @@ -21,6 +21,7 @@ import static org.springframework.util.StringUtils.hasText; import java.io.File; import java.io.IOException; import java.nio.file.Files; +import java.util.ArrayList; import java.util.List; import org.apache.commons.logging.Log; @@ -72,6 +73,8 @@ public class JGitEnvironmentRepository implements EnvironmentRepository { private boolean initialized; + private String[] searchPaths = new String[0]; + public JGitEnvironmentRepository(ConfigurableEnvironment environment) { this.environment = environment; try { @@ -112,6 +115,14 @@ public class JGitEnvironmentRepository implements EnvironmentRepository { public File getBasedir() { return basedir; } + + public void setSearchPaths(String... searchPaths) { + this.searchPaths = searchPaths; + } + + public String[] getSearchPaths() { + return searchPaths; + } public String getUsername() { return username; @@ -148,11 +159,22 @@ public class JGitEnvironmentRepository implements EnvironmentRepository { if (shouldPull(git, ref)) { pull(git, label, ref); } - String search = basedir.toURI().toString(); - environment.setSearchLocations(search); + environment.setSearchLocations(getSearchLocations(basedir)); return clean(environment.findOne(application, profile, label)); } + private String[] getSearchLocations(File dir) { + List locations = new ArrayList(); + locations.add(dir.toURI().toString()); + for (String path : searchPaths) { + File file = new File(basedir, path); + if (file.isDirectory()) { + locations.add(file.toURI().toString()); + } + } + return locations.toArray(new String[0]); + } + private Ref checkout(Git git, String label) throws GitAPIException { CheckoutCommand checkout = git.checkout(); if (shouldTrack(git, label)) { diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/JGitEnvironmentRepositoryIntegrationTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/JGitEnvironmentRepositoryIntegrationTests.java new file mode 100644 index 00000000..036628d6 --- /dev/null +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/JGitEnvironmentRepositoryIntegrationTests.java @@ -0,0 +1,88 @@ +/* + * Copyright 2013-2014 the original author or authors. + * + * 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 org.springframework.cloud.config.server; + +import static org.junit.Assert.assertEquals; + +import java.io.File; +import java.io.IOException; + +import org.eclipse.jgit.util.FileUtils; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.cloud.config.Environment; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +/** + * @author Dave Syer + * + */ +public class JGitEnvironmentRepositoryIntegrationTests { + + private ConfigurableApplicationContext context; + + private File basedir = new File("target/config"); + + @Before + public void init() throws Exception { + if (basedir.exists()) { + FileUtils.delete(basedir, FileUtils.RECURSIVE); + } + } + + @After + public void close() { + if (context != null) { + context.close(); + } + } + + @Test + public void vanilla() throws IOException { + String uri = ConfigServerTestUtils.prepareLocalRepo(); + context = new SpringApplicationBuilder(TestConfiguration.class).web(false) + .properties("spring.cloud.config.server.git.uri=" + uri).run(); + EnvironmentRepository repository = context.getBean(EnvironmentRepository.class); + repository.findOne("bar", "staging", "master"); + Environment environment = repository.findOne("bar", "staging", "master"); + assertEquals(2, environment.getPropertySources().size()); + } + + @Test + public void nested() throws IOException { + String uri = ConfigServerTestUtils.prepareLocalRepo("another-config-repo"); + context = new SpringApplicationBuilder(TestConfiguration.class) + .web(false) + .properties("spring.cloud.config.server.git.uri=" + uri, + "spring.cloud.config.server.git.searchPaths=sub").run(); + EnvironmentRepository repository = context.getBean(EnvironmentRepository.class); + repository.findOne("bar", "staging", "master"); + Environment environment = repository.findOne("bar", "staging", "master"); + assertEquals(2, environment.getPropertySources().size()); + } + + @Configuration + @Import({ PropertyPlaceholderAutoConfiguration.class, ConfigServerConfiguration.class }) + protected static class TestConfiguration { + } + +} 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 07ae62b0..079ca57a 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 @@ -20,6 +20,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.File; +import java.io.IOException; import org.eclipse.jgit.util.FileUtils; import org.junit.Before; @@ -57,6 +58,18 @@ public class JGitEnvironmentRepositoryTests { .getPropertySources().get(0).getName()); } + @Test + public void nested() throws IOException { + String uri = ConfigServerTestUtils.prepareLocalRepo("another-config-repo"); + repository.setUri(uri); + repository.setSearchPaths(new String[] {"sub"}); + repository.findOne("bar", "staging", "master"); + Environment environment = repository.findOne("bar", "staging", "master"); + assertEquals(2, environment.getPropertySources().size()); + assertEquals(repository.getUri() + "/sub/application.yml", environment + .getPropertySources().get(0).getName()); + } + @Test public void branch() { repository.setBasedir(basedir); diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/bar.properties b/spring-cloud-config-server/src/test/resources/another-config-repo/bar.properties new file mode 100644 index 00000000..7daacd5d --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/bar.properties @@ -0,0 +1 @@ +foo: bar \ No newline at end of file diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/COMMIT_EDITMSG b/spring-cloud-config-server/src/test/resources/another-config-repo/git/COMMIT_EDITMSG new file mode 100644 index 00000000..38f51b1c --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/git/COMMIT_EDITMSG @@ -0,0 +1 @@ +Move application.yml to subdir diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/FETCH_HEAD b/spring-cloud-config-server/src/test/resources/another-config-repo/git/FETCH_HEAD new file mode 100644 index 00000000..527abd40 --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/git/FETCH_HEAD @@ -0,0 +1,2 @@ +7df4a26d5437d9d4090cd5809967f870444cde8f not-for-merge branch 'raw' of dsyer@localhost:/home/dsyer/dev/platform/config/spring-platform-config-server/target/test-classes/config-repo +7df4a26d5437d9d4090cd5809967f870444cde8f not-for-merge tag 'foo' of dsyer@localhost:/home/dsyer/dev/platform/config/spring-platform-config-server/target/test-classes/config-repo diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/HEAD b/spring-cloud-config-server/src/test/resources/another-config-repo/git/HEAD new file mode 100644 index 00000000..cb089cd8 --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/git/HEAD @@ -0,0 +1 @@ +ref: refs/heads/master diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/config b/spring-cloud-config-server/src/test/resources/another-config-repo/git/config new file mode 100644 index 00000000..9b73bf82 --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/git/config @@ -0,0 +1,5 @@ +[core] + repositoryformatversion = 0 + filemode = true + logallrefupdates = true +[branch "raw"] diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/gitk.cache b/spring-cloud-config-server/src/test/resources/another-config-repo/git/gitk.cache new file mode 100644 index 00000000..b420ccba --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/git/gitk.cache @@ -0,0 +1,3 @@ +1 1 +7df4a26d5437d9d4090cd5809967f870444cde8f 9f01fb972bc9617e4ea59f5c8ee3ceb5ff515cd0 9f01fb972bc9617e4ea59f5c8ee3ceb5ff515cd0 +1 diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/index b/spring-cloud-config-server/src/test/resources/another-config-repo/git/index new file mode 100644 index 00000000..2e65e5ac Binary files /dev/null and b/spring-cloud-config-server/src/test/resources/another-config-repo/git/index differ diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/HEAD b/spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/HEAD new file mode 100644 index 00000000..115205aa --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/HEAD @@ -0,0 +1,3 @@ +0000000000000000000000000000000000000000 7df4a26d5437d9d4090cd5809967f870444cde8f Dave Syer 1406860717 -0700 +7df4a26d5437d9d4090cd5809967f870444cde8f 9f01fb972bc9617e4ea59f5c8ee3ceb5ff515cd0 Dave Syer 1415902155 +0000 checkout: moving from raw to master +9f01fb972bc9617e4ea59f5c8ee3ceb5ff515cd0 c4bd92016dc14b9fe376d9c3f7af1c9d22d44ee4 Dave Syer 1415902338 +0000 commit: Move application.yml to subdir diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/refs/heads/master b/spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/refs/heads/master new file mode 100644 index 00000000..dabf7fcd --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/refs/heads/master @@ -0,0 +1,2 @@ +0000000000000000000000000000000000000000 9f01fb972bc9617e4ea59f5c8ee3ceb5ff515cd0 Dave Syer 1406860776 -0700 branch: Created from 9f01fb972bc9617e4ea59f5c8ee3ceb5ff515cd0 +9f01fb972bc9617e4ea59f5c8ee3ceb5ff515cd0 c4bd92016dc14b9fe376d9c3f7af1c9d22d44ee4 Dave Syer 1415902338 +0000 commit: Move application.yml to subdir diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/refs/heads/raw b/spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/refs/heads/raw new file mode 100644 index 00000000..c6423ee9 --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/git/logs/refs/heads/raw @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 7df4a26d5437d9d4090cd5809967f870444cde8f Dave Syer 1406860717 -0700 diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/16/33e23980f4b4dffab6e1d87b622afd9131515e b/spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/16/33e23980f4b4dffab6e1d87b622afd9131515e new file mode 100644 index 00000000..10dff25f Binary files /dev/null and b/spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/16/33e23980f4b4dffab6e1d87b622afd9131515e differ diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/27/d0b5b449f2e8326844a735220383bf16de28b5 b/spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/27/d0b5b449f2e8326844a735220383bf16de28b5 new file mode 100644 index 00000000..6328e889 --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/27/d0b5b449f2e8326844a735220383bf16de28b5 @@ -0,0 +1 @@ +x+)JMU01f040031QH,(LN,ӫahxHSO}jI x \ No newline at end of file diff --git a/spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/c4/bd92016dc14b9fe376d9c3f7af1c9d22d44ee4 b/spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/c4/bd92016dc14b9fe376d9c3f7af1c9d22d44ee4 new file mode 100644 index 00000000..284646c2 --- /dev/null +++ b/spring-cloud-config-server/src/test/resources/another-config-repo/git/objects/c4/bd92016dc14b9fe376d9c3f7af1c9d22d44ee4 @@ -0,0 +1,2 @@ +x1 +1Es$ XZyI2](x{77ycYXkp! IȘ)Ɛ$:VU~4QL~ĉ&řFN1iEv/.f}1={.C.'G߻