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:27 UTC

[logging-log4j2] 21/33: LOG4J2-3628 Switch unreleased directory name to `.unreleased-` pattern.

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 95dbc6c4f6122dd21d3299d2c05550014ab15f29
Author: Volkan Yazıcı <vo...@yazi.ci>
AuthorDate: Sun Nov 27 22:08:20 2022 +0100

    LOG4J2-3628 Switch unreleased directory name to `.unreleased-<releaseVersionMajor>` pattern.
---
 ...imestamp_to_ProducerRecord_in_KafkaAppender.xml |  0
 .../LOG4J2-3628_new_changelog_infra.xml            |  0
 ..._Configurator_setLevel_for_internal_classes.xml |  0
 ...Fix_level_propagation_in_Log4jBridgeHandler.xml |  0
 changelog/README.adoc                              | 10 ++--
 .../logging/log4j/internal/util/PomUtils.java      | 55 +++++++++++++++++++
 .../internal/util/changelog/ChangelogFiles.java    | 31 ++++++++++-
 .../util/changelog/exporter/AsciiDocExporter.java  | 61 ++++++++++------------
 .../changelog/importer/MavenChangesImporter.java   |  6 +--
 .../util/changelog/releaser/ChangelogReleaser.java | 35 ++++---------
 10 files changed, 128 insertions(+), 70 deletions(-)

diff --git a/changelog/.unreleased/LOG4J2-2678_Add_LogEvent_timestamp_to_ProducerRecord_in_KafkaAppender.xml b/changelog/.unreleased-2.x.x/LOG4J2-2678_Add_LogEvent_timestamp_to_ProducerRecord_in_KafkaAppender.xml
similarity index 100%
rename from changelog/.unreleased/LOG4J2-2678_Add_LogEvent_timestamp_to_ProducerRecord_in_KafkaAppender.xml
rename to changelog/.unreleased-2.x.x/LOG4J2-2678_Add_LogEvent_timestamp_to_ProducerRecord_in_KafkaAppender.xml
diff --git a/changelog/.unreleased/LOG4J2-3628_new_changelog_infra.xml b/changelog/.unreleased-2.x.x/LOG4J2-3628_new_changelog_infra.xml
similarity index 100%
rename from changelog/.unreleased/LOG4J2-3628_new_changelog_infra.xml
rename to changelog/.unreleased-2.x.x/LOG4J2-3628_new_changelog_infra.xml
diff --git a/changelog/.unreleased/LOG4J2-3631_Fix_Configurator_setLevel_for_internal_classes.xml b/changelog/.unreleased-2.x.x/LOG4J2-3631_Fix_Configurator_setLevel_for_internal_classes.xml
similarity index 100%
rename from changelog/.unreleased/LOG4J2-3631_Fix_Configurator_setLevel_for_internal_classes.xml
rename to changelog/.unreleased-2.x.x/LOG4J2-3631_Fix_Configurator_setLevel_for_internal_classes.xml
diff --git a/changelog/.unreleased/LOG4J2-3634_Fix_level_propagation_in_Log4jBridgeHandler.xml b/changelog/.unreleased-2.x.x/LOG4J2-3634_Fix_level_propagation_in_Log4jBridgeHandler.xml
similarity index 100%
rename from changelog/.unreleased/LOG4J2-3634_Fix_level_propagation_in_Log4jBridgeHandler.xml
rename to changelog/.unreleased-2.x.x/LOG4J2-3634_Fix_level_propagation_in_Log4jBridgeHandler.xml
diff --git a/changelog/README.adoc b/changelog/README.adoc
index c4a62a466f..ac4c4928d3 100644
--- a/changelog/README.adoc
+++ b/changelog/README.adoc
@@ -40,8 +40,8 @@ Generator will compile these files to emit a single `{generator-target-dir}/<rel
 [#unreleased-version-changelog]
 == Unreleased version changelog
 
-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`).
+Changelogs of upcoming release versions are stored in `.unreleased-<releaseVersionMajor>.x.x` directories.
+Compared to released version changelog directories (e.g., `20220909-2.10.0`), `.unreleased-<releaseVersionMajor>.x.x` directories only consist of changelog entry files (i.e., `[<issueId>_]<shortSummary>.xml`).
 
 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.
 
