This is an automated email from the ASF dual-hosted git repository. vy pushed a commit to branch mvn-site-simplified in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit 73bc9928357284632f6cbd75fa0edbecd5c81d02 Author: Volkan Yazıcı <[email protected]> AuthorDate: Thu Nov 24 10:45:58 2022 +0100 LOG4J2-3628 Rename `unreleased.adoc` to `<releaseVersionMajor>.x.x.adoc`. --- changelog/README.adoc | 4 +- .../logging/log4j/internal/util/XmlReader.java | 6 +-- .../internal/util/changelog/ChangelogEntry.java | 6 +-- .../util/changelog/exporter/AsciiDocExporter.java | 58 +++++++++++++++------- .../util/changelog/importer/MavenChanges.java | 2 +- .../util/changelog/releaser/ChangelogReleaser.java | 2 +- .../changelog/{unreleased.adoc => 2.x.x.adoc} | 2 +- src/site/asciidoc/changelog/index.adoc | 2 +- 8 files changed, 52 insertions(+), 30 deletions(-) diff --git a/changelog/README.adoc b/changelog/README.adoc index b5c4ee8de1..6564fa031d 100644 --- a/changelog/README.adoc +++ b/changelog/README.adoc @@ -43,7 +43,7 @@ Generator will compile these files to emit a single `{generator-target-dir}/<rel Changelogs of the staged changes for the next version is stored in `.unreleased` directory. Compared to released version changelog directories (e.g., `20220909-2.10.0`), `.unreleased` directory only consists of changelog entry files (i.e., `[<issueId>_]<shortSummary>.xml`). -Generator will compile these files to emit a single `{generator-target-dir}/unreleased.adoc` file and update `{generator-target-dir}/index.adoc` accordingly. +Generator will compile these files to emit a single `{generator-target-dir}/<releaseVersionMajor>.x.x.adoc` file and update `{generator-target-dir}/index.adoc` accordingly, where `releaseVersionMajor` is populated from the root `pom.xml` file. [#changelog-entry-file] == Changelog entry file @@ -98,7 +98,7 @@ You can manually trigger it using `./mvnw -pl log4j-internal-util` command. === I am about to deploy a new Log4j _release candidate_. Now what? For release candidates, you don't need to touch anything. -Your regular build should have already populated `{generator-target-dir}/unreleased.adoc`. +Your regular build should have already populated `{generator-target-dir}/<releaseVersionMajor>.x.x.adoc`. **Make sure to commit these!** === I am about to deploy a new Log4j _release_. Now what? diff --git a/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/XmlReader.java b/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/XmlReader.java index df1b2442a1..e458177f1a 100644 --- a/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/XmlReader.java +++ b/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/XmlReader.java @@ -66,7 +66,7 @@ public final class XmlReader { return document; } - public static Stream<Element> childElementsMatchingName(final Element parentElement, final String childElementName) { + public static Stream<Element> findChildElementsMatchingName(final Element parentElement, final String childElementName) { final NodeList childNodes = parentElement.getChildNodes(); return IntStream .range(0, childNodes.getLength()) @@ -75,8 +75,8 @@ public final class XmlReader { .map(childNode -> (Element) childNode); } - public static Element childElementMatchingName(final Element parentElement, final String childElementName) { - final List<Element> childElements = childElementsMatchingName(parentElement, childElementName) + public static Element requireChildElementMatchingName(final Element parentElement, final String childElementName) { + final List<Element> childElements = findChildElementsMatchingName(parentElement, childElementName) .collect(Collectors.toList()); final int childElementCount = childElements.size(); if (childElementCount != 1) { diff --git a/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/ChangelogEntry.java b/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/ChangelogEntry.java index 5ee776afed..0f42d6186e 100644 --- a/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/ChangelogEntry.java +++ b/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/ChangelogEntry.java @@ -164,7 +164,7 @@ public final class ChangelogEntry { // Read the `issue` elements. final List<Issue> issues = XmlReader - .childElementsMatchingName(entryElement, "issue") + .findChildElementsMatchingName(entryElement, "issue") .map(issueElement -> { final String issueId = XmlReader.requireAttribute(issueElement, "id"); final String issueLink = XmlReader.requireAttribute(issueElement, "link"); @@ -174,7 +174,7 @@ public final class ChangelogEntry { // Read the `author` elements. final List<Author> authors = XmlReader - .childElementsMatchingName(entryElement, "author") + .findChildElementsMatchingName(entryElement, "author") .map(authorElement -> { final String authorId = authorElement.hasAttribute("id") ? authorElement.getAttribute("id") @@ -194,7 +194,7 @@ public final class ChangelogEntry { } // Read the `description` element. - final Element descriptionElement = XmlReader.childElementMatchingName(entryElement, "description"); + final Element descriptionElement = XmlReader.requireChildElementMatchingName(entryElement, "description"); final String descriptionFormat = XmlReader.requireAttribute(descriptionElement, "format"); final String descriptionText = trimNullable(descriptionElement.getTextContent()); final Description description = new Description(descriptionFormat, descriptionText); diff --git a/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/exporter/AsciiDocExporter.java b/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/exporter/AsciiDocExporter.java index 68cb4931e3..0f8492d2b1 100644 --- a/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/exporter/AsciiDocExporter.java +++ b/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/exporter/AsciiDocExporter.java @@ -29,9 +29,14 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import org.apache.logging.log4j.internal.util.AsciiDocUtils; +import org.apache.logging.log4j.internal.util.XmlReader; import org.apache.logging.log4j.internal.util.changelog.ChangelogEntry; import org.apache.logging.log4j.internal.util.changelog.ChangelogFiles; import org.apache.logging.log4j.internal.util.changelog.ChangelogRelease; +import org.w3c.dom.Element; + +import static org.apache.logging.log4j.internal.util.StringUtils.isBlank; +import static org.apache.logging.log4j.internal.util.StringUtils.trimNullable; public final class AsciiDocExporter { @@ -95,9 +100,13 @@ public final class AsciiDocExporter { } // Export unreleased. - exportUnreleased(args.projectRootDirectory); + final int releaseVersionMajor = readRootPomVersionMajor(args.projectRootDirectory); + final String releaseVersion = releaseVersionMajor + ".x.x"; + final ChangelogRelease upcomingRelease = new ChangelogRelease(releaseVersion, null); + exportUnreleased(args.projectRootDirectory, upcomingRelease); // Export the release index. + changelogReleases.add(upcomingRelease); exportReleaseIndex(args.projectRootDirectory, changelogReleases); } @@ -220,19 +229,17 @@ public final class AsciiDocExporter { .append('\n') .append(AUTO_GENERATION_WARNING_ASCIIDOC) .append('\n') - .append("= "); - if (release.version != null) { + .append("= ") + .append(release.version); + if (release.date != null) { stringBuilder - .append(release.version) .append(" (") .append(release.date) .append(")\n") .append(introAsciiDoc) .append("\n"); } else { - stringBuilder - .append("Unreleased\n\n") - .append("Changes staged for the next version that is yet to be released.\n\n"); + stringBuilder.append("\n\nChanges staged for the next version that is yet to be released.\n\n"); } if (!entries.isEmpty()) { @@ -357,12 +364,27 @@ public final class AsciiDocExporter { } } - private static void exportUnreleased(final Path projectRootDirectory) { + private static int readRootPomVersionMajor(final Path projectRootDirectory) { + final Path rootPomFile = projectRootDirectory.resolve("pom.xml"); + final Element projectElement = XmlReader.readXmlFileRootElement(rootPomFile, "project"); + final Element versionElement = XmlReader.requireChildElementMatchingName(projectElement, "version"); + final String version = trimNullable(versionElement.getTextContent()); + if (isBlank(version)) { + throw XmlReader.failureAtXmlNode(versionElement, "blank `version`"); + } + final String versionPattern = "^\\d+\\.\\d+.\\d+(-SNAPSHOT)?$"; + if (!version.matches(versionPattern)) { + throw XmlReader.failureAtXmlNode( + versionElement, "`version` doesnt' match the expected pattern `%s`: `%s`", versionPattern, version); + } + return Integer.parseInt(version.split("\\.", 2)[0]); + } + + private static void exportUnreleased(final Path projectRootDirectory, final ChangelogRelease upcomingRelease) { final Path unreleasedDirectory = ChangelogFiles.unreleasedDirectory(projectRootDirectory); final List<ChangelogEntry> changelogEntries = readChangelogEntries(unreleasedDirectory); - final ChangelogRelease changelogRelease = new ChangelogRelease(null, null); try { - exportRelease(projectRootDirectory, changelogRelease, null, changelogEntries); + exportRelease(projectRootDirectory, upcomingRelease, null, changelogEntries); } catch (final IOException error) { throw new UncheckedIOException("failed exporting unreleased changes", error); } @@ -388,14 +410,16 @@ public final class AsciiDocExporter { .append(AsciiDocUtils.LICENSE_COMMENT_BLOCK) .append('\n') .append(AUTO_GENERATION_WARNING_ASCIIDOC) - .append("\n= Release changelogs\n\n") - .append("* xref:unreleased.adoc[Unreleased]\n"); + .append("\n= Release changelogs\n\n"); for (int releaseIndex = changelogReleases.size() - 1; releaseIndex >= 0; releaseIndex--) { final ChangelogRelease changelogRelease = changelogReleases.get(releaseIndex); final String asciiDocFilename = changelogReleaseAsciiDocFilename(changelogRelease); + final String asciiDocBulletDatePrefix = changelogRelease.date != null + ? ('[' + changelogRelease.date + "] ") + : ""; final String asciiDocBullet = String.format( - "* [%s] xref:%s[%s]\n", - changelogRelease.date, + "* %sxref:%s[%s]\n", + asciiDocBulletDatePrefix, asciiDocFilename, changelogRelease.version); stringBuilder.append(asciiDocBullet); @@ -404,10 +428,8 @@ public final class AsciiDocExporter { } private static String changelogReleaseAsciiDocFilename(final ChangelogRelease changelogRelease) { - return changelogRelease.version == null - ? "unreleased.adoc" - // Using only the version (that is, avoiding the date) in the filename so that one can determine the link to the changelog of a particular release with only version information. - : String.format("%s.adoc", changelogRelease.version); + // Using only the version (that is, avoiding the date) in the filename so that one can determine the link to the changelog of a particular release with only version information. + return String.format("%s.adoc", changelogRelease.version); } } diff --git a/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/importer/MavenChanges.java b/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/importer/MavenChanges.java index be5fe682a3..3c01dadd5b 100644 --- a/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/importer/MavenChanges.java +++ b/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/importer/MavenChanges.java @@ -46,7 +46,7 @@ final class MavenChanges { final Element documentElement = readXmlFileRootElement(xmlPath, "document"); // Read the `body` element. - final Element bodyElement = XmlReader.childElementMatchingName(documentElement, "body"); + final Element bodyElement = XmlReader.requireChildElementMatchingName(documentElement, "body"); // Read releases. final List<Release> releases = new ArrayList<>(); diff --git a/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/releaser/ChangelogReleaser.java b/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/releaser/ChangelogReleaser.java index c4e47d1b66..6a8f0417f6 100644 --- a/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/releaser/ChangelogReleaser.java +++ b/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/releaser/ChangelogReleaser.java @@ -81,7 +81,7 @@ public final class ChangelogReleaser { final Element projectElement = XmlReader.readXmlFileRootElement(rootPomFile, "project"); // Read the `version` element. - final Element versionElement = XmlReader.childElementMatchingName(projectElement, "version"); + final Element versionElement = XmlReader.requireChildElementMatchingName(projectElement, "version"); final String version = trimNullable(versionElement.getTextContent()); if (isBlank(version)) { throw XmlReader.failureAtXmlNode(versionElement, "blank `version`: %s", version); diff --git a/src/site/asciidoc/changelog/unreleased.adoc b/src/site/asciidoc/changelog/2.x.x.adoc similarity index 99% rename from src/site/asciidoc/changelog/unreleased.adoc rename to src/site/asciidoc/changelog/2.x.x.adoc index dd33eb6dae..8f0c6372a2 100644 --- a/src/site/asciidoc/changelog/unreleased.adoc +++ b/src/site/asciidoc/changelog/2.x.x.adoc @@ -20,7 +20,7 @@ This file is automatically generated from the release changelog directory! //// -= Unreleased += 2.x.x Changes staged for the next version that is yet to be released. diff --git a/src/site/asciidoc/changelog/index.adoc b/src/site/asciidoc/changelog/index.adoc index f695267463..e202204cb4 100644 --- a/src/site/asciidoc/changelog/index.adoc +++ b/src/site/asciidoc/changelog/index.adoc @@ -22,7 +22,7 @@ This file is automatically generated from the release changelog directory! = Release changelogs -* xref:unreleased.adoc[Unreleased] +* xref:2.x.x.adoc[2.x.x] * [2022-09-09] xref:2.19.0.adoc[2.19.0] * [2022-06-28] xref:2.18.0.adoc[2.18.0] * [2022-02-23] xref:2.17.2.adoc[2.17.2]
