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));
         }
     }
 

Reply via email to