This is an automated email from the ASF dual-hosted git repository. vy pushed a commit to branch LOG4J2-3628 in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git
commit 30f871b152859d5501ab1af3e8542d75978f2362 Author: Volkan Yazıcı <[email protected]> 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; - - } - }
