Author: brane
Date: Tue Sep 29 14:18:04 2020
New Revision: 1882127

URL: http://svn.apache.org/viewvc?rev=1882127&view=rev
Log:
Detect the next major version of macOS in 'svn --version --verbose'.

* subversion/libsvn_subr/sysinfo.c
  (macos_version_number): Replaces macos_minor_version.
  (product_name_from_version): Replaces product_name_from_minor_version.
  (release_name_from_version): Replaces release_name_from_minor_version.
  (macos_release_name): Use the updated functions to detect macOS 11 Big Sur.

Modified:
    subversion/trunk/subversion/libsvn_subr/sysinfo.c

Modified: subversion/trunk/subversion/libsvn_subr/sysinfo.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/sysinfo.c?rev=1882127&r1=1882126&r2=1882127&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/sysinfo.c (original)
+++ subversion/trunk/subversion/libsvn_subr/sysinfo.c Tue Sep 29 14:18:04 2020
@@ -1325,69 +1325,89 @@ value_from_dict(CFDictionaryRef plist, C
   return value;
 }
 
-/* Return the minor version the operating system, given the number in
-   a format that matches the regular expression /^10\.\d+(\..*)?$/ */
-static int
-macos_minor_version(const char *osver)
+/* Return the major and minor versions the operating system, given
+   the number in a format that matches the regular expression
+   /^\d+\.\d+(\..*)?$/ */
+static void
+macos_version_number(int *major, int *minor, const char *osver)
 {
   char *end = NULL;
   unsigned long num = strtoul(osver, &end, 10);
 
-  if (!end || *end != '.' || num != 10)
-    return -1;
+  if (!end || *end != '.' || num < 10)
+    return;
+
+  if (major)
+    *major = (int)num;
 
   osver = end + 1;
   end = NULL;
   num = strtoul(osver, &end, 10);
   if (!end || (*end && *end != '.'))
-    return -1;
+    return;
 
-  return (int)num;
+  if (minor)
+    *minor = (int)num;
 }
 
 /* Return the product name of the operating system. */
 static const char *
-product_name_from_minor_version(int minor, const char* product_name)
+product_name_from_version(int major, int minor, const char* product_name)
 {
   /* We can only do this if we know the official product name. */
   if (0 != strcmp(product_name, "Mac OS X"))
     return product_name;
 
-  if (minor <= 7)
-    return product_name;
+  if (major == 10)
+    {
+      if (minor <= 7)
+        return product_name;
 
-  if (minor <= 11)
-    return "OS X";
+      if (minor <= 11)
+        return "OS X";
+    }
 
   return "macOS";
 }
 
 /* Return the commercial name of the operating system. */
 static const char *
-release_name_from_minor_version(int minor, const char* product_name)
+release_name_from_version(int major, int minor, const char* product_name)
 {
   /* We can only do this if we know the official product name. */
   if (0 == strcmp(product_name, "Mac OS X"))
     {
       /* See https://en.wikipedia.org/wiki/MacOS_version_history#Releases */
-      switch(minor)
+      switch(major)
         {
-        case  0: return "Cheetah";
-        case  1: return "Puma";
-        case  2: return "Jaguar";
-        case  3: return "Panther";
-        case  4: return "Tiger";
-        case  5: return "Leopard";
-        case  6: return "Snow Leopard";
-        case  7: return "Lion";
-        case  8: return "Mountain Lion";
-        case  9: return "Mavericks";
-        case 10: return "Yosemite";
-        case 11: return "El Capitan";
-        case 12: return "Sierra";
-        case 13: return "High Sierra";
-        case 14: return "Mojave";
-        case 15: return "Catalina";
+        case 10:
+          switch(minor)
+            {
+            case  0: return "Cheetah";
+            case  1: return "Puma";
+            case  2: return "Jaguar";
+            case  3: return "Panther";
+            case  4: return "Tiger";
+            case  5: return "Leopard";
+            case  6: return "Snow Leopard";
+            case  7: return "Lion";
+            case  8: return "Mountain Lion";
+            case  9: return "Mavericks";
+            case 10: return "Yosemite";
+            case 11: return "El Capitan";
+            case 12: return "Sierra";
+            case 13: return "High Sierra";
+            case 14: return "Mojave";
+            case 15: return "Catalina";
+            }
+          break;
+
+        case 11:
+          switch(minor)
+            {
+            case  0: return "Big Sur";
+            }
+          break;
         }
     }
   return NULL;
@@ -1412,13 +1432,14 @@ macos_release_name(apr_pool_t *pool)
                                           CFSTR("ProductBuildVersion"),
                                           pool);
       const char *release;
-      int minor_version;
+      int major_version = -1;
+      int minor_version = -1;
 
       if (!osver)
         osver = value_from_dict(plist, CFSTR("ProductVersion"), pool);
-      minor_version = macos_minor_version(osver);
-      release = release_name_from_minor_version(minor_version, osname);
-      osname = product_name_from_minor_version(minor_version, osname);
+      macos_version_number(&major_version, &minor_version, osver);
+      release = release_name_from_version(major_version, minor_version, 
osname);
+      osname = product_name_from_version(major_version, minor_version, osname);
 
       CFRelease(plist);
       return apr_psprintf(pool, "%s%s%s%s%s%s%s%s",


Reply via email to