Better commit messages

fixes #5
This commit is contained in:
Marcin Grzejszczak
2017-03-13 12:00:56 +01:00
parent 4feda2149c
commit 0a18deff11
7 changed files with 78 additions and 49 deletions

View File

@@ -5,7 +5,7 @@ import java.lang.invoke.MethodHandles;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.release.internal.project.Project;
import org.springframework.cloud.release.internal.project.ProjectBuilder;
import org.springframework.cloud.release.internal.git.ProjectGitUpdater;
import org.springframework.cloud.release.internal.pom.ProjectPomUpdater;
import org.springframework.cloud.release.internal.pom.ProjectVersion;
@@ -21,17 +21,56 @@ public class Releaser {
private final ReleaserProperties properties;
private final ProjectPomUpdater projectPomUpdater;
private final Project project;
private final ProjectBuilder projectBuilder;
private final ProjectGitUpdater projectGitUpdater;
public Releaser(ReleaserProperties properties, ProjectPomUpdater projectPomUpdater,
Project project, ProjectGitUpdater projectGitUpdater) {
ProjectBuilder projectBuilder, ProjectGitUpdater projectGitUpdater) {
this.properties = properties;
this.projectPomUpdater = projectPomUpdater;
this.project = project;
this.projectBuilder = projectBuilder;
this.projectGitUpdater = projectGitUpdater;
}
public ProjectVersion updateProjectFromScRelease(File project) {
this.projectPomUpdater.updateProjectFromSCRelease(project);
ProjectVersion changedVersion = new ProjectVersion(project);
log.info("\n\nProject was successfully updated to [{}]", changedVersion);
return changedVersion;
}
public void buildProject() {
this.projectBuilder.build();
log.info("\nProject was successfully built");
}
public void commitAndPushTags(File project, ProjectVersion changedVersion) {
this.projectGitUpdater.commitAndTagIfApplicable(project, changedVersion);
log.info("\nCommit was made and tag was pushed successfully");
}
public void deploy() {
this.projectBuilder.deploy();
log.info("\nThe artifact was deployed successfully");
}
public void publishDocs(ProjectVersion changedVersion) {
this.projectBuilder.publishDocs(changedVersion.version);
log.info("\nThe docs were published successfully");
}
public void rollbackReleaseVersion(File project, ProjectVersion originalVersion, ProjectVersion changedVersion) {
this.projectGitUpdater.revertChangesIfApplicable(project, changedVersion);
this.projectBuilder.bumpVersions(originalVersion.bumpedVersion());
this.projectGitUpdater.commitAfterBumpingVersions(project, originalVersion);
log.info("\nSuccessfully reverted the commit and bumped snapshot versions");
}
public void pushCurrentBranch(File project) {
this.projectGitUpdater.pushCurrentBranch(project);
log.info("\nSuccessfully pushed current branch");
}
public void release() {
String workingDir = this.properties.getWorkingDir();
File project = new File(workingDir);
@@ -41,49 +80,39 @@ public class Releaser {
ProjectVersion originalVersion = new ProjectVersion(project);
ProjectVersion changedVersion = new ProjectVersion(project);
if (!skipPoms) {
this.projectPomUpdater.updateProjectFromSCRelease(project);
changedVersion = new ProjectVersion(project);
log.info("\n\nProject was successfully updated to [{}]", changedVersion);
changedVersion = this.updateProjectFromScRelease(project);
}
log.info("\n\n\n=== BUILD PROJECT ===\n\nPress ENTER to build the project {}", MSG);
boolean skipBuild = skipStep();
if (!skipBuild) {
this.project.build();
log.info("\nProject was successfully built");
this.buildProject();
}
log.info("\n\n\n=== COMMITTING AND PUSHING TAGS ===\n\nPress ENTER to commit, tag and push the tag {}", MSG);
boolean skipCommit = skipStep();
if (!skipCommit) {
this.projectGitUpdater.commitAndTagIfApplicable(project, changedVersion);
log.info("\nCommit was made and tag was pushed successfully");
this.commitAndPushTags(project, changedVersion);
}
log.info("\n\n\n=== ARTIFACT DEPLOYMENT ===\n\nPress ENTER to deploy the artifacts {}", MSG);
boolean skipDeployment = skipStep();
if (!skipDeployment) {
this.project.deploy();
log.info("\nThe artifact was deployed successfully");
this.deploy();
}
log.info("\n\n\n=== PUBLISHING DOCS ===\n\nPress ENTER to deploy the artifacts {}", MSG);
boolean skipDocs = skipStep();
if (!skipDocs) {
this.project.publishDocs(changedVersion.version);
log.info("\nThe docs were published successfully");
this.publishDocs(changedVersion);
}
if (!changedVersion.isSnapshot()) {
log.info("\n\n\n=== REVERTING CHANGES & BUMPING VERSION===\n\nPress ENTER to go back to snapshots and bump originalVersion by patch {}", MSG);
boolean skipRevert = skipStep();
if (!skipRevert) {
this.projectGitUpdater.revertChangesIfApplicable(project, changedVersion);
this.project.bumpVersions(originalVersion.bumpedVersion());
this.projectGitUpdater.commitAfterBumpingVersions(project, originalVersion);
log.info("\nSuccessfully reverted the commit and bumped snapshot versions");
rollbackReleaseVersion(project, originalVersion, changedVersion);
}
}
log.info("\n\n\n=== PUSHING CHANGES===\n\nPress ENTER to push the commits {}", MSG);
boolean skipPush = skipStep();
if (!skipPush) {
this.projectGitUpdater.pushCurrentBranch(project);
log.info("\nSuccessfully pushed current branch");
this.pushCurrentBranch(project);
}
}

View File

@@ -20,9 +20,9 @@ public class ProjectGitUpdater {
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private static final String MSG = "Bumping versions";
private static final String PRE_RELEASE_MSG = "Bumping versions before release";
private static final String PRE_RELEASE_MSG = "Update SNAPSHOT to %s";
private static final String POST_RELEASE_MSG = "Going back to snapshots";
private static final String POST_RELEASE_BUMP_MSG = MSG + " after release";
private static final String POST_RELEASE_BUMP_MSG = "Bumping versions to %s after release";
private final ReleaserProperties properties;
@@ -37,7 +37,7 @@ public class ProjectGitUpdater {
gitRepo.commit(project, MSG);
} else {
log.info("NON-snapshot version [{}] found. Will commit the changed poms, tag the version and push the tag", version);
gitRepo.commit(project, PRE_RELEASE_MSG);
gitRepo.commit(project, String.format(PRE_RELEASE_MSG, version.version));
String tagName = "v" + version.version;
gitRepo.tag(project, tagName);
gitRepo.pushTag(project, tagName);
@@ -48,7 +48,7 @@ public class ProjectGitUpdater {
GitRepo gitRepo = gitRepo(project);
if (version.isSnapshot()) {
log.info("Snapshot version [{}] found. Will only commit the changed poms", version);
gitRepo.commit(project, POST_RELEASE_BUMP_MSG);
gitRepo.commit(project, String.format(POST_RELEASE_BUMP_MSG, version.bumpedVersion()));
} else {
log.info("Non snapshot version [{}] found. Won't do anything", version);
}

View File

@@ -18,7 +18,7 @@ import org.springframework.cloud.release.internal.pom.ProjectPomUpdater;
/**
* @author Marcin Grzejszczak
*/
public class Project {
public class ProjectBuilder {
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private static final String VERSION_MUSTACHE = "{{version}}";
@@ -27,13 +27,13 @@ public class Project {
private final ProcessExecutor executor;
private final ProjectPomUpdater pomUpdater;
public Project(ReleaserProperties properties, ProjectPomUpdater pomUpdater) {
public ProjectBuilder(ReleaserProperties properties, ProjectPomUpdater pomUpdater) {
this.properties = properties;
this.executor = new ProcessExecutor(properties);
this.pomUpdater = pomUpdater;
}
Project(ReleaserProperties properties, ProcessExecutor executor) {
ProjectBuilder(ReleaserProperties properties, ProcessExecutor executor) {
this.properties = properties;
this.executor = executor;
this.pomUpdater = new ProjectPomUpdater(properties);

View File

@@ -16,7 +16,7 @@ import org.springframework.cloud.release.internal.git.ProjectGitUpdater;
import org.springframework.cloud.release.internal.pom.ProjectPomUpdater;
import org.springframework.cloud.release.internal.pom.TestPomReader;
import org.springframework.cloud.release.internal.pom.TestUtils;
import org.springframework.cloud.release.internal.project.Project;
import org.springframework.cloud.release.internal.project.ProjectBuilder;
import org.springframework.util.FileSystemUtils;
import static org.assertj.core.api.BDDAssertions.then;
@@ -56,9 +56,9 @@ public class AcceptanceTests {
Iterable<RevCommit> commits = listOfCommits(project);
Iterator<RevCommit> iterator = commits.iterator();
tagIsPresentInOrigin(origin);
commitIsPresent(iterator, "Bumping versions after release");
commitIsPresent(iterator, "Bumping versions to 1.2.1.BUILD-SNAPSHOT after release");
commitIsPresent(iterator, "Going back to snapshots");
commitIsPresent(iterator, "Bumping versions before release");
commitIsPresent(iterator, "Update SNAPSHOT to 1.1.2.RELEASE");
pomVersionIsEqualTo(project, "1.2.1.BUILD-SNAPSHOT");
pomParentVersionIsEqualTo(project, "1.2.1.BUILD-SNAPSHOT");
}
@@ -104,9 +104,9 @@ public class AcceptanceTests {
private Releaser releaser(File projectFile) throws Exception {
ReleaserProperties properties = releaserProperties(projectFile);
ProjectPomUpdater pomUpdater = new ProjectPomUpdater(properties);
Project project = new Project(properties, pomUpdater);
ProjectBuilder projectBuilder = new ProjectBuilder(properties, pomUpdater);
ProjectGitUpdater gitUpdater = new ProjectGitUpdater(properties);
return new Releaser(properties, pomUpdater, project, gitUpdater) {
return new Releaser(properties, pomUpdater, projectBuilder, gitUpdater) {
@Override boolean skipStep() {
return false;
}

View File

@@ -41,7 +41,7 @@ public class ProjectGitUpdaterTests {
public void should_commit_tag_and_push_tag_when_version_is_not_snapshot() {
this.updater.commitAndTagIfApplicable(this.file, new ProjectVersion("1.0.0.RELEASE"));
then(this.gitRepo).should().commit(any(File.class), eq("Bumping versions before release"));
then(this.gitRepo).should().commit(any(File.class), eq("Update SNAPSHOT to 1.0.0.RELEASE"));
then(this.gitRepo).should().tag(any(File.class), eq("v1.0.0.RELEASE"));
then(this.gitRepo).should().pushTag(any(File.class), eq("v1.0.0.RELEASE"));
}
@@ -50,7 +50,7 @@ public class ProjectGitUpdaterTests {
public void should_commit_when_snapshot_version_is_present_with_post_release_msg() {
this.updater.commitAfterBumpingVersions(this.file, new ProjectVersion("1.0.0.BUILD-SNAPSHOT"));
then(this.gitRepo).should().commit(any(File.class), eq("Bumping versions after release"));
then(this.gitRepo).should().commit(any(File.class), eq("Bumping versions to 1.0.1.BUILD-SNAPSHOT after release"));
then(this.gitRepo).should(never()).tag(any(File.class), anyString());
}

View File

@@ -19,7 +19,7 @@ import static org.assertj.core.api.BDDAssertions.thenThrownBy;
/**
* @author Marcin Grzejszczak
*/
public class ProjectTests {
public class ProjectBuilderTests {
TestPomReader reader = new TestPomReader();
@@ -33,7 +33,7 @@ public class ProjectTests {
ReleaserProperties properties = new ReleaserProperties();
properties.getMaven().setBuildCommand("ls -al");
properties.setWorkingDir(file("/projects/builder/resolved").getPath());
Project builder = new Project(properties, executor(properties));
ProjectBuilder builder = new ProjectBuilder(properties, executor(properties));
builder.build();
@@ -46,7 +46,7 @@ public class ProjectTests {
ReleaserProperties properties = new ReleaserProperties();
properties.getMaven().setBuildCommand("ls -al");
properties.setWorkingDir(file("/projects/builder/unresolved").getPath());
Project builder = new Project(properties, executor(properties));
ProjectBuilder builder = new ProjectBuilder(properties, executor(properties));
thenThrownBy(builder::build).hasMessageContaining("contains a tag that wasn't resolved properly");
}
@@ -57,7 +57,7 @@ public class ProjectTests {
properties.getMaven().setBuildCommand("sleep 1");
properties.getMaven().setWaitTimeInMinutes(0);
properties.setWorkingDir(file("/projects/builder/unresolved").getPath());
Project builder = new Project(properties, executor(properties));
ProjectBuilder builder = new ProjectBuilder(properties, executor(properties));
thenThrownBy(builder::build).hasMessageContaining("Process waiting time of [0] minutes exceeded");
}
@@ -67,7 +67,7 @@ public class ProjectTests {
ReleaserProperties properties = new ReleaserProperties();
properties.getMaven().setDeployCommand("ls -al");
properties.setWorkingDir(file("/projects/builder/resolved").getPath());
Project builder = new Project(properties, executor(properties));
ProjectBuilder builder = new ProjectBuilder(properties, executor(properties));
builder.deploy();
@@ -81,7 +81,7 @@ public class ProjectTests {
properties.getMaven().setDeployCommand("sleep 1");
properties.getMaven().setWaitTimeInMinutes(0);
properties.setWorkingDir(file("/projects/builder/unresolved").getPath());
Project builder = new Project(properties, executor(properties));
ProjectBuilder builder = new ProjectBuilder(properties, executor(properties));
thenThrownBy(builder::deploy).hasMessageContaining("Process waiting time of [0] minutes exceeded");
}
@@ -92,7 +92,7 @@ public class ProjectTests {
properties.getMaven().setPublishDocsCommands(new String[] { "ls -al", "ls -al" });
properties.setWorkingDir(file("/projects/builder/resolved").getPath());
TestProcessExecutor executor = executor(properties);
Project builder = new Project(properties, executor);
ProjectBuilder builder = new ProjectBuilder(properties, executor);
builder.publishDocs("");
@@ -107,7 +107,7 @@ public class ProjectTests {
properties.getMaven().setPublishDocsCommands(new String[] { "echo '{{version}}'" });
properties.setWorkingDir(file("/projects/builder/resolved").getPath());
TestProcessExecutor executor = executor(properties);
Project builder = new Project(properties, executor);
ProjectBuilder builder = new ProjectBuilder(properties, executor);
builder.publishDocs("1.1.0.RELEASE");
@@ -121,7 +121,7 @@ public class ProjectTests {
properties.getMaven().setPublishDocsCommands(new String[] { "ls -al", "ls -al" });
properties.getMaven().setWaitTimeInMinutes(0);
properties.setWorkingDir(file("/projects/builder/unresolved").getPath());
Project builder = new Project(properties, executor(properties));
ProjectBuilder builder = new ProjectBuilder(properties, executor(properties));
thenThrownBy(() -> builder.publishDocs("")).hasMessageContaining("Process waiting time of [0] minutes exceeded");
}
@@ -131,7 +131,7 @@ public class ProjectTests {
ReleaserProperties properties = new ReleaserProperties();
properties.getMaven().setBuildCommand("exit 1");
properties.setWorkingDir(file("/projects/builder/unresolved").getPath());
Project builder = new Project(properties, new ProcessExecutor(properties) {
ProjectBuilder builder = new ProjectBuilder(properties, new ProcessExecutor(properties) {
@Override Process startProcess(ProcessBuilder builder) throws IOException {
return processWithInvalidExitCode();
}
@@ -144,7 +144,7 @@ public class ProjectTests {
public void should_successfully_execute_a_bump_versions_command() throws Exception {
ReleaserProperties properties = new ReleaserProperties();
properties.setWorkingDir(file("/projects/spring-cloud-contract").getPath());
Project builder = new Project(properties, executor(properties));
ProjectBuilder builder = new ProjectBuilder(properties, executor(properties));
builder.bumpVersions("2.3.4.BUILD-SNAPSHOT");
@@ -205,7 +205,7 @@ public class ProjectTests {
private File file(String relativePath) {
try {
File root = new File(ProjectTests.class.getResource("/").toURI());
File root = new File(ProjectBuilderTests.class.getResource("/").toURI());
File file = new File(root, relativePath);
if (!file.exists()) {
file.createNewFile();

View File

@@ -18,7 +18,7 @@ package org.springframework.cloud.release.spring;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.release.internal.Releaser;
import org.springframework.cloud.release.internal.ReleaserProperties;
import org.springframework.cloud.release.internal.project.Project;
import org.springframework.cloud.release.internal.project.ProjectBuilder;
import org.springframework.cloud.release.internal.git.ProjectGitUpdater;
import org.springframework.cloud.release.internal.pom.ProjectPomUpdater;
import org.springframework.context.annotation.Bean;
@@ -31,6 +31,6 @@ class ReleaserConfiguration {
@Bean Releaser releaser(ReleaserProperties properties) {
ProjectPomUpdater pomUpdater = new ProjectPomUpdater(properties);
return new Releaser(properties, pomUpdater,
new Project(properties, pomUpdater), new ProjectGitUpdater(properties));
new ProjectBuilder(properties, pomUpdater), new ProjectGitUpdater(properties));
}
}