@@ -106,13 +106,13 @@ For release candidates, you don't need to change, add, commit anything next to w
 [#qa-deploy-release]
 === I am about to deploy a new Log4j _release_. Now what?
 
-. Create the `<releaseDate>-<releaseVersion>` (e.g., `20220909-2.10.0`) directory populated from `.unreleased` directory: `./mvnw -pl log4j-internal-util -P changelog-releaser`
-. Verify that `.unreleased` directory is emptied
+. Create the `<releaseDate>-<releaseVersion>` (e.g., `20220909-2.10.0`) directory populated from `.unreleased-<releaseVersionMajor>.x.x` directory: `./mvnw -pl log4j-internal-util -P changelog-releaser`
+. Verify that `.unreleased-<releaseVersionMajor>.x.x` directory is emptied
 . Verify that `<releaseDate>-<releaseVersion>` directory is created, and it contains `.intro.adoc`, `.release.xml`, and changelog entry files
 . Edit the created `.intro.adoc`
 . Generate AsciiDoc files: `./mvnw -pl log4j-internal-util`
 . Verify generated `{generator-target-dir}/<releaseVersion>.adoc` and `{generator-target-dir}/index.adoc` files
-. `git add` the created `<releaseDate>-<releaseVersion>` directory and commit it together with the emptied `.unreleased` directory
+. `git add` the created `<releaseDate>-<releaseVersion>` directory and commit it together with the emptied `.unreleased-<releaseVersionMajor>.x.x` directory
 
 [#qa-deploy-website]
 === I am about to generate the website for the new release. Now what?
diff --git a/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/PomUtils.java b/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/PomUtils.java
new file mode 100644
index 0000000000..c131327e08
--- /dev/null
+++ b/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/PomUtils.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+package org.apache.logging.log4j.internal.util;
+
+import org.w3c.dom.Element;
+
+import java.nio.file.Path;
+
+import static org.apache.logging.log4j.internal.util.StringUtils.isBlank;
+import static org.apache.logging.log4j.internal.util.StringUtils.trimNullable;
+
+public final class PomUtils {
+
+    private PomUtils() {}
+
+    public static int readRootPomVersionMajor(final Path projectRootDirectory) {
+        final String version = readRootPomVersion(projectRootDirectory);
+        return versionMajor(version);
+    }
+
+    public static String readRootPomVersion(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 version;
+    }
+
+    public static int versionMajor(final String version) {
+        return Integer.parseInt(version.split("\\.", 2)[0]);
+    }
+
+}
diff --git a/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/ChangelogFiles.java b/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/ChangelogFiles.java
index 899d252ce0..8578822c54 100644
--- a/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/ChangelogFiles.java
+++ b/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/ChangelogFiles.java
@@ -16,7 +16,12 @@
  */
 package org.apache.logging.log4j.internal.util.changelog;
 
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.nio.file.Files;
 import java.nio.file.Path;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 public final class ChangelogFiles {
 
@@ -26,8 +31,30 @@ public final class ChangelogFiles {
         return projectRootDirectory.resolve("changelog");
     }
 
-    public static Path unreleasedDirectory(final Path projectRootDirectory) {
-        return changelogDirectory(projectRootDirectory).resolve(".unreleased");
+    public static Path unreleasedDirectory(final Path projectRootDirectory, final int versionMajor) {
+        final String filename = String.format(".unreleased-%d.x.x", versionMajor);
+        return changelogDirectory(projectRootDirectory).resolve(filename);
+    }
+
+    public static Set<Integer> unreleasedDirectoryVersionMajors(final Path projectRootDirectory) {
+        final Path changelogDirectory = changelogDirectory(projectRootDirectory);
+        try {
+            return Files
+                    .walk(changelogDirectory, 1)
+                    .filter(path -> {
+                        return !path.equals(projectRootDirectory) &&                        // Skip the directory itself.
+                                path.getFileName().toString().startsWith(".unreleased-");   // Only select `.unreleased-*` directories.
+                    })
+                    .map(path -> {
+                        final String filename = path.getFileName().toString();
+                        final String versionMajor = filename.replaceFirst("^\\.unreleased-(\\d+)\\.x\\.x", "$1");
+                        return Integer.parseInt(versionMajor);
+                    })
+                    .collect(Collectors.toSet());
+        } catch (final IOException error) {
+            final String message = String.format("failed walking directory: `%s`", projectRootDirectory);
+            throw new UncheckedIOException(message, error);
+        }
     }
 
     public static Path releaseDirectory(
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 0f8492d2b1..d1c90cd9b8 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
@@ -16,6 +16,11 @@
  */
 package org.apache.logging.log4j.internal.util.changelog.exporter;
 
+import org.apache.logging.log4j.internal.util.AsciiDocUtils;
+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 java.io.IOException;
 import java.io.UncheckedIOException;
 import java.nio.charset.StandardCharsets;
@@ -28,16 +33,6 @@ import java.util.Map;
 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 {
 
     private static final String TARGET_RELATIVE_DIRECTORY = "src/site/asciidoc/changelog";
@@ -100,13 +95,20 @@ public final class AsciiDocExporter {
         }
 
         // Export unreleased.
-        final int releaseVersionMajor = readRootPomVersionMajor(args.projectRootDirectory);
-        final String releaseVersion = releaseVersionMajor + ".x.x";
-        final ChangelogRelease upcomingRelease = new ChangelogRelease(releaseVersion, null);
-        exportUnreleased(args.projectRootDirectory, upcomingRelease);
+        ChangelogFiles
+                .unreleasedDirectoryVersionMajors(args.projectRootDirectory)
+                .stream()
+                .sorted()
+                .forEach(upcomingReleaseVersionMajor -> {
+                    final Path upcomingReleaseDirectory =
+                            ChangelogFiles.unreleasedDirectory(args.projectRootDirectory, upcomingReleaseVersionMajor);
+                    final ChangelogRelease upcomingRelease = upcomingRelease(upcomingReleaseVersionMajor);
+                    exportUnreleased(args.projectRootDirectory, upcomingReleaseDirectory, upcomingRelease);
+                    System.out.format("exporting upcoming release directory: `%s`%n", upcomingReleaseDirectory);
+                    changelogReleases.add(upcomingRelease);
+                });
 
         // Export the release index.
-        changelogReleases.add(upcomingRelease);
         exportReleaseIndex(args.projectRootDirectory, changelogReleases);
 
     }
@@ -364,25 +366,11 @@ public final class AsciiDocExporter {
         }
     }
 
-    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);
+    private static void exportUnreleased(
+            final Path projectRootDirectory,
+            final Path upcomingReleaseDirectory,
+            final ChangelogRelease upcomingRelease) {
+        final List<ChangelogEntry> changelogEntries = readChangelogEntries(upcomingReleaseDirectory);
         try {
             exportRelease(projectRootDirectory, upcomingRelease, null, changelogEntries);
         } catch (final IOException error) {
@@ -390,6 +378,11 @@ public final class AsciiDocExporter {
         }
     }
 
+    private static ChangelogRelease upcomingRelease(final int versionMajor) {
+        final String releaseVersion = versionMajor + ".x.x";
+        return new ChangelogRelease(releaseVersion, null);
+    }
+
     private static void exportReleaseIndex(
             final Path projectRootDirectory,
             final List<ChangelogRelease> changelogReleases) {
diff --git a/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/importer/MavenChangesImporter.java b/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/importer/MavenChangesImporter.java
index 7f2c088218..8122b05d2a 100644
--- a/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/importer/MavenChangesImporter.java
+++ b/log4j-internal-util/src/main/java/org/apache/logging/log4j/internal/util/changelog/importer/MavenChangesImporter.java
@@ -20,6 +20,7 @@ import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.logging.log4j.internal.util.PomUtils;
 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;
@@ -43,9 +44,8 @@ public final class MavenChangesImporter {
     }
 
     private static void writeUnreleased(final Path projectRootDirectory, final MavenChanges.Release release) {
-        final Path releaseDirectory = ChangelogFiles
-                .changelogDirectory(projectRootDirectory)
-                .resolve(".unreleased");
+        final int releaseVersionMajor = PomUtils.readRootPomVersionMajor(projectRootDirectory);
+        final Path releaseDirectory = ChangelogFiles.unreleasedDirectory(projectRootDirectory, releaseVersionMajor);
         release.actions.forEach(action -> writeAction(releaseDirectory, action));
     }
 
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 6a8f0417f6..d86da41bd5 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
@@ -16,20 +16,17 @@
  */
 package org.apache.logging.log4j.internal.util.changelog.releaser;
 
+import org.apache.logging.log4j.internal.util.AsciiDocUtils;
+import org.apache.logging.log4j.internal.util.PomUtils;
+import org.apache.logging.log4j.internal.util.changelog.ChangelogFiles;
+import org.apache.logging.log4j.internal.util.changelog.ChangelogRelease;
+
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.time.LocalDate;
 
-import org.apache.logging.log4j.internal.util.AsciiDocUtils;
-import org.apache.logging.log4j.internal.util.XmlReader;
-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 java.time.format.DateTimeFormatter.BASIC_ISO_DATE;
-import static org.apache.logging.log4j.internal.util.StringUtils.isBlank;
-import static org.apache.logging.log4j.internal.util.StringUtils.trimNullable;
 import static org.apache.logging.log4j.internal.util.changelog.ChangelogFiles.releaseDirectory;
 
 public final class ChangelogReleaser {
@@ -43,14 +40,16 @@ public final class ChangelogReleaser {
 
         // Read the release date and version.
         final String releaseDate = BASIC_ISO_DATE.format(LocalDate.now());
-        final String releaseVersion = readReleaseVersion(args.projectRootDirectory);
+        final String releaseVersion = PomUtils.readRootPomVersion(args.projectRootDirectory);
+        final int releaseVersionMajor = PomUtils.versionMajor(releaseVersion);
         System.out.format(
                 "using `%s` and `%s` for release date and version, respectively%n",
                 releaseDate, releaseVersion);
 
         // Move unreleased directory to a release directory.
         final Path releaseDirectory = releaseDirectory(args.projectRootDirectory, releaseDate, releaseVersion);
-        final Path unreleasedDirectory = ChangelogFiles.unreleasedDirectory(args.projectRootDirectory);
+        final Path unreleasedDirectory =
+                ChangelogFiles.unreleasedDirectory(args.projectRootDirectory, releaseVersionMajor);
         if (!Files.exists(unreleasedDirectory)) {
             final String message = String.format(
                     "`%s` does not exist! A release without any changelogs don't make sense!",
@@ -74,20 +73,4 @@ public final class ChangelogReleaser {
 
     }
 
-    private static String readReleaseVersion(final Path projectRootDirectory) {
-
-        // Read the root `project` element.
-        final Path rootPomFile = projectRootDirectory.resolve("pom.xml");
-        final Element projectElement = XmlReader.readXmlFileRootElement(rootPomFile, "project");
-
-        // Read the `version` element.
-        final Element versionElement = XmlReader.requireChildElementMatchingName(projectElement, "version");
-        final String version = trimNullable(versionElement.getTextContent());
-        if (isBlank(version)) {
-            throw XmlReader.failureAtXmlNode(versionElement, "blank `version`: %s", version);
-        }
-        return version;
-
-    }
-
 }