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",