You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by vy...@apache.org on 2022/12/19 10:21:25 UTC

[logging-log4j2] 19/33: LOG4J2-3628 Rename `unreleased.adoc` to `.x.x.adoc`.

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ı <vo...@yazi.ci>
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]