This is an automated email from the ASF dual-hosted git repository. kwin pushed a commit to branch feature/MNG-5726-regex-os-version-matching in repository https://gitbox.apache.org/repos/asf/maven.git
commit 8e79ecc0e593a09b21381130e08b55c6fe680f0d Author: Konrad Windszus <k...@apache.org> AuthorDate: Fri Feb 23 12:16:11 2024 +0100 [MNG-5726] Support regular expression matching in profile activation for OS version This requires using the reserved prefix "regex:" in the version element. --- .../OperatingSystemProfileActivator.java | 51 +++++++++++++--------- .../src/main/java/org/apache/maven/utils/Os.java | 45 ++++++++++++------- 2 files changed, 60 insertions(+), 36 deletions(-) diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/profile/activation/OperatingSystemProfileActivator.java b/maven-model-builder/src/main/java/org/apache/maven/model/profile/activation/OperatingSystemProfileActivator.java index 8f0af6aa12..8afc691565 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/profile/activation/OperatingSystemProfileActivator.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/profile/activation/OperatingSystemProfileActivator.java @@ -21,6 +21,8 @@ package org.apache.maven.model.profile.activation; import javax.inject.Named; import javax.inject.Singleton; +import java.util.Locale; + import org.apache.maven.model.Activation; import org.apache.maven.model.ActivationOS; import org.apache.maven.model.Profile; @@ -37,6 +39,8 @@ import org.apache.maven.utils.Os; @Singleton public class OperatingSystemProfileActivator implements ProfileActivator { + private static final String REGEX_PREFIX = "regex:"; + @Override public boolean isActive(Profile profile, ProfileActivationContext context, ModelProblemCollector problems) { Activation activation = profile.getActivation(); @@ -53,17 +57,21 @@ public class OperatingSystemProfileActivator implements ProfileActivator { boolean active = ensureAtLeastOneNonNull(os); + String actualOsName = context.getSystemProperties().get("os.name").toLowerCase(Locale.ENGLISH); + String actualOsArch = context.getSystemProperties().get("os.arch").toLowerCase(Locale.ENGLISH); + String actualOsVersion = context.getSystemProperties().get("os.version").toLowerCase(Locale.ENGLISH); + if (active && os.getFamily() != null) { - active = determineFamilyMatch(os.getFamily()); + active = determineFamilyMatch(os.getFamily(), actualOsName); } if (active && os.getName() != null) { - active = determineNameMatch(os.getName()); + active = determineNameMatch(os.getName(), actualOsName); } if (active && os.getArch() != null) { - active = determineArchMatch(os.getArch()); + active = determineArchMatch(os.getArch(), actualOsArch); } if (active && os.getVersion() != null) { - active = determineVersionMatch(os.getVersion()); + active = determineVersionMatch(os.getVersion(), actualOsVersion); } return active; @@ -86,22 +94,25 @@ public class OperatingSystemProfileActivator implements ProfileActivator { return os.getArch() != null || os.getFamily() != null || os.getName() != null || os.getVersion() != null; } - private boolean determineVersionMatch(String version) { - String test = version; + private boolean determineVersionMatch(String expectedVersion, String actualVersion) { + String test = expectedVersion; boolean reverse = false; - - if (test.startsWith("!")) { - reverse = true; - test = test.substring(1); + final boolean result; + if (test.startsWith(REGEX_PREFIX)) { + result = actualVersion.matches(test.substring(REGEX_PREFIX.length())); + } else { + if (test.startsWith("!")) { + reverse = true; + test = test.substring(1); + } + result = actualVersion.equals(test); } - boolean result = Os.OS_VERSION.equals(test); - return reverse != result; } - private boolean determineArchMatch(String arch) { - String test = arch; + private boolean determineArchMatch(String expectedArch, String actualArch) { + String test = expectedArch; boolean reverse = false; if (test.startsWith("!")) { @@ -109,13 +120,13 @@ public class OperatingSystemProfileActivator implements ProfileActivator { test = test.substring(1); } - boolean result = Os.OS_ARCH.equals(test); + boolean result = actualArch.equals(test); return reverse != result; } - private boolean determineNameMatch(String name) { - String test = name; + private boolean determineNameMatch(String expectedName, String actualName) { + String test = expectedName; boolean reverse = false; if (test.startsWith("!")) { @@ -123,12 +134,12 @@ public class OperatingSystemProfileActivator implements ProfileActivator { test = test.substring(1); } - boolean result = Os.OS_NAME.equals(test); + boolean result = actualName.equals(test); return reverse != result; } - private boolean determineFamilyMatch(String family) { + private boolean determineFamilyMatch(String family, String actualName) { String test = family; boolean reverse = false; @@ -137,7 +148,7 @@ public class OperatingSystemProfileActivator implements ProfileActivator { test = test.substring(1); } - boolean result = Os.isFamily(test); + boolean result = Os.isFamily(test, actualName); return reverse != result; } diff --git a/maven-model-builder/src/main/java/org/apache/maven/utils/Os.java b/maven-model-builder/src/main/java/org/apache/maven/utils/Os.java index f4ae42d7a7..3bc84fcec1 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/utils/Os.java +++ b/maven-model-builder/src/main/java/org/apache/maven/utils/Os.java @@ -148,18 +148,31 @@ public class Os { * */ public static boolean isFamily(String family) { + return isFamily(family, OS_NAME); + } + + /** + * Determines if the OS on which Maven is executing matches the + * given OS family derived from the given OS name + * + * @param family the family to check for + * @param actualOsName the OS name to check against + * @return true if the OS matches + * + */ + public static boolean isFamily(String family, String actualOsName) { // windows probing logic relies on the word 'windows' in the OS - boolean isWindows = OS_NAME.contains(FAMILY_WINDOWS); + boolean isWindows = actualOsName.contains(FAMILY_WINDOWS); boolean is9x = false; boolean isNT = false; if (isWindows) { // there are only four 9x platforms that we look for - is9x = (OS_NAME.contains("95") - || OS_NAME.contains("98") - || OS_NAME.contains("me") + is9x = (actualOsName.contains("95") + || actualOsName.contains("98") + || actualOsName.contains("me") // wince isn't really 9x, but crippled enough to // be a muchness. Maven doesnt run on CE, anyway. - || OS_NAME.contains("ce")); + || actualOsName.contains("ce")); isNT = !is9x; } switch (family) { @@ -170,27 +183,27 @@ public class Os { case FAMILY_NT: return isWindows && isNT; case FAMILY_OS2: - return OS_NAME.contains(FAMILY_OS2); + return actualOsName.contains(FAMILY_OS2); case FAMILY_NETWARE: - return OS_NAME.contains(FAMILY_NETWARE); + return actualOsName.contains(FAMILY_NETWARE); case FAMILY_DOS: - return PATH_SEP.equals(";") && !isFamily(FAMILY_NETWARE) && !isWindows; + return PATH_SEP.equals(";") && !isFamily(FAMILY_NETWARE, actualOsName) && !isWindows; case FAMILY_MAC: - return OS_NAME.contains(FAMILY_MAC) || OS_NAME.contains(DARWIN); + return actualOsName.contains(FAMILY_MAC) || actualOsName.contains(DARWIN); case FAMILY_TANDEM: - return OS_NAME.contains("nonstop_kernel"); + return actualOsName.contains("nonstop_kernel"); case FAMILY_UNIX: return PATH_SEP.equals(":") - && !isFamily(FAMILY_OPENVMS) - && (!isFamily(FAMILY_MAC) || OS_NAME.endsWith("x")); + && !isFamily(FAMILY_OPENVMS, actualOsName) + && (!isFamily(FAMILY_MAC, actualOsName) || actualOsName.endsWith("x")); case FAMILY_ZOS: - return OS_NAME.contains(FAMILY_ZOS) || OS_NAME.contains(FAMILY_OS390); + return actualOsName.contains(FAMILY_ZOS) || actualOsName.contains(FAMILY_OS390); case FAMILY_OS400: - return OS_NAME.contains(FAMILY_OS400); + return actualOsName.contains(FAMILY_OS400); case FAMILY_OPENVMS: - return OS_NAME.contains(FAMILY_OPENVMS); + return actualOsName.contains(FAMILY_OPENVMS); default: - return OS_NAME.contains(family.toLowerCase(Locale.US)); + return actualOsName.contains(family.toLowerCase(Locale.US)); } }