From 2a3c60feb4ddee4349bf9d3a7ed630ddb6043e70 Mon Sep 17 00:00:00 2001 From: rlynch2 Date: Mon, 24 Oct 2016 17:41:05 -0700 Subject: [PATCH 01/14] Fixed bug which returns incorrect version number on first request after remote repo is updated. --- .../JGitEnvironmentRepository.java | 1 + ...EnvironmentRepositoryIntegrationTests.java | 95 +++++++++++++++++-- 2 files changed, 90 insertions(+), 6 deletions(-) diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java index fefdc8b1..1da604d7 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java @@ -171,6 +171,7 @@ public class JGitEnvironmentRepository extends AbstractScmEnvironmentRepository Ref ref = checkout(git, label); if (shouldPull(git, ref)) { pull(git, label, ref); + ref = git.getRepository().getRef(ref.getName()); if (!isClean(git)) { logger.warn("The local repository is dirty. Reseting it to origin/" diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java index e6a6b940..86ca92ad 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java @@ -16,12 +16,6 @@ package org.springframework.cloud.config.server.environment; -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; - import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -33,8 +27,10 @@ import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.util.Arrays; +import org.eclipse.jgit.api.CheckoutCommand; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.ResetCommand.ResetType; +import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.StoredConfig; import org.eclipse.jgit.util.FileUtils; @@ -51,9 +47,12 @@ import org.springframework.cloud.config.server.test.ConfigServerTestUtils; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import org.springframework.util.FileSystemUtils; import org.springframework.util.ResourceUtils; import org.springframework.util.StreamUtils; +import static org.junit.Assert.*; + /** * @author Dave Syer * @author Roy Clarkson @@ -324,6 +323,90 @@ public class JGitEnvironmentRepositoryIntegrationTests { repository.findOne("bar", "staging", "unknownlabel"); } + @Test + public void testVersionUpdate() throws Exception { + //setup local repository + ConfigServerTestUtils.prepareLocalRepo(); + String uri = ConfigServerTestUtils.copyLocalRepo("config-copy"); + File localRepoFile = ResourceUtils.getFile(uri); + Git localGit = Git.open(localRepoFile.getAbsoluteFile()); + + //setup remote repository + File remoteDir = new File("target/repos/clone"); + if(remoteDir.exists()) { + FileSystemUtils.deleteRecursively(remoteDir); + }else{ + remoteDir.mkdirs(); + } + Git remoteGit = Git.cloneRepository() + .setURI( "file://" + localRepoFile.getAbsolutePath() ) + .setDirectory( remoteDir ) + .setBranch("master") + .setCloneAllBranches(true) + .call(); + StoredConfig config = localGit.getRepository().getConfig(); + config.setString("remote", "origin", "url", + remoteDir.getAbsolutePath()); + config.setString("remote", "origin", "fetch", + "+refs/heads/*:refs/remotes/origin/*"); + config.save(); + + //get commit ids + CheckoutCommand checkout = localGit.checkout(); + checkout.setName("master"); + Ref localRef = checkout.call(); + String localVersion = localRef.getObjectId().getName(); + + checkout = remoteGit.checkout(); + checkout.setName("master"); + Ref remoteRef = checkout.call(); + String remoteVersion = remoteRef.getObjectId().getName(); + + //verify the remote and local repo have the same commit ID + assertEquals(remoteVersion, localVersion); + + //setup our test spring application pointing to the local repo + this.context = new SpringApplicationBuilder(TestConfiguration.class).web(false) + .properties("spring.cloud.config.server.git.uri:" + "file://" + localRepoFile.getAbsolutePath()).run(); + EnvironmentRepository repository = this.context.getBean(EnvironmentRepository.class); + Environment environment = repository.findOne("bar", "staging", "master"); + + //make sure the environments version is the same as the remote repo version + assertEquals(environment.getVersion(), remoteVersion); + + //update the remote repo + FileOutputStream out = new FileOutputStream(remoteDir.getAbsolutePath() + "/bar.properties"); + StreamUtils.copy("foo: foo", Charset.defaultCharset(), out); + remoteGit.add().addFilepattern("bar.properties").call(); + remoteGit.commit().setMessage("Updated for pull").call(); + + //pull the environment again which should update the local repo from the just updated remote repo + environment = repository.findOne("bar", "staging", "master"); + + //do some more check outs to get updated version numbers + checkout = localGit.checkout(); + checkout.setName("master"); + localRef = checkout.call(); + String updatedLocalVersion = localRef.getObjectId().getName(); + + checkout = remoteGit.checkout(); + checkout.setName("master"); + remoteRef = checkout.call(); + String updatedRemoteVersion = remoteRef.getObjectId().getName(); + + //make sure our versions have been updated + assertEquals(updatedRemoteVersion, updatedLocalVersion); + assertNotEquals(updatedRemoteVersion, remoteVersion); + assertNotEquals(updatedLocalVersion, localVersion); + + //make sure our environment also reflects the updated version + //this used to have a bug + assertEquals(environment.getVersion(), updatedRemoteVersion); + + + + } + @Configuration @Import({ PropertyPlaceholderAutoConfiguration.class, EnvironmentRepositoryConfiguration.class }) From d5f4d8ed60aea425c9374ed1ece62abf35cfe37b Mon Sep 17 00:00:00 2001 From: rlynch2 Date: Mon, 24 Oct 2016 17:49:08 -0700 Subject: [PATCH 02/14] Fixed bug which returns incorrect version number on first request after remote repo is updated. Corrected imports. --- ...GitEnvironmentRepositoryIntegrationTests.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java index 86ca92ad..7a16ab5c 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java @@ -16,6 +16,12 @@ package org.springframework.cloud.config.server.environment; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -51,8 +57,6 @@ import org.springframework.util.FileSystemUtils; import org.springframework.util.ResourceUtils; import org.springframework.util.StreamUtils; -import static org.junit.Assert.*; - /** * @author Dave Syer * @author Roy Clarkson @@ -395,13 +399,13 @@ public class JGitEnvironmentRepositoryIntegrationTests { String updatedRemoteVersion = remoteRef.getObjectId().getName(); //make sure our versions have been updated - assertEquals(updatedRemoteVersion, updatedLocalVersion); - assertNotEquals(updatedRemoteVersion, remoteVersion); - assertNotEquals(updatedLocalVersion, localVersion); + Assert.assertEquals(updatedRemoteVersion, updatedLocalVersion); + Assert.assertNotEquals(updatedRemoteVersion, remoteVersion); + Assert.assertNotEquals(updatedLocalVersion, localVersion); //make sure our environment also reflects the updated version //this used to have a bug - assertEquals(environment.getVersion(), updatedRemoteVersion); + Assert.assertEquals(environment.getVersion(), updatedRemoteVersion); From 9300bee308b5f9d290c41175d957c327dd07ea4d Mon Sep 17 00:00:00 2001 From: rlynch2 Date: Mon, 24 Oct 2016 21:50:33 -0700 Subject: [PATCH 03/14] Fixed bug which returns incorrect version number on first request after remote repo is updated. Fixed circleci warnings. --- .../JGitEnvironmentRepositoryIntegrationTests.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java index 7a16ab5c..ec6fac2a 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java @@ -19,6 +19,7 @@ package org.springframework.cloud.config.server.environment; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; @@ -399,13 +400,13 @@ public class JGitEnvironmentRepositoryIntegrationTests { String updatedRemoteVersion = remoteRef.getObjectId().getName(); //make sure our versions have been updated - Assert.assertEquals(updatedRemoteVersion, updatedLocalVersion); - Assert.assertNotEquals(updatedRemoteVersion, remoteVersion); - Assert.assertNotEquals(updatedLocalVersion, localVersion); + assertEquals(updatedRemoteVersion, updatedLocalVersion); + assertNotEquals(updatedRemoteVersion, remoteVersion); + assertNotEquals(updatedLocalVersion, localVersion); //make sure our environment also reflects the updated version //this used to have a bug - Assert.assertEquals(environment.getVersion(), updatedRemoteVersion); + assertEquals(environment.getVersion(), updatedRemoteVersion); From 9df9fbd1ab54589c22b3304fbd1db69e7de132a1 Mon Sep 17 00:00:00 2001 From: rlynch2 Date: Wed, 26 Oct 2016 13:55:33 -0700 Subject: [PATCH 04/14] Adding comment as requested by spring --- .../JGitEnvironmentRepository.java | 3 +- ...EnvironmentRepositoryIntegrationTests.java | 47 ++++++++----------- 2 files changed, 22 insertions(+), 28 deletions(-) diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java index 1da604d7..0857e19b 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java @@ -171,8 +171,9 @@ public class JGitEnvironmentRepository extends AbstractScmEnvironmentRepository Ref ref = checkout(git, label); if (shouldPull(git, ref)) { pull(git, label, ref); + //a pull causes the ref retrieved from the checkout to be invalid + //so refreshing it. ref = git.getRepository().getRef(ref.getName()); - if (!isClean(git)) { logger.warn("The local repository is dirty. Reseting it to origin/" + label + "."); diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java index 233457c2..48fafecf 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java @@ -37,6 +37,7 @@ import java.util.Arrays; import org.eclipse.jgit.api.CheckoutCommand; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.ResetCommand.ResetType; +import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.StoredConfig; @@ -159,7 +160,8 @@ public class JGitEnvironmentRepositoryIntegrationTests { .getBean(JGitEnvironmentRepository.class); // Fetches the repository for the first time. - repository.getLocations("bar", "test", "raw"); + SearchPathLocator.Locations locations = repository.getLocations("bar", "test", "raw"); + assertEquals(locations.getVersion(), commitToRevertBeforePull); // Resets to the original commit. git.reset().setMode(ResetType.HARD).setRef("master").call(); @@ -179,9 +181,10 @@ public class JGitEnvironmentRepositoryIntegrationTests { git.reset().setMode(ResetType.HARD).setRef(commitToRevertBeforePull).call(); // Triggers the repository refresh. - repository.getLocations("bar", "test", "raw"); + locations = repository.getLocations("bar", "test", "raw"); + assertEquals(locations.getVersion(), commitToRevertBeforePull); - Assert.assertTrue("Local repository is not cleaned after retreiving resources.", + Assert.assertTrue("Local repository is not cleaned after retrieving resources.", git.status().call().isClean()); } @@ -359,18 +362,11 @@ public class JGitEnvironmentRepositoryIntegrationTests { config.save(); //get commit ids - CheckoutCommand checkout = localGit.checkout(); - checkout.setName("master"); - Ref localRef = checkout.call(); - String localVersion = localRef.getObjectId().getName(); - - checkout = remoteGit.checkout(); - checkout.setName("master"); - Ref remoteRef = checkout.call(); - String remoteVersion = remoteRef.getObjectId().getName(); + String startingLocalVersion = getCommitID(localGit, "master"); + String startingRemoteVersion = getCommitID(remoteGit, "master"); //verify the remote and local repo have the same commit ID - assertEquals(remoteVersion, localVersion); + assertEquals(startingRemoteVersion, startingLocalVersion); //setup our test spring application pointing to the local repo this.context = new SpringApplicationBuilder(TestConfiguration.class).web(false) @@ -379,7 +375,7 @@ public class JGitEnvironmentRepositoryIntegrationTests { Environment environment = repository.findOne("bar", "staging", "master"); //make sure the environments version is the same as the remote repo version - assertEquals(environment.getVersion(), remoteVersion); + assertEquals(environment.getVersion(), startingRemoteVersion); //update the remote repo FileOutputStream out = new FileOutputStream(remoteDir.getAbsolutePath() + "/bar.properties"); @@ -391,27 +387,24 @@ public class JGitEnvironmentRepositoryIntegrationTests { environment = repository.findOne("bar", "staging", "master"); //do some more check outs to get updated version numbers - checkout = localGit.checkout(); - checkout.setName("master"); - localRef = checkout.call(); - String updatedLocalVersion = localRef.getObjectId().getName(); - - checkout = remoteGit.checkout(); - checkout.setName("master"); - remoteRef = checkout.call(); - String updatedRemoteVersion = remoteRef.getObjectId().getName(); + String updatedLocalVersion = getCommitID(localGit, "master"); + String updatedRemoteVersion = getCommitID(remoteGit, "master"); //make sure our versions have been updated assertEquals(updatedRemoteVersion, updatedLocalVersion); - assertNotEquals(updatedRemoteVersion, remoteVersion); - assertNotEquals(updatedLocalVersion, localVersion); + assertNotEquals(updatedRemoteVersion, startingRemoteVersion); + assertNotEquals(updatedLocalVersion, startingLocalVersion); //make sure our environment also reflects the updated version //this used to have a bug assertEquals(environment.getVersion(), updatedRemoteVersion); + } - - + private String getCommitID(Git git, String label) throws GitAPIException { + CheckoutCommand checkout = git.checkout(); + checkout.setName(label); + Ref localRef = checkout.call(); + return localRef.getObjectId().getName(); } @Configuration From 3292f7190281b349c67f6ac8bcc8da602992e768 Mon Sep 17 00:00:00 2001 From: rlynch2 Date: Wed, 26 Oct 2016 14:02:50 -0700 Subject: [PATCH 05/14] Cleaned up a minor codacy warning. --- .../environment/JGitEnvironmentRepositoryIntegrationTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java index 48fafecf..86681473 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java @@ -184,7 +184,7 @@ public class JGitEnvironmentRepositoryIntegrationTests { locations = repository.getLocations("bar", "test", "raw"); assertEquals(locations.getVersion(), commitToRevertBeforePull); - Assert.assertTrue("Local repository is not cleaned after retrieving resources.", + assertTrue("Local repository is not cleaned after retrieving resources.", git.status().call().isClean()); } From 9a3e58e8fe6088c2de027754ec464fb99c7b02ec Mon Sep 17 00:00:00 2001 From: rlynch2 Date: Thu, 3 Nov 2016 17:38:21 -0700 Subject: [PATCH 06/14] =?UTF-8?q?version=20not=20being=20updated=20on=20fi?= =?UTF-8?q?rst=20request=20New=20remote=20branches=20New=20remote=20tags?= =?UTF-8?q?=20=E2=80=94=20handling=20a=20null=20ref=20in=20should=20pull?= =?UTF-8?q?=20no=20longer=20needed.=20=E2=80=94=20has=20added=20benefit=20?= =?UTF-8?q?of=20ensuring=20the=20local=20repo=20is=20current=20in=20case?= =?UTF-8?q?=20of=20git=20failure.=20Returns=20version=20for=20tags=20New?= =?UTF-8?q?=20starter=20code=20for=20remote=20repo=20testing=20(where=20a?= =?UTF-8?q?=20lot=20of=20the=20complexity=20lies)=20TODO:=20Still=20invest?= =?UTF-8?q?igating=20failure=20of=20pullDirtyRepo.=20=20I=20think=20the=20?= =?UTF-8?q?test=20is=20incorrect=20but=20still=20validating.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JGitEnvironmentRepository.java | 93 ++++++----- .../server/test/ConfigServerTestUtils.java | 11 ++ .../environment/JGitConfigServerTestData.java | 113 +++++++++++++ ...EnvironmentRepositoryIntegrationTests.java | 153 +++++++++++++----- .../JGitEnvironmentRepositoryTests.java | 35 +--- ...ultipleJGitEnvironmentRepositoryTests.java | 2 +- 6 files changed, 294 insertions(+), 113 deletions(-) create mode 100644 spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitConfigServerTestData.java diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java index 0857e19b..3c11fee4 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java @@ -24,22 +24,14 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import org.eclipse.jgit.api.CheckoutCommand; -import org.eclipse.jgit.api.CloneCommand; +import org.eclipse.jgit.api.*; import org.eclipse.jgit.api.CreateBranchCommand.SetupUpstreamMode; -import org.eclipse.jgit.api.FetchCommand; -import org.eclipse.jgit.api.Git; -import org.eclipse.jgit.api.ListBranchCommand; import org.eclipse.jgit.api.ListBranchCommand.ListMode; -import org.eclipse.jgit.api.PullCommand; -import org.eclipse.jgit.api.ResetCommand; import org.eclipse.jgit.api.ResetCommand.ResetType; -import org.eclipse.jgit.api.Status; -import org.eclipse.jgit.api.StatusCommand; -import org.eclipse.jgit.api.TransportCommand; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.RefNotFoundException; import org.eclipse.jgit.lib.Ref; +import org.eclipse.jgit.transport.FetchResult; import org.eclipse.jgit.transport.JschConfigSessionFactory; import org.eclipse.jgit.transport.OpenSshConfig.Host; import org.eclipse.jgit.transport.SshSessionFactory; @@ -60,6 +52,7 @@ import com.jcraft.jsch.Session; * @author Roy Clarkson * @author Marcos Barbero * @author Daniel Lavoie + * @author Ryan Lynch */ public class JGitEnvironmentRepository extends AbstractScmEnvironmentRepository implements EnvironmentRepository, SearchPathLocator, InitializingBean { @@ -141,11 +134,7 @@ public class JGitEnvironmentRepository extends AbstractScmEnvironmentRepository if (label == null) { label = this.defaultLabel; } - Ref ref = refresh(application, label); - String version = null; - if (ref != null) { - version = ref.getObjectId().getName(); - } + String version = refresh(application, label); return new Locations(application, profile, label, version, getSearchLocations(getWorkingDirectory(), application, profile, label)); } @@ -162,27 +151,29 @@ public class JGitEnvironmentRepository extends AbstractScmEnvironmentRepository /** * Get the working directory ready. */ - private Ref refresh(String application, String label) { + private String refresh(String application, String label) { initialize(); Git git = null; try { git = createGitClient(); - git.getRepository().getConfig().setString("branch", label, "merge", label); - Ref ref = checkout(git, label); - if (shouldPull(git, ref)) { - pull(git, label, ref); - //a pull causes the ref retrieved from the checkout to be invalid - //so refreshing it. - ref = git.getRepository().getRef(ref.getName()); - if (!isClean(git)) { - logger.warn("The local repository is dirty. Reseting it to origin/" - + label + "."); - - fetch(git, label, "origin"); - resetHard(git, label, "refs/remotes/origin/" + label); + if (shouldPull(git)) { + fetch(git, label); + checkout(git, label); + if(isBranch(git, label)) { + merge(git, label); + if (!isClean(git)) { + logger.warn("The local repository is dirty. Resetting it to origin/" + + label + "."); + resetHard(git, label, "refs/remotes/origin/" + label); + } } + } - return ref; + else{ + checkout(git, label); + } + //always return what is currently HEAD as the version + return git.getRepository().getRef("HEAD").getObjectId().getName(); } catch (RefNotFoundException e) { throw new NoSuchLabelException("No such label: " + label); @@ -237,7 +228,7 @@ public class JGitEnvironmentRepository extends AbstractScmEnvironmentRepository return checkout.call(); } - /* for testing */ boolean shouldPull(Git git, Ref ref) throws GitAPIException { + /* for testing */ boolean shouldPull(Git git) throws GitAPIException { boolean shouldPull; Status gitStatus = git.status().call(); boolean isWorkingTreeClean = gitStatus.isClean(); @@ -249,7 +240,7 @@ public class JGitEnvironmentRepository extends AbstractScmEnvironmentRepository logDirty(gitStatus); } else { - shouldPull = isWorkingTreeClean && ref != null && originUrl != null; + shouldPull = isWorkingTreeClean && originUrl != null; } if (!isWorkingTreeClean && !this.forcePull) { this.logger.info("Cannot pull from remote " + originUrl @@ -279,33 +270,61 @@ public class JGitEnvironmentRepository extends AbstractScmEnvironmentRepository return isBranch(git, label) && !isLocalBranch(git, label); } - private void fetch(Git git, String label, String remote) { - FetchCommand fetch = git.fetch().setRemote(remote); + private FetchResult fetch(Git git, String label) { + FetchCommand fetch = git.fetch().setRemote("origin"); setTimeout(fetch); try { if (hasText(getUsername())) { setCredentialsProvider(fetch); } - fetch.call(); + FetchResult result = fetch.call(); + if(result.getTrackingRefUpdates() != null && result.getTrackingRefUpdates().size() > 0) { + this.logger.info("Fetched for remote " + label + " and found " + result.getTrackingRefUpdates().size() + + " updates"); + } + return result; } catch (Exception ex) { this.logger.warn("Could not fetch remote for " + label + " remote: " + git .getRepository().getConfig().getString("remote", "origin", "url")); + return null; } } - private void resetHard(Git git, String label, String ref) { + private MergeResult merge(Git git, String label) { + try { + MergeCommand merge = git.merge(); + merge.include(git.getRepository().getRef("origin/" + label)); + MergeResult result = merge.call(); + if(!result.getMergeStatus().isSuccessful()) { + this.logger.warn("Merged from remote " + label + " with result " + result.getMergeStatus()); + } + return result; + } + catch (Exception ex) { + this.logger.warn("Could not merge remote for " + label + " remote: " + git + .getRepository().getConfig().getString("remote", "origin", "url")); + return null; + } + } + + private Ref resetHard(Git git, String label, String ref) { ResetCommand reset = git.reset(); reset.setRef(ref); reset.setMode(ResetType.HARD); try { - reset.call(); + Ref resetRef = reset.call(); + if(resetRef != null) { + this.logger.info("Reset label " + label + " to version " + resetRef.getObjectId()); + } + return resetRef; } catch (Exception ex) { this.logger.warn("Could not reset to remote for " + label + " (current ref=" + ref + "), remote: " + git.getRepository().getConfig() .getString("remote", "origin", "url")); + return null; } } diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/test/ConfigServerTestUtils.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/test/ConfigServerTestUtils.java index 80b4d520..717bc5c7 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/test/ConfigServerTestUtils.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/test/ConfigServerTestUtils.java @@ -19,6 +19,8 @@ import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.RepositoryCache.FileKey; import org.eclipse.jgit.util.FS; import org.eclipse.jgit.util.FileUtils; +import org.springframework.cloud.config.environment.Environment; +import org.springframework.cloud.config.environment.PropertySource; import org.springframework.util.FileSystemUtils; import org.springframework.util.StringUtils; @@ -111,4 +113,13 @@ public class ConfigServerTestUtils { return FileSystemUtils.deleteRecursively(dest); } + public static Object getProperty(Environment env, String sourceNameEndsWith, String property) { + for(PropertySource source: env.getPropertySources()) { + if(source.getName().endsWith(sourceNameEndsWith)) { + return source.getSource().get(property); + } + } + return null; + } + } diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitConfigServerTestData.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitConfigServerTestData.java new file mode 100644 index 00000000..25b36130 --- /dev/null +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitConfigServerTestData.java @@ -0,0 +1,113 @@ +/* + * 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.environment; + + +import org.eclipse.jgit.api.Git; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.cloud.config.server.test.ConfigServerTestUtils; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.util.FileSystemUtils; +import org.springframework.util.ResourceUtils; + +import java.io.File; + +/** + * Class that holds objects that can be used for testing + */ +public class JGitConfigServerTestData { + + public static class LocalGit { + Git git; + File gitWorkingDirectory; + + public LocalGit(Git git, File gitWorkingDirectory) { + this.git = git; + this.gitWorkingDirectory = gitWorkingDirectory; + } + + public Git getGit() { + return this.git; + } + + public File getGitWorkingDirectory() { + return this.gitWorkingDirectory; + } + } + + private LocalGit serverGit; + private LocalGit clonedGit; + private JGitEnvironmentRepository repository; + private ConfigurableApplicationContext context; + + public JGitConfigServerTestData(LocalGit serverGit, LocalGit clonedGit, + JGitEnvironmentRepository repository, ConfigurableApplicationContext context) { + this.serverGit = serverGit; + this.clonedGit = clonedGit; + this.repository = repository; + this.context = context; + } + + public LocalGit getServerGit() { + return this.serverGit; + } + + public LocalGit getClonedGit() { + return this.clonedGit; + } + + public JGitEnvironmentRepository getRepository() { + return this.repository; + } + + public ConfigurableApplicationContext getContext() { + return this.context; + } + + public static JGitConfigServerTestData prepareClonedGitRepository(Object... sources) throws Exception { + //setup remote repository + String remoteUri = ConfigServerTestUtils.prepareLocalRepo(); + File remoteRepoDir = ResourceUtils.getFile(remoteUri); + Git remoteGit = Git.open(remoteRepoDir.getAbsoluteFile()); + remoteGit.checkout().setName("master").call(); + + //setup local repository + File clonedRepoDir = new File("target/repos/cloned"); + if(clonedRepoDir.exists()) { + FileSystemUtils.deleteRecursively(clonedRepoDir); + }else{ + clonedRepoDir.mkdirs(); + } + Git clonedGit = Git.cloneRepository() + .setURI( "file://" + remoteRepoDir.getAbsolutePath() ) + .setDirectory( clonedRepoDir ) + .setBranch("master") + .setCloneAllBranches(true) + .call(); + + //setup our test spring application pointing to the local repo + ConfigurableApplicationContext context = new SpringApplicationBuilder(sources).web(false) + .properties("spring.cloud.config.server.git.uri:" + "file://" + clonedRepoDir.getAbsolutePath()).run(); + JGitEnvironmentRepository repository = context.getBean(JGitEnvironmentRepository.class); + + return new JGitConfigServerTestData( + new JGitConfigServerTestData.LocalGit(remoteGit, remoteRepoDir), + new JGitConfigServerTestData.LocalGit(clonedGit, clonedRepoDir), + repository, context); + } + + +} diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java index 86681473..d2ef0c2f 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java @@ -44,7 +44,6 @@ import org.eclipse.jgit.lib.StoredConfig; import org.eclipse.jgit.util.FileUtils; import org.hamcrest.Matchers; import org.junit.After; -import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; @@ -57,7 +56,6 @@ import org.springframework.cloud.config.server.test.ConfigServerTestUtils; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; -import org.springframework.util.FileSystemUtils; import org.springframework.util.ResourceUtils; import org.springframework.util.StreamUtils; @@ -335,60 +333,30 @@ public class JGitEnvironmentRepositoryIntegrationTests { @Test public void testVersionUpdate() throws Exception { - //setup local repository - ConfigServerTestUtils.prepareLocalRepo(); - String uri = ConfigServerTestUtils.copyLocalRepo("config-copy"); - File localRepoFile = ResourceUtils.getFile(uri); - Git localGit = Git.open(localRepoFile.getAbsoluteFile()); + JGitConfigServerTestData testData = JGitConfigServerTestData.prepareClonedGitRepository(TestConfiguration.class); - //setup remote repository - File remoteDir = new File("target/repos/clone"); - if(remoteDir.exists()) { - FileSystemUtils.deleteRecursively(remoteDir); - }else{ - remoteDir.mkdirs(); - } - Git remoteGit = Git.cloneRepository() - .setURI( "file://" + localRepoFile.getAbsolutePath() ) - .setDirectory( remoteDir ) - .setBranch("master") - .setCloneAllBranches(true) - .call(); - StoredConfig config = localGit.getRepository().getConfig(); - config.setString("remote", "origin", "url", - remoteDir.getAbsolutePath()); - config.setString("remote", "origin", "fetch", - "+refs/heads/*:refs/remotes/origin/*"); - config.save(); + //get our starting versions + String startingLocalVersion = getCommitID(testData.getClonedGit().getGit(), "master"); + String startingRemoteVersion = getCommitID(testData.getServerGit().getGit(), "master"); - //get commit ids - String startingLocalVersion = getCommitID(localGit, "master"); - String startingRemoteVersion = getCommitID(remoteGit, "master"); - - //verify the remote and local repo have the same commit ID - assertEquals(startingRemoteVersion, startingLocalVersion); - - //setup our test spring application pointing to the local repo - this.context = new SpringApplicationBuilder(TestConfiguration.class).web(false) - .properties("spring.cloud.config.server.git.uri:" + "file://" + localRepoFile.getAbsolutePath()).run(); - EnvironmentRepository repository = this.context.getBean(EnvironmentRepository.class); - Environment environment = repository.findOne("bar", "staging", "master"); + //make sure we get the right version out of the gate + Environment environment = testData.getRepository().findOne("bar", "staging", "master"); //make sure the environments version is the same as the remote repo version assertEquals(environment.getVersion(), startingRemoteVersion); //update the remote repo - FileOutputStream out = new FileOutputStream(remoteDir.getAbsolutePath() + "/bar.properties"); + FileOutputStream out = new FileOutputStream(new File(testData.getServerGit().getGitWorkingDirectory(), "bar.properties")); StreamUtils.copy("foo: foo", Charset.defaultCharset(), out); - remoteGit.add().addFilepattern("bar.properties").call(); - remoteGit.commit().setMessage("Updated for pull").call(); + testData.getServerGit().getGit().add().addFilepattern("bar.properties").call(); + testData.getServerGit().getGit().commit().setMessage("Updated for pull").call(); //pull the environment again which should update the local repo from the just updated remote repo - environment = repository.findOne("bar", "staging", "master"); + environment = testData.getRepository().findOne("bar", "staging", "master"); //do some more check outs to get updated version numbers - String updatedLocalVersion = getCommitID(localGit, "master"); - String updatedRemoteVersion = getCommitID(remoteGit, "master"); + String updatedLocalVersion = getCommitID(testData.getClonedGit().getGit(), "master"); + String updatedRemoteVersion = getCommitID(testData.getClonedGit().getGit(), "master"); //make sure our versions have been updated assertEquals(updatedRemoteVersion, updatedLocalVersion); @@ -400,6 +368,103 @@ public class JGitEnvironmentRepositoryIntegrationTests { assertEquals(environment.getVersion(), updatedRemoteVersion); } + @Test + public void testNewRemoteBranch() throws Exception { + JGitConfigServerTestData testData = JGitConfigServerTestData.prepareClonedGitRepository(TestConfiguration.class); + + Environment environment = testData.getRepository().findOne("bar", "staging", "master"); + Object fooProperty = ConfigServerTestUtils.getProperty(environment, "bar.properties", "foo"); + assertEquals(fooProperty, "bar"); + + testData.getServerGit().getGit().branchCreate() + .setName("testNewRemoteBranch") + .call(); + + testData.getServerGit().getGit().checkout() + .setName("testNewRemoteBranch") + .call(); + + //update the remote repo + FileOutputStream out = new FileOutputStream( + new File(testData.getServerGit().getGitWorkingDirectory(), "/bar.properties")); + StreamUtils.copy("foo: branchBar", Charset.defaultCharset(), out); + testData.getServerGit().getGit().add().addFilepattern("bar.properties").call(); + testData.getServerGit().getGit().commit().setMessage("Updated for branch test").call(); + + environment = testData.getRepository().findOne("bar", "staging", "testNewRemoteBranch"); + fooProperty = ConfigServerTestUtils.getProperty(environment, "bar.properties", "foo"); + assertEquals(fooProperty, "branchBar"); + } + + @Test + public void testNewRemoteTag() throws Exception { + JGitConfigServerTestData testData = JGitConfigServerTestData.prepareClonedGitRepository(TestConfiguration.class); + + Git serverGit = testData.getServerGit().getGit(); + + Environment environment = testData.getRepository().findOne("bar", "staging", "master"); + Object fooProperty = ConfigServerTestUtils.getProperty(environment, "bar.properties", "foo"); + assertEquals(fooProperty, "bar"); + + serverGit.checkout().setName("master").call(); + + //create a new tag + serverGit.tag().setName("testTag").setMessage("Testing a tag").call(); + + //update the remote repo + FileOutputStream out = new FileOutputStream( + new File(testData.getServerGit().getGitWorkingDirectory(), "/bar.properties")); + StreamUtils.copy("foo: testAfterTag", Charset.defaultCharset(), out); + testData.getServerGit().getGit().add().addFilepattern("bar.properties").call(); + testData.getServerGit().getGit().commit().setMessage("Updated for branch test").call(); + + environment = testData.getRepository().findOne("bar", "staging", "master"); + fooProperty = ConfigServerTestUtils.getProperty(environment, "bar.properties", "foo"); + assertEquals(fooProperty, "testAfterTag"); + + environment = testData.getRepository().findOne("bar", "staging", "testTag"); + fooProperty = ConfigServerTestUtils.getProperty(environment, "bar.properties", "foo"); + assertEquals(fooProperty, "bar"); + } + + @Test + public void testNewCommitID() throws Exception { + JGitConfigServerTestData testData = JGitConfigServerTestData.prepareClonedGitRepository(TestConfiguration.class); + + //get our starting versions + String startingRemoteVersion = getCommitID(testData.getServerGit().getGit(), "master"); + + //make sure we get the right version out of the gate + Environment environment = testData.getRepository().findOne("bar", "staging", "master"); + assertEquals(environment.getVersion(), startingRemoteVersion); + + //update the remote repo + FileOutputStream out = new FileOutputStream(new File(testData.getServerGit().getGitWorkingDirectory(), "bar.properties")); + StreamUtils.copy("foo: barNewCommit", Charset.defaultCharset(), out); + testData.getServerGit().getGit().add().addFilepattern("bar.properties").call(); + testData.getServerGit().getGit().commit().setMessage("Updated for pull").call(); + String updatedRemoteVersion = getCommitID(testData.getServerGit().getGit(), "master"); + + //do a normal request and verify we get the new version + environment = testData.getRepository().findOne("bar", "staging", "master"); + assertEquals(environment.getVersion(), updatedRemoteVersion); + Object fooProperty = ConfigServerTestUtils.getProperty(environment, "bar.properties", "foo"); + assertEquals(fooProperty, "barNewCommit"); + + //request the prior commit ID and make sure we get it + environment = testData.getRepository().findOne("bar", "staging", startingRemoteVersion); + assertEquals(environment.getVersion(), startingRemoteVersion); + fooProperty = ConfigServerTestUtils.getProperty(environment, "bar.properties", "foo"); + assertEquals(fooProperty, "bar"); + } + + + @Test(expected = NoSuchLabelException.class) + public void testUnknownLabelWithRemote() throws Exception { + JGitConfigServerTestData testData = JGitConfigServerTestData.prepareClonedGitRepository(TestConfiguration.class); + testData.getRepository().findOne("bar", "staging", "BADLabel"); + } + private String getCommitID(Git git, String label) throws GitAPIException { CheckoutCommand checkout = git.checkout(); checkout.setName(label); diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java index 197439aa..de18087b 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java @@ -139,8 +139,7 @@ public class JGitEnvironmentRepositoryTests { assertEquals(2, environment.getPropertySources().size()); assertEquals(this.repository.getUri() + "/bar.properties", environment .getPropertySources().get(0).getName()); - //TODO: why is the version null in tag? - assertNull("version was not null", environment.getVersion()); + assertVersion(environment); } @Test @@ -253,41 +252,16 @@ public class JGitEnvironmentRepositoryTests { this.environment); repo.setForcePull(true); - boolean shouldPull = repo.shouldPull(git, null); + boolean shouldPull = repo.shouldPull(git); assertThat("shouldPull was false", shouldPull, is(true)); } - @Test - public void shouldPullForcepullClean() throws Exception { - Git git = mock(Git.class); - StatusCommand statusCommand = mock(StatusCommand.class); - Status status = mock(Status.class); - Repository repository = mock(Repository.class); - StoredConfig storedConfig = mock(StoredConfig.class); - - when(git.status()).thenReturn(statusCommand); - when(git.getRepository()).thenReturn(repository); - when(repository.getConfig()).thenReturn(storedConfig); - when(storedConfig.getString("remote", "origin", "url")).thenReturn("http://example/git"); - when(statusCommand.call()).thenReturn(status); - when(status.isClean()).thenReturn(true); - - JGitEnvironmentRepository repo = new JGitEnvironmentRepository( - this.environment); - repo.setForcePull(true); - - boolean shouldPull = repo.shouldPull(git, null); - - assertThat("shouldPull was true", shouldPull, is(false)); - } - @Test public void shouldPullNotClean() throws Exception { Git git = mock(Git.class); StatusCommand statusCommand = mock(StatusCommand.class); Status status = mock(Status.class); - Ref ref = mock(Ref.class); Repository repository = mock(Repository.class); StoredConfig storedConfig = mock(StoredConfig.class); @@ -301,7 +275,7 @@ public class JGitEnvironmentRepositoryTests { JGitEnvironmentRepository repo = new JGitEnvironmentRepository( this.environment); - boolean shouldPull = repo.shouldPull(git, ref); + boolean shouldPull = repo.shouldPull(git); assertThat("shouldPull was true", shouldPull, is(false)); } @@ -311,7 +285,6 @@ public class JGitEnvironmentRepositoryTests { Git git = mock(Git.class); StatusCommand statusCommand = mock(StatusCommand.class); Status status = mock(Status.class); - Ref ref = mock(Ref.class); Repository repository = mock(Repository.class); StoredConfig storedConfig = mock(StoredConfig.class); @@ -325,7 +298,7 @@ public class JGitEnvironmentRepositoryTests { JGitEnvironmentRepository repo = new JGitEnvironmentRepository( this.environment); - boolean shouldPull = repo.shouldPull(git, ref); + boolean shouldPull = repo.shouldPull(git); assertThat("shouldPull was false", shouldPull, is(true)); } diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/MultipleJGitEnvironmentRepositoryTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/MultipleJGitEnvironmentRepositoryTests.java index 9649881f..5a38a50c 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/MultipleJGitEnvironmentRepositoryTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/MultipleJGitEnvironmentRepositoryTests.java @@ -109,7 +109,7 @@ public class MultipleJGitEnvironmentRepositoryTests { assertEquals(2, environment.getPropertySources().size()); assertEquals(this.repository.getUri() + "/bar.properties", environment .getPropertySources().get(0).getName()); - assertNull("version was not null", environment.getVersion()); + assertVersion(environment); } @Test From 25a6e2d58da9de8ef8857ce8f55959c251944366 Mon Sep 17 00:00:00 2001 From: rlynch2 Date: Thu, 3 Nov 2016 17:46:35 -0700 Subject: [PATCH 07/14] =?UTF-8?q?version=20not=20being=20updated=20on=20fi?= =?UTF-8?q?rst=20request=20after=20update=20(including=20due=20to=20hard?= =?UTF-8?q?=20resets)=20New=20remote=20branches=20New=20remote=20tags=20?= =?UTF-8?q?=E2=80=94=20handling=20a=20null=20ref=20in=20should=20pull=20no?= =?UTF-8?q?=20longer=20needed.=20=E2=80=94=20has=20added=20benefit=20of=20?= =?UTF-8?q?ensuring=20the=20local=20repo=20is=20current=20in=20case=20of?= =?UTF-8?q?=20git=20failure.=20Returns=20version=20for=20tags=20(version?= =?UTF-8?q?=20was=20null=20before=20this=20change)=20New=20starter=20code?= =?UTF-8?q?=20for=20remote=20repo=20testing=20(where=20a=20lot=20of=20the?= =?UTF-8?q?=20complexity=20lies)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JGitEnvironmentRepositoryIntegrationTests.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java index d2ef0c2f..6430b67d 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java @@ -174,13 +174,15 @@ public class JGitEnvironmentRepositoryIntegrationTests { git.add().addFilepattern(".").call(); git.commit().setMessage("Conflicting commit.").call(); git.push().setForce(true).call(); + String conflictingCommit = git.log().setMaxCount(1).call().iterator() + .next().getName(); // Reset to the raw branch. git.reset().setMode(ResetType.HARD).setRef(commitToRevertBeforePull).call(); // Triggers the repository refresh. locations = repository.getLocations("bar", "test", "raw"); - assertEquals(locations.getVersion(), commitToRevertBeforePull); + assertEquals(locations.getVersion(), conflictingCommit); assertTrue("Local repository is not cleaned after retrieving resources.", git.status().call().isClean()); From e88f12b57451bc5959c24b3c65ba05d00e8df2d8 Mon Sep 17 00:00:00 2001 From: rlynch2 Date: Thu, 3 Nov 2016 22:26:29 -0700 Subject: [PATCH 08/14] =?UTF-8?q?version=20not=20being=20updated=20on=20fi?= =?UTF-8?q?rst=20request=20after=20update=20(including=20due=20to=20hard?= =?UTF-8?q?=20resets)=20New=20remote=20branches=20New=20remote=20tags=20?= =?UTF-8?q?=E2=80=94=20handling=20a=20null=20ref=20in=20should=20pull=20no?= =?UTF-8?q?=20longer=20needed.=20=E2=80=94=20has=20added=20benefit=20of=20?= =?UTF-8?q?ensuring=20the=20local=20repo=20is=20current=20in=20case=20of?= =?UTF-8?q?=20git=20failure.=20Returns=20version=20for=20tags=20(version?= =?UTF-8?q?=20was=20null=20before=20this=20change)=20New=20starter=20code?= =?UTF-8?q?=20for=20remote=20repo=20testing=20(where=20a=20lot=20of=20the?= =?UTF-8?q?=20complexity=20lies)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JGitEnvironmentRepository.java | 42 +++++++------------ .../environment/JGitConfigServerTestData.java | 1 + ...EnvironmentRepositoryIntegrationTests.java | 1 + .../JGitEnvironmentRepositoryTests.java | 2 - 4 files changed, 18 insertions(+), 28 deletions(-) diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java index 3c11fee4..57eea416 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java @@ -24,10 +24,20 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import org.eclipse.jgit.api.*; +import org.eclipse.jgit.api.CheckoutCommand; +import org.eclipse.jgit.api.CloneCommand; import org.eclipse.jgit.api.CreateBranchCommand.SetupUpstreamMode; +import org.eclipse.jgit.api.FetchCommand; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.ListBranchCommand; import org.eclipse.jgit.api.ListBranchCommand.ListMode; +import org.eclipse.jgit.api.MergeCommand; +import org.eclipse.jgit.api.MergeResult; +import org.eclipse.jgit.api.ResetCommand; import org.eclipse.jgit.api.ResetCommand.ResetType; +import org.eclipse.jgit.api.Status; +import org.eclipse.jgit.api.StatusCommand; +import org.eclipse.jgit.api.TransportCommand; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.RefNotFoundException; import org.eclipse.jgit.lib.Ref; @@ -157,10 +167,12 @@ public class JGitEnvironmentRepository extends AbstractScmEnvironmentRepository try { git = createGitClient(); if (shouldPull(git)) { - fetch(git, label); + FetchResult fetchResult = fetch(git, label); + //checkout after fetch so we can get any new branches, tags, ect. checkout(git, label); if(isBranch(git, label)) { - merge(git, label); + //merge results from fetch + MergeResult mergeResult = merge(git, label); if (!isClean(git)) { logger.warn("The local repository is dirty. Resetting it to origin/" + label + "."); @@ -170,6 +182,7 @@ public class JGitEnvironmentRepository extends AbstractScmEnvironmentRepository } else{ + //nothing to update so just checkout checkout(git, label); } //always return what is currently HEAD as the version @@ -328,29 +341,6 @@ public class JGitEnvironmentRepository extends AbstractScmEnvironmentRepository } } - /** - * Assumes we are on a tracking branch (should be safe) - */ - private void pull(Git git, String label, Ref ref) { - PullCommand pull = git.pull(); - setTimeout(pull); - try { - if (hasText(getUsername())) { - setCredentialsProvider(pull); - } - pull.call(); - } - catch (Exception e) { - this.logger - .warn("Could not pull remote for " + label + " (current ref=" + ref - + "), remote: " - + git.getRepository().getConfig().getString("remote", - "origin", "url") - + ", cause: (" + e.getClass().getSimpleName() + ") " - + e.getMessage()); - } - } - private Git createGitClient() throws IOException, GitAPIException { if (new File(getBasedir(), ".git").exists()) { return openGitRepository(); diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitConfigServerTestData.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitConfigServerTestData.java index 25b36130..959e1247 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitConfigServerTestData.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitConfigServerTestData.java @@ -27,6 +27,7 @@ import java.io.File; /** * Class that holds objects that can be used for testing + * @author Ryan Lynch */ public class JGitConfigServerTestData { diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java index 6430b67d..eb2047b6 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java @@ -63,6 +63,7 @@ import org.springframework.util.StreamUtils; * @author Dave Syer * @author Roy Clarkson * @author Daniel Lavoie + * @author Ryan Lynch */ public class JGitEnvironmentRepositoryIntegrationTests { diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java index de18087b..fb444f44 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java @@ -23,7 +23,6 @@ import org.eclipse.jgit.api.CloneCommand; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.Status; import org.eclipse.jgit.api.StatusCommand; -import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.StoredConfig; import org.eclipse.jgit.util.FileUtils; @@ -36,7 +35,6 @@ import org.springframework.core.env.StandardEnvironment; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; From 904bfc37c68f6afa21b0665dfe8bffb26151fc56 Mon Sep 17 00:00:00 2001 From: rlynch2 Date: Thu, 3 Nov 2016 22:54:15 -0700 Subject: [PATCH 09/14] fixed bad IDE formatting --- .../server/environment/JGitEnvironmentRepository.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java index 57eea416..575db618 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java @@ -168,11 +168,11 @@ public class JGitEnvironmentRepository extends AbstractScmEnvironmentRepository git = createGitClient(); if (shouldPull(git)) { FetchResult fetchResult = fetch(git, label); - //checkout after fetch so we can get any new branches, tags, ect. + //checkout after fetch so we can get any new branches, tags, ect. checkout(git, label); if(isBranch(git, label)) { - //merge results from fetch - MergeResult mergeResult = merge(git, label); + //merge results from fetch + MergeResult mergeResult = merge(git, label); if (!isClean(git)) { logger.warn("The local repository is dirty. Resetting it to origin/" + label + "."); @@ -182,7 +182,7 @@ public class JGitEnvironmentRepository extends AbstractScmEnvironmentRepository } else{ - //nothing to update so just checkout + //nothing to update so just checkout checkout(git, label); } //always return what is currently HEAD as the version From 33649fde53c3b46e43e3e7edebd526847fb6c5b8 Mon Sep 17 00:00:00 2001 From: rlynch2 Date: Fri, 4 Nov 2016 12:46:48 -0700 Subject: [PATCH 10/14] Fixed codacy warnings/errors and added unit tests to test exception scenarios and increase code coverage. --- .../JGitEnvironmentRepository.java | 12 +- .../environment/JGitConfigServerTestData.java | 14 +- .../JGitEnvironmentRepositoryTests.java | 199 +++++++++++++++++- 3 files changed, 204 insertions(+), 21 deletions(-) diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java index 57eea416..fc27e916 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java @@ -144,7 +144,7 @@ public class JGitEnvironmentRepository extends AbstractScmEnvironmentRepository if (label == null) { label = this.defaultLabel; } - String version = refresh(application, label); + String version = refresh(label); return new Locations(application, profile, label, version, getSearchLocations(getWorkingDirectory(), application, profile, label)); } @@ -161,25 +161,24 @@ public class JGitEnvironmentRepository extends AbstractScmEnvironmentRepository /** * Get the working directory ready. */ - private String refresh(String application, String label) { + private String refresh(String label) { initialize(); Git git = null; try { git = createGitClient(); if (shouldPull(git)) { - FetchResult fetchResult = fetch(git, label); + fetch(git, label); //checkout after fetch so we can get any new branches, tags, ect. checkout(git, label); if(isBranch(git, label)) { //merge results from fetch - MergeResult mergeResult = merge(git, label); + merge(git, label); if (!isClean(git)) { logger.warn("The local repository is dirty. Resetting it to origin/" + label + "."); resetHard(git, label, "refs/remotes/origin/" + label); } } - } else{ //nothing to update so just checkout @@ -241,7 +240,8 @@ public class JGitEnvironmentRepository extends AbstractScmEnvironmentRepository return checkout.call(); } - /* for testing */ boolean shouldPull(Git git) throws GitAPIException { + + public /*public for testing*/ boolean shouldPull(Git git) throws GitAPIException { boolean shouldPull; Status gitStatus = git.status().call(); boolean isWorkingTreeClean = gitStatus.isClean(); diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitConfigServerTestData.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitConfigServerTestData.java index 959e1247..dc4c06fd 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitConfigServerTestData.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitConfigServerTestData.java @@ -31,9 +31,14 @@ import java.io.File; */ public class JGitConfigServerTestData { + private LocalGit serverGit; + private LocalGit clonedGit; + private JGitEnvironmentRepository repository; + private ConfigurableApplicationContext context; + public static class LocalGit { - Git git; - File gitWorkingDirectory; + private Git git; + private File gitWorkingDirectory; public LocalGit(Git git, File gitWorkingDirectory) { this.git = git; @@ -49,11 +54,6 @@ public class JGitConfigServerTestData { } } - private LocalGit serverGit; - private LocalGit clonedGit; - private JGitEnvironmentRepository repository; - private ConfigurableApplicationContext context; - public JGitConfigServerTestData(LocalGit serverGit, LocalGit clonedGit, JGitEnvironmentRepository repository, ConfigurableApplicationContext context) { this.serverGit = serverGit; diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java index fb444f44..78c7eb2e 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java @@ -18,16 +18,23 @@ package org.springframework.cloud.config.server.environment; import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; -import org.eclipse.jgit.api.CloneCommand; -import org.eclipse.jgit.api.Git; -import org.eclipse.jgit.api.Status; -import org.eclipse.jgit.api.StatusCommand; +import org.eclipse.jgit.api.*; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.api.errors.InvalidRemoteException; +import org.eclipse.jgit.api.errors.NotMergedException; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.StoredConfig; +import org.eclipse.jgit.transport.FetchResult; import org.eclipse.jgit.util.FileUtils; import org.junit.Before; import org.junit.Test; +import org.mockito.internal.matchers.Any; import org.springframework.cloud.config.environment.Environment; import org.springframework.cloud.config.server.test.ConfigServerTestUtils; import org.springframework.core.env.StandardEnvironment; @@ -39,10 +46,7 @@ import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; +import static org.mockito.Mockito.*; /** * @author Dave Syer @@ -301,6 +305,185 @@ public class JGitEnvironmentRepositoryTests { assertThat("shouldPull was false", shouldPull, is(true)); } + @Test + public void testFetchException() throws Exception { + + Git git = mock(Git.class); + CloneCommand cloneCommand = mock(CloneCommand.class); + MockGitFactory factory = new MockGitFactory(git, cloneCommand); + JGitEnvironmentRepository repo = new JGitEnvironmentRepository( + this.environment); + this.repository.setGitFactory(factory); + + //refresh()->shouldPull + StatusCommand statusCommand = mock(StatusCommand.class); + Status status = mock(Status.class); + when(git.status()).thenReturn(statusCommand); + Repository repository = mock(Repository.class); + when(git.getRepository()).thenReturn(repository); + StoredConfig storedConfig = mock(StoredConfig.class); + when(repository.getConfig()).thenReturn(storedConfig); + when(storedConfig.getString("remote", "origin", "url")).thenReturn("http://example/git"); + when(statusCommand.call()).thenReturn(status); + when(status.isClean()).thenReturn(true); + + //refresh()->fetch + FetchCommand fetchCommand = mock(FetchCommand.class); + FetchResult fetchResult = mock(FetchResult.class); + when(git.fetch()).thenReturn(fetchCommand); + when(fetchCommand.setRemote(anyString())).thenReturn(fetchCommand); + when(fetchCommand.call()).thenThrow(new InvalidRemoteException("invalid mock remote")); //here is our exception we are testing + + //refresh()->checkout + CheckoutCommand checkoutCommand = mock(CheckoutCommand.class); + //refresh()->checkout->containsBranch + ListBranchCommand listBranchCommand = mock(ListBranchCommand.class); + when(git.checkout()).thenReturn(checkoutCommand); + when(git.branchList()).thenReturn(listBranchCommand); + List refs = new ArrayList<>(); + Ref ref = mock(Ref.class); + refs.add(ref); + when(ref.getName()).thenReturn("/master"); + when(listBranchCommand.call()).thenReturn(refs); + + //refresh()->merge + MergeCommand mergeCommand = mock(MergeCommand.class); + when(git.merge()).thenReturn(mergeCommand); + when(mergeCommand.call()).thenThrow(new NotMergedException()); //here is our exception we are testing + + //refresh()->return git.getRepository().getRef("HEAD").getObjectId().getName(); + Ref headRef = mock(Ref.class); + when(repository.getRef(anyString())).thenReturn(headRef); + + ObjectId newObjectId = ObjectId.fromRaw(new int[]{1,2,3,4,5}); + when(headRef.getObjectId()).thenReturn(newObjectId); + + SearchPathLocator.Locations locations = this.repository.getLocations("bar", "staging", null); + assertEquals(locations.getVersion(),newObjectId.getName()); + } + + + @Test + public void testMergeException() throws Exception { + + Git git = mock(Git.class); + CloneCommand cloneCommand = mock(CloneCommand.class); + MockGitFactory factory = new MockGitFactory(git, cloneCommand); + JGitEnvironmentRepository repo = new JGitEnvironmentRepository( + this.environment); + this.repository.setGitFactory(factory); + + //refresh()->shouldPull + StatusCommand statusCommand = mock(StatusCommand.class); + Status status = mock(Status.class); + when(git.status()).thenReturn(statusCommand); + Repository repository = mock(Repository.class); + when(git.getRepository()).thenReturn(repository); + StoredConfig storedConfig = mock(StoredConfig.class); + when(repository.getConfig()).thenReturn(storedConfig); + when(storedConfig.getString("remote", "origin", "url")).thenReturn("http://example/git"); + when(statusCommand.call()).thenReturn(status); + when(status.isClean()).thenReturn(true); + + //refresh()->fetch + FetchCommand fetchCommand = mock(FetchCommand.class); + FetchResult fetchResult = mock(FetchResult.class); + when(git.fetch()).thenReturn(fetchCommand); + when(fetchCommand.setRemote(anyString())).thenReturn(fetchCommand); + when(fetchCommand.call()).thenReturn(fetchResult); + when(fetchResult.getTrackingRefUpdates()).thenReturn(Collections.EMPTY_LIST); + + //refresh()->checkout + CheckoutCommand checkoutCommand = mock(CheckoutCommand.class); + //refresh()->checkout->containsBranch + ListBranchCommand listBranchCommand = mock(ListBranchCommand.class); + when(git.checkout()).thenReturn(checkoutCommand); + when(git.branchList()).thenReturn(listBranchCommand); + List refs = new ArrayList<>(); + Ref ref = mock(Ref.class); + refs.add(ref); + when(ref.getName()).thenReturn("/master"); + when(listBranchCommand.call()).thenReturn(refs); + + //refresh()->merge + MergeCommand mergeCommand = mock(MergeCommand.class); + when(git.merge()).thenReturn(mergeCommand); + when(mergeCommand.call()).thenThrow(new NotMergedException()); //here is our exception we are testing + + //refresh()->return git.getRepository().getRef("HEAD").getObjectId().getName(); + Ref headRef = mock(Ref.class); + when(repository.getRef(anyString())).thenReturn(headRef); + + ObjectId newObjectId = ObjectId.fromRaw(new int[]{1,2,3,4,5}); + when(headRef.getObjectId()).thenReturn(newObjectId); + + SearchPathLocator.Locations locations = this.repository.getLocations("bar", "staging", "master"); + assertEquals(locations.getVersion(),newObjectId.getName()); + } + + @Test + public void testResetHardException() throws Exception { + + Git git = mock(Git.class); + CloneCommand cloneCommand = mock(CloneCommand.class); + MockGitFactory factory = new MockGitFactory(git, cloneCommand); + JGitEnvironmentRepository repo = new JGitEnvironmentRepository( + this.environment); + this.repository.setGitFactory(factory); + + //refresh()->shouldPull + StatusCommand statusCommand = mock(StatusCommand.class); + Status status = mock(Status.class); + when(git.status()).thenReturn(statusCommand); + Repository repository = mock(Repository.class); + when(git.getRepository()).thenReturn(repository); + StoredConfig storedConfig = mock(StoredConfig.class); + when(repository.getConfig()).thenReturn(storedConfig); + when(storedConfig.getString("remote", "origin", "url")).thenReturn("http://example/git"); + when(statusCommand.call()).thenReturn(status); + when(status.isClean()).thenReturn(true).thenReturn(false); + + //refresh()->fetch + FetchCommand fetchCommand = mock(FetchCommand.class); + FetchResult fetchResult = mock(FetchResult.class); + when(git.fetch()).thenReturn(fetchCommand); + when(fetchCommand.setRemote(anyString())).thenReturn(fetchCommand); + when(fetchCommand.call()).thenReturn(fetchResult); + when(fetchResult.getTrackingRefUpdates()).thenReturn(Collections.EMPTY_LIST); + + //refresh()->checkout + CheckoutCommand checkoutCommand = mock(CheckoutCommand.class); + //refresh()->checkout->containsBranch + ListBranchCommand listBranchCommand = mock(ListBranchCommand.class); + when(git.checkout()).thenReturn(checkoutCommand); + when(git.branchList()).thenReturn(listBranchCommand); + List refs = new ArrayList<>(); + Ref ref = mock(Ref.class); + refs.add(ref); + when(ref.getName()).thenReturn("/master"); + when(listBranchCommand.call()).thenReturn(refs); + + //refresh()->merge + MergeCommand mergeCommand = mock(MergeCommand.class); + when(git.merge()).thenReturn(mergeCommand); + when(mergeCommand.call()).thenThrow(new NotMergedException()); //here is our exception we are testing + + //refresh()->hardReset + ResetCommand resetCommand = mock(ResetCommand.class); + when(git.reset()).thenReturn(resetCommand); + when(resetCommand.call()).thenReturn(ref); + + //refresh()->return git.getRepository().getRef("HEAD").getObjectId().getName(); + Ref headRef = mock(Ref.class); + when(repository.getRef(anyString())).thenReturn(headRef); + + ObjectId newObjectId = ObjectId.fromRaw(new int[]{1,2,3,4,5}); + when(headRef.getObjectId()).thenReturn(newObjectId); + + SearchPathLocator.Locations locations = this.repository.getLocations("bar", "staging", "master"); + assertEquals(locations.getVersion(),newObjectId.getName()); + } + class MockGitFactory extends JGitEnvironmentRepository.JGitFactory { private Git mockGit; From 09377f38b89a591d5e56ed30c8bd7cebde17bb72 Mon Sep 17 00:00:00 2001 From: rlynch2 Date: Fri, 4 Nov 2016 12:59:18 -0700 Subject: [PATCH 11/14] Fixed codacy warnings/errors. --- .../server/environment/JGitEnvironmentRepositoryTests.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java index 78c7eb2e..9e7deabe 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java @@ -23,7 +23,6 @@ import java.util.Collections; import java.util.List; import org.eclipse.jgit.api.*; -import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.InvalidRemoteException; import org.eclipse.jgit.api.errors.NotMergedException; import org.eclipse.jgit.lib.ObjectId; @@ -34,7 +33,6 @@ import org.eclipse.jgit.transport.FetchResult; import org.eclipse.jgit.util.FileUtils; import org.junit.Before; import org.junit.Test; -import org.mockito.internal.matchers.Any; import org.springframework.cloud.config.environment.Environment; import org.springframework.cloud.config.server.test.ConfigServerTestUtils; import org.springframework.core.env.StandardEnvironment; @@ -329,7 +327,6 @@ public class JGitEnvironmentRepositoryTests { //refresh()->fetch FetchCommand fetchCommand = mock(FetchCommand.class); - FetchResult fetchResult = mock(FetchResult.class); when(git.fetch()).thenReturn(fetchCommand); when(fetchCommand.setRemote(anyString())).thenReturn(fetchCommand); when(fetchCommand.call()).thenThrow(new InvalidRemoteException("invalid mock remote")); //here is our exception we are testing From 588870ca5f09b89b7ca7ca83801caf02c7e03f62 Mon Sep 17 00:00:00 2001 From: rlynch2 Date: Fri, 4 Nov 2016 13:04:57 -0700 Subject: [PATCH 12/14] Fixed codacy warnings/errors. --- .../server/environment/JGitEnvironmentRepository.java | 10 +++++----- .../environment/JGitEnvironmentRepositoryTests.java | 11 ++++++++++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java index fc27e916..0cbba345 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java @@ -167,12 +167,12 @@ public class JGitEnvironmentRepository extends AbstractScmEnvironmentRepository try { git = createGitClient(); if (shouldPull(git)) { - fetch(git, label); - //checkout after fetch so we can get any new branches, tags, ect. + fetch(git, label);:wQ + //checkout after fetch so we can get any new branches, tags, ect. checkout(git, label); if(isBranch(git, label)) { - //merge results from fetch - merge(git, label); + //merge results from fetch + merge(git, label); if (!isClean(git)) { logger.warn("The local repository is dirty. Resetting it to origin/" + label + "."); @@ -181,7 +181,7 @@ public class JGitEnvironmentRepository extends AbstractScmEnvironmentRepository } } else{ - //nothing to update so just checkout + //nothing to update so just checkout checkout(git, label); } //always return what is currently HEAD as the version diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java index 9e7deabe..3cd66c5e 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryTests.java @@ -22,7 +22,16 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import org.eclipse.jgit.api.*; + +import org.eclipse.jgit.api.CheckoutCommand; +import org.eclipse.jgit.api.CloneCommand; +import org.eclipse.jgit.api.FetchCommand; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.ListBranchCommand; +import org.eclipse.jgit.api.MergeCommand; +import org.eclipse.jgit.api.ResetCommand; +import org.eclipse.jgit.api.Status; +import org.eclipse.jgit.api.StatusCommand; import org.eclipse.jgit.api.errors.InvalidRemoteException; import org.eclipse.jgit.api.errors.NotMergedException; import org.eclipse.jgit.lib.ObjectId; From 01698dd99867f9937d382a705a672f8a773c9e5d Mon Sep 17 00:00:00 2001 From: rlynch2 Date: Sat, 5 Nov 2016 15:59:42 -0700 Subject: [PATCH 13/14] Added TagOps.FETCH_TAGS to the fetch command so we get all tags. --- .../server/environment/JGitEnvironmentRepository.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java index 0cbba345..c6c3c518 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java @@ -41,11 +41,8 @@ import org.eclipse.jgit.api.TransportCommand; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.RefNotFoundException; import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.transport.FetchResult; -import org.eclipse.jgit.transport.JschConfigSessionFactory; +import org.eclipse.jgit.transport.*; import org.eclipse.jgit.transport.OpenSshConfig.Host; -import org.eclipse.jgit.transport.SshSessionFactory; -import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider; import org.eclipse.jgit.util.FileUtils; import org.springframework.beans.factory.InitializingBean; import org.springframework.core.env.ConfigurableEnvironment; @@ -167,7 +164,7 @@ public class JGitEnvironmentRepository extends AbstractScmEnvironmentRepository try { git = createGitClient(); if (shouldPull(git)) { - fetch(git, label);:wQ + fetch(git, label); //checkout after fetch so we can get any new branches, tags, ect. checkout(git, label); if(isBranch(git, label)) { @@ -284,7 +281,9 @@ public class JGitEnvironmentRepository extends AbstractScmEnvironmentRepository } private FetchResult fetch(Git git, String label) { - FetchCommand fetch = git.fetch().setRemote("origin"); + FetchCommand fetch = git.fetch() + .setRemote("origin") + .setTagOpt(TagOpt.FETCH_TAGS); setTimeout(fetch); try { if (hasText(getUsername())) { From 102dcf41cd194a01b590684fa49549cf39bdf630 Mon Sep 17 00:00:00 2001 From: rlynch2 Date: Sat, 5 Nov 2016 16:23:21 -0700 Subject: [PATCH 14/14] Added TagOps.FETCH_TAGS to the fetch command so we get all tags. --- .../server/environment/JGitEnvironmentRepository.java | 7 ++++--- .../JGitEnvironmentRepositoryIntegrationTests.java | 10 +++++++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java index c6c3c518..ff120322 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepository.java @@ -281,9 +281,10 @@ public class JGitEnvironmentRepository extends AbstractScmEnvironmentRepository } private FetchResult fetch(Git git, String label) { - FetchCommand fetch = git.fetch() - .setRemote("origin") - .setTagOpt(TagOpt.FETCH_TAGS); + FetchCommand fetch = git.fetch(); + fetch.setRemote("origin"); + fetch.setTagOpt(TagOpt.FETCH_TAGS); + setTimeout(fetch); try { if (hasText(getUsername())) { diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java index eb2047b6..6f1fde9d 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JGitEnvironmentRepositoryIntegrationTests.java @@ -428,9 +428,17 @@ public class JGitEnvironmentRepositoryIntegrationTests { environment = testData.getRepository().findOne("bar", "staging", "testTag"); fooProperty = ConfigServerTestUtils.getProperty(environment, "bar.properties", "foo"); assertEquals(fooProperty, "bar"); + + //now move the tag and test again + serverGit.tag().setName("testTag").setForceUpdate(true).setMessage("Testing a moved tag").call(); + + environment = testData.getRepository().findOne("bar", "staging", "testTag"); + fooProperty = ConfigServerTestUtils.getProperty(environment, "bar.properties", "foo"); + assertEquals(fooProperty, "testAfterTag"); + } - @Test + @Test public void testNewCommitID() throws Exception { JGitConfigServerTestData testData = JGitConfigServerTestData.prepareClonedGitRepository(TestConfiguration.class);