diff --git a/src/main/java/org/davidbohl/dirigent/deployments/config/DeploymentsConfigurationProvider.java b/src/main/java/org/davidbohl/dirigent/deployments/config/DeploymentsConfigurationProvider.java index 00ef4ec..8da432b 100644 --- a/src/main/java/org/davidbohl/dirigent/deployments/config/DeploymentsConfigurationProvider.java +++ b/src/main/java/org/davidbohl/dirigent/deployments/config/DeploymentsConfigurationProvider.java @@ -2,8 +2,8 @@ package org.davidbohl.dirigent.deployments.config; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; -import org.davidbohl.dirigent.deployments.service.GitService; import org.davidbohl.dirigent.deployments.models.DeploynentConfiguration; +import org.davidbohl.dirigent.deployments.service.GitService; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -26,7 +26,7 @@ public class DeploymentsConfigurationProvider { ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory()); if (gitUrl != null) - gitService.cloneOrPull(gitUrl, "config"); + gitService.updateRepo(gitUrl, "config"); File configFile = new File("config/deployments.yml"); diff --git a/src/main/java/org/davidbohl/dirigent/deployments/service/DeploymentsService.java b/src/main/java/org/davidbohl/dirigent/deployments/service/DeploymentsService.java index 30d62ea..aa780cb 100644 --- a/src/main/java/org/davidbohl/dirigent/deployments/service/DeploymentsService.java +++ b/src/main/java/org/davidbohl/dirigent/deployments/service/DeploymentsService.java @@ -9,7 +9,6 @@ import org.davidbohl.dirigent.deployments.models.events.NamedDeploymentStartRequ import org.davidbohl.dirigent.deployments.models.events.SourceDeploymentStartRequestedEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.event.EventListener; @@ -163,7 +162,10 @@ public class DeploymentsService { File deploymentDir = new File("deployments/" + deployment.name()); try { - gitService.cloneOrPull(deployment.source(), deploymentDir.getAbsolutePath()); + boolean updated = gitService.updateRepo(deployment.source(), deploymentDir.getAbsolutePath()); + + if(!updated) + return; List commandArgs = new java.util.ArrayList<>(Arrays.stream(composeCommand.split(" ")).toList()); commandArgs.add("up"); diff --git a/src/main/java/org/davidbohl/dirigent/deployments/service/GitService.java b/src/main/java/org/davidbohl/dirigent/deployments/service/GitService.java index 23eb51a..a509f9e 100644 --- a/src/main/java/org/davidbohl/dirigent/deployments/service/GitService.java +++ b/src/main/java/org/davidbohl/dirigent/deployments/service/GitService.java @@ -6,8 +6,10 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.util.UriComponentsBuilder; +import java.io.BufferedReader; import java.io.File; import java.io.IOException; +import java.io.InputStreamReader; import java.util.Arrays; import java.util.Objects; @@ -19,21 +21,28 @@ public class GitService { @Value("${dirigent.git.authToken}") private String authToken; - public void cloneOrPull(String source, String destination) throws IOException, InterruptedException { + public boolean updateRepo(String source, String destination) throws IOException, InterruptedException { logger.info("Cloning or pulling git repository '{}' to dir '{}'", source, destination); File destinationDir = new File(destination); + boolean changed = false; + if (destinationDir.exists() && Arrays.asList(Objects.requireNonNull(destinationDir.list())).contains(".git")) { logger.debug("Local Repo exists. Pulling latest changes."); + + String currentHeadRev = getHeadRev(destinationDir); new ProcessBuilder("git", "fetch", "--all") .directory(destinationDir).start().waitFor(); new ProcessBuilder("git", "reset", "--hard", "HEAD") .directory(destinationDir).start().waitFor(); new ProcessBuilder("git", "pull") .directory(destinationDir).start().waitFor(); + String newHeadRev = getHeadRev(destinationDir); + changed = !currentHeadRev.equals(newHeadRev); } else { + changed = true; logger.debug("Local Repo does not exist. Cloning repository."); deleteDirectory(destinationDir); UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromUriString(source); @@ -46,6 +55,22 @@ public class GitService { new ProcessBuilder("git", "clone", uriComponentsBuilder.toUriString(), destination) .start().waitFor(); } + + return changed; + } + + private static String getHeadRev(File destinationDir) throws IOException, InterruptedException { + Process process = new ProcessBuilder("git", "rev-parse", "HEAD") + .directory(destinationDir).start(); + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + String line; + StringBuilder stringBuilder = new StringBuilder(); + while ((line = reader.readLine()) != null) { + stringBuilder.append(line); + } + String currentRev = stringBuilder.toString(); + process.waitFor(); + return currentRev; } void deleteDirectory(File directoryToBeDeleted) {