Skip to content

Commit 2b9dccb

Browse files
committed
Add parameters for generating more flexible changesets using the add goal
1 parent 7344f07 commit 2b9dccb

5 files changed

Lines changed: 98 additions & 16 deletions

File tree

changesets-java/src/main/java/se/fortnox/changesets/ChangesetWriter.java

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.slf4j.Logger;
44

5+
import java.io.File;
56
import java.io.IOException;
67
import java.nio.file.FileAlreadyExistsException;
78
import java.nio.file.Files;
@@ -31,10 +32,14 @@ public ChangesetWriter(Path baseDir) {
3132
}
3233

3334
public void writeChangeset(Changeset changeset) throws FileAlreadyExistsException {
34-
writeChangeset(changeset.packageName(), changeset.level(), changeset.message());
35+
writeChangeset(changeset.packageName(), changeset.level(), changeset.message(), changeset.file());
3536
}
3637

3738
Path writeChangeset(String packageName, Level changeLevel, String message) throws FileAlreadyExistsException {
39+
return writeChangeset(packageName, changeLevel, message, null);
40+
}
41+
42+
Path writeChangeset(String packageName, Level changeLevel, String message, File file) throws FileAlreadyExistsException {
3843
final String fileContent;
3944
if(message == null) {
4045
fileContent = """
@@ -62,6 +67,26 @@ Path writeChangeset(String packageName, Level changeLevel, String message) throw
6267
}
6368
}
6469

70+
71+
Path changesetFile;
72+
if (file != null) {
73+
// TODO Add tests
74+
changesetFile = file.toPath();
75+
} else {
76+
changesetFile = generateChangesetFilename(changesetsDir);
77+
}
78+
79+
try {
80+
LOG.info("Writing changeset to {}", changesetFile);
81+
Files.writeString(changesetFile, fileContent, StandardOpenOption.CREATE_NEW);
82+
} catch (IOException e) {
83+
LOG.error("Failed to create new changeset", e);
84+
}
85+
86+
return changesetFile;
87+
}
88+
89+
private Path generateChangesetFilename(Path changesetsDir) throws FileAlreadyExistsException {
6590
String newFileName = this.nameGenerator.humanId() + ".md";
6691
Path changesetFile = changesetsDir.resolve(newFileName);
6792

@@ -80,14 +105,6 @@ Path writeChangeset(String packageName, Level changeLevel, String message) throw
80105
throw new FileAlreadyExistsException(string, null, "Failed to generate a unique name after %s attempts".formatted(attempt));
81106
}
82107
}
83-
84-
try {
85-
LOG.info("Writing changeset to {}", changesetFile);
86-
Files.writeString(changesetFile, fileContent, StandardOpenOption.CREATE_NEW);
87-
} catch (IOException e) {
88-
LOG.error("Failed to create new changeset", e);
89-
}
90-
91108
return changesetFile;
92109
}
93110
}

changesets-maven-plugin/pom.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@
168168
<settingsFile>src/it/settings.xml</settingsFile>
169169
<addTestClassPath>true</addTestClassPath>
170170
<showErrors>true</showErrors>
171+
<!-- Skip these when skipping tests -->
172+
<skipInvocation>${skipTests}</skipInvocation>
171173
<goals>
172174
<goal>clean</goal>
173175
<goal>test-compile</goal>
Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,8 @@
1-
invoker.goals=${project.groupId}:${project.artifactId}:${project.version}:add -DchangesetContent='thecontent'
1+
# changesetFilename is used to get predictable names for the changesets, so testing is easier
2+
3+
invoker.goals.1=${project.groupId}:${project.artifactId}:${project.version}:add -DchangesetContent='Patch change' -DchangesetLevel=Patch -DchangesetFilename=patch.md
4+
invoker.goals.2=${project.groupId}:${project.artifactId}:${project.version}:add -DchangesetContent='Minor change' -DchangesetLevel=MINOR -DchangesetFilename=minor.md
5+
invoker.goals.3=${project.groupId}:${project.artifactId}:${project.version}:add -DchangesetContent='Major change' -DchangesetLevel=major -DchangesetFilename=major.md
6+
7+
# TODO Enable this goal to test the dependency change, once that PR is merged
8+
# invoker.goals.4=${project.groupId}:${project.artifactId}:${project.version}:add -DchangesetContent='Dependency change' -DchangesetLevel=Dependency -DchangesetFilename=dependency.md
Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,32 @@
1-
// Verify that exactly one markdown file was added to the .changeset folder and has the expected content
2-
def firstChangeset = new File(basedir, ".changeset")
1+
def changesetFiles = new File(basedir, ".changeset")
32
.listFiles()
43
.findAll { it.name ==~ /.*\.md/ }
5-
.first()
4+
assert changesetFiles.size() == 3
65

7-
assert firstChangeset.text.equals("---\n" +
6+
7+
assert new File(basedir, ".changeset/patch.md").text.equals("---\n" +
88
"\"add-blank-changelog\": patch\n" +
99
"---\n" +
1010
"\n" +
11-
"thecontent");
11+
"Patch change");
12+
13+
assert new File(basedir, ".changeset/minor.md").text.equals("---\n" +
14+
"\"add-blank-changelog\": minor\n" +
15+
"---\n" +
16+
"\n" +
17+
"Minor change");
18+
19+
assert new File(basedir, ".changeset/major.md").text.equals("---\n" +
20+
"\"add-blank-changelog\": major\n" +
21+
"---\n" +
22+
"\n" +
23+
"Major change");
24+
25+
// See invoker.properties for the dependency change details
26+
/*
27+
assert new File(basedir, ".changeset/dependency.md").text.equals("---\n" +
28+
"\"add-blank-changelog\": dependency\n" +
29+
"---\n" +
30+
"\n" +
31+
"Dependency change");
32+
*/

changesets-maven-plugin/src/main/java/se/fortnox/changesets/maven/AddMojo.java

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,60 @@
88
import se.fortnox.changesets.ChangesetWriter;
99
import se.fortnox.changesets.Level;
1010

11+
import java.io.File;
1112
import java.nio.file.FileAlreadyExistsException;
1213
import java.nio.file.Path;
14+
import java.util.Arrays;
15+
import java.util.List;
16+
17+
import static se.fortnox.changesets.ChangesetWriter.CHANGESET_DIR;
1318

1419
@Mojo(name = "add", defaultPhase = LifecyclePhase.INITIALIZE, aggregator = true)
1520
public class AddMojo extends AbstractMojo {
1621
@Parameter(defaultValue = "${project}", readonly = true, required = true)
1722
private org.apache.maven.project.MavenProject project;
1823

24+
/**
25+
* Default content of the changeset.
26+
*/
1927
@Parameter(property = "changesetContent")
2028
String changesetContent;
2129

30+
/**
31+
* Level of the changeset, e.g. patch, minor, major.
32+
*/
33+
@Parameter(property = "changesetLevel", defaultValue = "patch")
34+
String changesetLevel;
35+
36+
/**
37+
* Create the changeset with a specific filename.
38+
* By default, a filename will be automatically generated.
39+
*/
40+
@Parameter(property = "changesetFilename")
41+
String changesetFilename;
42+
2243
@Override
2344
public void execute() {
2445
Path baseDir = project.getBasedir().toPath();
2546

2647
ChangesetWriter changesetWriter = new ChangesetWriter(baseDir);
2748

49+
Level level;
50+
try {
51+
level = Level.valueOf(this.changesetLevel.toUpperCase());
52+
} catch (IllegalArgumentException e) {
53+
List<String> validLevels = Arrays.stream(Level.values()).map(Enum::name).toList();
54+
getLog().error("Invalid changeset level: %s. Valid values are: %s".formatted(this.changesetLevel, validLevels));
55+
return;
56+
}
57+
58+
File changesetFile = null;
59+
if (changesetFilename != null && !changesetFilename.isBlank()) {
60+
changesetFile = baseDir.resolve(CHANGESET_DIR).resolve(changesetFilename).toFile();
61+
}
62+
2863
try {
29-
var changeset = new Changeset("%s".formatted(project.getArtifactId()), Level.PATCH, changesetContent, null);
64+
var changeset = new Changeset("%s".formatted(project.getArtifactId()), level, changesetContent, changesetFile);
3065
changesetWriter.writeChangeset(changeset);
3166
} catch (FileAlreadyExistsException e) {
3267
throw new RuntimeException(e);

0 commit comments

Comments
 (0)