diff --git a/.github/workflows/dependabot-changesets.yml b/.github/workflows/dependabot-changesets.yml index c3efc07..c2c1432 100644 --- a/.github/workflows/dependabot-changesets.yml +++ b/.github/workflows/dependabot-changesets.yml @@ -13,7 +13,7 @@ jobs: if: github.event.pull_request.user.login == 'dependabot[bot]' && github.repository == 'FortnoxAB/changesets-java' steps: - name: Dependabot metadata - id: metadata + id: dependabot-metadata uses: dependabot/fetch-metadata@v2 with: skip-verification: true @@ -22,4 +22,8 @@ jobs: run: | echo "dependency-names: ${{ steps.dependabot-metadata.outputs.dependency-names }}" echo "new-version: ${{ steps.dependabot-metadata.outputs.new-version }}" - echo "${{ toJSON(steps.metadata.outputs) }}" + echo "${{ toJSON(steps.dependabot-metadata.outputs) }}" + + # Fake adding a changeset so we see that it runs with the correct parameters + echo "./mvnw se.fortnox.changesets:changesets-maven-plugin:add -DchangesetLevel=dependency -DchangesetContent=\"- ${{ steps.dependabot-metadata.outputs.dependency-names }}: ${{ steps.dependabot-metadata.outputs.new-version }}\"" + diff --git a/changesets-java/src/main/java/se/fortnox/changesets/ChangesetWriter.java b/changesets-java/src/main/java/se/fortnox/changesets/ChangesetWriter.java index 3d7e82f..6c93ddd 100644 --- a/changesets-java/src/main/java/se/fortnox/changesets/ChangesetWriter.java +++ b/changesets-java/src/main/java/se/fortnox/changesets/ChangesetWriter.java @@ -2,6 +2,7 @@ import org.slf4j.Logger; +import java.io.File; import java.io.IOException; import java.nio.file.FileAlreadyExistsException; import java.nio.file.Files; @@ -31,10 +32,14 @@ public ChangesetWriter(Path baseDir) { } public void writeChangeset(Changeset changeset) throws FileAlreadyExistsException { - writeChangeset(changeset.packageName(), changeset.level(), changeset.message()); + writeChangeset(changeset.packageName(), changeset.level(), changeset.message(), changeset.file()); } Path writeChangeset(String packageName, Level changeLevel, String message) throws FileAlreadyExistsException { + return writeChangeset(packageName, changeLevel, message, null); + } + + Path writeChangeset(String packageName, Level changeLevel, String message, File file) throws FileAlreadyExistsException { final String fileContent; if(message == null) { fileContent = """ @@ -62,6 +67,26 @@ Path writeChangeset(String packageName, Level changeLevel, String message) throw } } + + Path changesetFile; + if (file != null) { + // TODO Add tests + changesetFile = file.toPath(); + } else { + changesetFile = generateChangesetFilename(changesetsDir); + } + + try { + LOG.info("Writing changeset to {}", changesetFile); + Files.writeString(changesetFile, fileContent, StandardOpenOption.CREATE_NEW); + } catch (IOException e) { + LOG.error("Failed to create new changeset", e); + } + + return changesetFile; + } + + private Path generateChangesetFilename(Path changesetsDir) throws FileAlreadyExistsException { String newFileName = this.nameGenerator.humanId() + ".md"; Path changesetFile = changesetsDir.resolve(newFileName); @@ -80,14 +105,6 @@ Path writeChangeset(String packageName, Level changeLevel, String message) throw throw new FileAlreadyExistsException(string, null, "Failed to generate a unique name after %s attempts".formatted(attempt)); } } - - try { - LOG.info("Writing changeset to {}", changesetFile); - Files.writeString(changesetFile, fileContent, StandardOpenOption.CREATE_NEW); - } catch (IOException e) { - LOG.error("Failed to create new changeset", e); - } - return changesetFile; } } diff --git a/changesets-maven-plugin/pom.xml b/changesets-maven-plugin/pom.xml index a230e38..25b6c56 100644 --- a/changesets-maven-plugin/pom.xml +++ b/changesets-maven-plugin/pom.xml @@ -168,6 +168,8 @@ src/it/settings.xml true true + + ${skipTests} clean test-compile diff --git a/changesets-maven-plugin/src/it/add-changeset-from-property/invoker.properties b/changesets-maven-plugin/src/it/add-changeset-from-property/invoker.properties index 7f4ee33..c35c77b 100644 --- a/changesets-maven-plugin/src/it/add-changeset-from-property/invoker.properties +++ b/changesets-maven-plugin/src/it/add-changeset-from-property/invoker.properties @@ -1 +1,8 @@ -invoker.goals=${project.groupId}:${project.artifactId}:${project.version}:add -DchangesetContent='thecontent' \ No newline at end of file +# changesetFilename is used to get predictable names for the changesets, so testing is easier + +invoker.goals.1=${project.groupId}:${project.artifactId}:${project.version}:add -DchangesetContent='Patch change' -DchangesetLevel=Patch -DchangesetFilename=patch.md +invoker.goals.2=${project.groupId}:${project.artifactId}:${project.version}:add -DchangesetContent='Minor change' -DchangesetLevel=MINOR -DchangesetFilename=minor.md +invoker.goals.3=${project.groupId}:${project.artifactId}:${project.version}:add -DchangesetContent='Major change' -DchangesetLevel=major -DchangesetFilename=major.md + +# TODO Enable this goal to test the dependency change, once that PR is merged +# invoker.goals.4=${project.groupId}:${project.artifactId}:${project.version}:add -DchangesetContent='Dependency change' -DchangesetLevel=Dependency -DchangesetFilename=dependency.md \ No newline at end of file diff --git a/changesets-maven-plugin/src/it/add-changeset-from-property/verify.groovy b/changesets-maven-plugin/src/it/add-changeset-from-property/verify.groovy index 815a61d..4cf4dc4 100644 --- a/changesets-maven-plugin/src/it/add-changeset-from-property/verify.groovy +++ b/changesets-maven-plugin/src/it/add-changeset-from-property/verify.groovy @@ -1,11 +1,32 @@ -// Verify that exactly one markdown file was added to the .changeset folder and has the expected content -def firstChangeset = new File(basedir, ".changeset") +def changesetFiles = new File(basedir, ".changeset") .listFiles() .findAll { it.name ==~ /.*\.md/ } - .first() +assert changesetFiles.size() == 3 -assert firstChangeset.text.equals("---\n" + + +assert new File(basedir, ".changeset/patch.md").text.equals("---\n" + "\"add-blank-changelog\": patch\n" + "---\n" + "\n" + - "thecontent"); \ No newline at end of file + "Patch change"); + +assert new File(basedir, ".changeset/minor.md").text.equals("---\n" + + "\"add-blank-changelog\": minor\n" + + "---\n" + + "\n" + + "Minor change"); + +assert new File(basedir, ".changeset/major.md").text.equals("---\n" + + "\"add-blank-changelog\": major\n" + + "---\n" + + "\n" + + "Major change"); + +// See invoker.properties for the dependency change details +/* +assert new File(basedir, ".changeset/dependency.md").text.equals("---\n" + + "\"add-blank-changelog\": dependency\n" + + "---\n" + + "\n" + + "Dependency change"); +*/ \ No newline at end of file diff --git a/changesets-maven-plugin/src/main/java/se/fortnox/changesets/maven/AddMojo.java b/changesets-maven-plugin/src/main/java/se/fortnox/changesets/maven/AddMojo.java index c8179d4..7a8f247 100644 --- a/changesets-maven-plugin/src/main/java/se/fortnox/changesets/maven/AddMojo.java +++ b/changesets-maven-plugin/src/main/java/se/fortnox/changesets/maven/AddMojo.java @@ -8,25 +8,60 @@ import se.fortnox.changesets.ChangesetWriter; import se.fortnox.changesets.Level; +import java.io.File; import java.nio.file.FileAlreadyExistsException; import java.nio.file.Path; +import java.util.Arrays; +import java.util.List; + +import static se.fortnox.changesets.ChangesetWriter.CHANGESET_DIR; @Mojo(name = "add", defaultPhase = LifecyclePhase.INITIALIZE, aggregator = true) public class AddMojo extends AbstractMojo { @Parameter(defaultValue = "${project}", readonly = true, required = true) private org.apache.maven.project.MavenProject project; + /** + * Default content of the changeset. + */ @Parameter(property = "changesetContent") String changesetContent; + /** + * Level of the changeset, e.g. patch, minor, major. + */ + @Parameter(property = "changesetLevel", defaultValue = "patch") + String changesetLevel; + + /** + * Create the changeset with a specific filename. + * By default, a filename will be automatically generated. + */ + @Parameter(property = "changesetFilename") + String changesetFilename; + @Override public void execute() { Path baseDir = project.getBasedir().toPath(); ChangesetWriter changesetWriter = new ChangesetWriter(baseDir); + Level level; + try { + level = Level.valueOf(this.changesetLevel.toUpperCase()); + } catch (IllegalArgumentException e) { + List validLevels = Arrays.stream(Level.values()).map(Enum::name).toList(); + getLog().error("Invalid changeset level: %s. Valid values are: %s".formatted(this.changesetLevel, validLevels)); + return; + } + + File changesetFile = null; + if (changesetFilename != null && !changesetFilename.isBlank()) { + changesetFile = baseDir.resolve(CHANGESET_DIR).resolve(changesetFilename).toFile(); + } + try { - var changeset = new Changeset("%s".formatted(project.getArtifactId()), Level.PATCH, changesetContent, null); + var changeset = new Changeset(project.getArtifactId(), level, changesetContent, changesetFile); changesetWriter.writeChangeset(changeset); } catch (FileAlreadyExistsException e) { throw new RuntimeException(e);