You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ju...@apache.org on 2022/01/14 14:01:51 UTC

svn commit: r1897034 [23/37] - in /subversion/branches/multi-wc-format: ./ build/ build/ac-macros/ build/generator/ build/generator/swig/ build/generator/templates/ contrib/client-side/ contrib/client-side/svn_load_dirs/ contrib/hook-scripts/ contrib/s...

Modified: subversion/branches/multi-wc-format/subversion/libsvn_subr/stream.c
URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/libsvn_subr/stream.c?rev=1897034&r1=1897033&r2=1897034&view=diff
==============================================================================
--- subversion/branches/multi-wc-format/subversion/libsvn_subr/stream.c (original)
+++ subversion/branches/multi-wc-format/subversion/libsvn_subr/stream.c Fri Jan 14 14:01:45 2022
@@ -922,7 +922,7 @@ readline_apr_lf(apr_file_t *file,
       }
 
     /* Otherwise, prepare to read the next chunk. */
-    svn_stringbuf_ensure(buf, buf->blocksize + SVN__LINE_CHUNK_SIZE);
+    svn_stringbuf_ensure(buf, buf->len + SVN__LINE_CHUNK_SIZE);
   }
 }
 
@@ -982,7 +982,7 @@ readline_apr_generic(apr_file_t *file,
         }
 
       /* Prepare to read the next chunk. */
-      svn_stringbuf_ensure(buf, buf->blocksize + SVN__LINE_CHUNK_SIZE);
+      svn_stringbuf_ensure(buf, buf->len + SVN__LINE_CHUNK_SIZE);
     }
 }
 
@@ -2172,6 +2172,9 @@ struct install_baton_t
 {
   struct baton_apr baton_apr;
   const char *tmp_path;
+  svn_boolean_t set_read_only;
+  svn_boolean_t set_executable;
+  apr_time_t set_mtime;
 };
 
 #ifdef WIN32
@@ -2313,6 +2316,9 @@ svn_stream__create_for_install(svn_strea
   (*install_stream)->baton = ib;
 
   ib->tmp_path = tmp_path;
+  ib->set_read_only = FALSE;
+  ib->set_executable = FALSE;
+  ib->set_mtime = -1;
 
   /* Don't close the file on stream close; flush instead */
   svn_stream_set_close(*install_stream, install_close);
@@ -2320,6 +2326,178 @@ svn_stream__create_for_install(svn_strea
   return SVN_NO_ERROR;
 }
 
+void
+svn_stream__install_set_read_only(svn_stream_t *install_stream,
+                                  svn_boolean_t read_only)
+{
+  struct install_baton_t *ib = install_stream->baton;
+
+  ib->set_read_only = read_only;
+}
+
+void
+svn_stream__install_set_executable(svn_stream_t *install_stream,
+                                   svn_boolean_t executable)
+{
+  struct install_baton_t *ib = install_stream->baton;
+
+  ib->set_executable = executable;
+}
+
+void
+svn_stream__install_set_affected_time(svn_stream_t *install_stream,
+                                      apr_time_t mtime)
+{
+  struct install_baton_t *ib = install_stream->baton;
+
+  ib->set_mtime = mtime;
+}
+
+/* Helper function that closes the underlying file of the install stream
+   and update the state in the baton. */
+static svn_error_t *
+install_stream_close_file(struct install_baton_t *ib,
+                          apr_pool_t *scratch_pool)
+{
+  if (ib->baton_apr.file)
+    {
+      SVN_ERR(svn_io_file_close(ib->baton_apr.file, scratch_pool));
+      ib->baton_apr.file = NULL;
+    }
+
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_stream__install_finalize(apr_time_t *mtime_p,
+                             apr_off_t *size_p,
+                             svn_stream_t *install_stream,
+                             apr_pool_t *scratch_pool)
+{
+  struct install_baton_t *ib = install_stream->baton;
+  svn_boolean_t finalized = FALSE;
+  apr_finfo_t finfo;
+  apr_int32_t wanted;
+
+#ifdef WIN32
+  /* If the caller asked us for the timestamp with a non-null MTIME_P,
+     ensure that subsequent I/O operations won't change it; see below.
+   */
+  if (ib->set_mtime >= 0 || ib->set_read_only || mtime_p)
+    {
+      apr_time_t set_mtime;
+      svn_error_t *err;
+
+      /* On Windows, the file systems may defer processing of timestamps until
+         the file handle is closed, as specified in [1].  Since we peek and
+         return the current timestamp, we MUST ensure that the timestamp does
+         not change after the call to finalize().
+
+         Luckily, there are two options that guarantee that the file will keep
+         its current timestamp after close.  We can either explicitly set a new
+         timestamp, or use a special option that instructs the file system to
+         suspend updates for timestamp values for all subsequent I/O operations.
+         Both of these options guarantee [2, 3] that no other operation will
+         change the final timestamp.  So we use both of them, depending on
+         whether the caller wants us to set a specific timestamp, or not.
+
+         [1: MS-FSA, 2.1.4.17, Note <42>]
+         File systems may choose to defer processing for a file that has been
+         modified to a later time, favoring performance over accuracy. The NTFS
+         file system on versions prior to Windows 10 v1809 operating system,
+         Windows Server v1809 operating system, and Windows Server 2019, and
+         non-NTFS file systems on all versions of Windows, defer this processing
+         until the Open gets closed.
+         https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fsa/4e3695bd-7574-4f24-a223-b4679c065b63#Appendix_A_42
+
+         [2: MS-FSA 2.1.5.14.2]
+         If InputBuffer.LastWriteTime != 0:
+           If InputBuffer.LastWriteTime != -2:
+             The object store MUST set Open.UserSetModificationTime to TRUE.
+         https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fsa/a36513b4-73c8-4888-ad29-8f3a196567e8
+
+         [3: MS-FSA 2.1.4.17]
+         If Open.UserSetModificationTime is FALSE, set Open.File.LastModificationTime
+         to the current system time.
+         https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fsa/75cdaba1-4401-4c53-b09c-69ba6cd50ce6
+       */
+      if (ib->set_mtime >= 0)
+        set_mtime = ib->set_mtime;
+      else
+        set_mtime = SVN_IO__WIN_TIME_SUSPEND_UPDATE;
+
+      err = svn_io__win_set_file_basic_info(ib->baton_apr.file, ib->tmp_path,
+                                            set_mtime, ib->set_read_only,
+                                            scratch_pool);
+
+      if (err && err->apr_err == SVN_ERR_UNSUPPORTED_FEATURE)
+        {
+          /* Setting information by handle is not supported on this platform:
+             fallback to setting it by path. */
+          svn_error_clear(err);
+        }
+      else if (err)
+        {
+          return svn_error_trace(err);
+        }
+      else
+        {
+          finalized = TRUE;
+        }
+    }
+  else
+    {
+      finalized = TRUE;
+    }
+#endif
+
+  if (!finalized)
+    {
+      SVN_ERR(install_stream_close_file(ib, scratch_pool));
+
+      if (ib->set_read_only)
+        SVN_ERR(svn_io_set_file_read_only(ib->tmp_path, FALSE,
+                                          scratch_pool));
+      if (ib->set_executable)
+        SVN_ERR(svn_io_set_file_executable(ib->tmp_path, TRUE, FALSE,
+                                           scratch_pool));
+      if (ib->set_mtime >= 0)
+        SVN_ERR(svn_io_set_file_affected_time(ib->set_mtime, ib->tmp_path,
+                                              scratch_pool));
+
+      finalized = TRUE;
+    }
+
+  wanted = 0;
+  if (mtime_p)
+    wanted |= APR_FINFO_MTIME;
+  if (size_p)
+    wanted |= APR_FINFO_SIZE;
+
+  /* Note that we always fetch the values such as MTIME_P from the filesystem,
+     because it might have a lower timestamp granularity than apr_time_t.
+   */
+  if (wanted)
+    {
+      apr_status_t status;
+
+      if (ib->baton_apr.file)
+        status = apr_file_info_get(&finfo, wanted, ib->baton_apr.file);
+      else
+        status = apr_stat(&finfo, ib->tmp_path, wanted, scratch_pool);
+
+      if (status)
+        return svn_error_wrap_apr(status, NULL);
+    }
+
+  if (mtime_p)
+    *mtime_p = finfo.mtime;
+  if (size_p)
+    *size_p = finfo.size;
+
+  return SVN_NO_ERROR;
+}
+
 svn_error_t *
 svn_stream__install_stream(svn_stream_t *install_stream,
                            const char *final_abspath,
@@ -2330,47 +2508,49 @@ svn_stream__install_stream(svn_stream_t
   svn_error_t *err;
 
   SVN_ERR_ASSERT(svn_dirent_is_absolute(final_abspath));
-#ifdef WIN32
-  err = svn_io__win_rename_open_file(ib->baton_apr.file,  ib->tmp_path,
-                                     final_abspath, scratch_pool);
-  if (make_parents && err && APR_STATUS_IS_ENOENT(err->apr_err))
-    {
-      svn_error_t *err2;
-
-      err2 = svn_io_make_dir_recursively(svn_dirent_dirname(final_abspath,
-                                                    scratch_pool),
-                                         scratch_pool);
-
-      if (err2)
-        return svn_error_trace(svn_error_compose_create(err, err2));
-      else
-        svn_error_clear(err);
 
+  if (ib->baton_apr.file)
+    {
+#ifdef WIN32
       err = svn_io__win_rename_open_file(ib->baton_apr.file, ib->tmp_path,
                                          final_abspath, scratch_pool);
-    }
+      if (make_parents && err && APR_STATUS_IS_ENOENT(err->apr_err))
+        {
+          svn_error_t *err2;
 
-  /* ### rhuijben: I wouldn't be surprised if we later find out that we
-                   have to fall back to close+rename on some specific
-                   error values here, to support some non standard NAS
-                   and filesystem scenarios. */
-  if (err && err->apr_err == SVN_ERR_UNSUPPORTED_FEATURE)
-    {
-      /* Rename open files is not supported on this platform: fallback to
-         svn_io_file_rename2(). */
-      svn_error_clear(err);
-      err = SVN_NO_ERROR;
-    }
-  else
-    {
-      return svn_error_compose_create(err,
-                                      svn_io_file_close(ib->baton_apr.file,
-                                                        scratch_pool));
-    }
+          err2 = svn_io_make_dir_recursively(svn_dirent_dirname(final_abspath,
+                                                                scratch_pool),
+                                             scratch_pool);
+
+          if (err2)
+            return svn_error_trace(svn_error_compose_create(err, err2));
+          else
+            svn_error_clear(err);
+
+          err = svn_io__win_rename_open_file(ib->baton_apr.file, ib->tmp_path,
+                                             final_abspath, scratch_pool);
+        }
+
+        /* ### rhuijben: I wouldn't be surprised if we later find out that we
+                         have to fall back to close+rename on some specific
+                         error values here, to support some non standard NAS
+                         and filesystem scenarios. */
+        if (err && err->apr_err == SVN_ERR_UNSUPPORTED_FEATURE)
+          {
+            /* Rename open files is not supported on this platform: fallback to
+               svn_io_file_rename2(). */
+            svn_error_clear(err);
+            err = SVN_NO_ERROR;
+          }
+        else
+          {
+            return svn_error_compose_create(
+                     err, install_stream_close_file(ib, scratch_pool));
+          }
 #endif
 
-  /* Close temporary file. */
-  SVN_ERR(svn_io_file_close(ib->baton_apr.file, scratch_pool));
+        SVN_ERR(install_stream_close_file(ib, scratch_pool));
+    }
 
   err = svn_io_file_rename2(ib->tmp_path, final_abspath, FALSE, scratch_pool);
 
@@ -2399,47 +2579,33 @@ svn_stream__install_stream(svn_stream_t
 }
 
 svn_error_t *
-svn_stream__install_get_info(apr_finfo_t *finfo,
-                             svn_stream_t *install_stream,
-                             apr_int32_t wanted,
-                             apr_pool_t *scratch_pool)
-{
-  struct install_baton_t *ib = install_stream->baton;
-  apr_status_t status;
-
-  status = apr_file_info_get(finfo, wanted, ib->baton_apr.file);
-
-  if (status)
-    return svn_error_wrap_apr(status, NULL);
-
-  return SVN_NO_ERROR;
-}
-
-svn_error_t *
 svn_stream__install_delete(svn_stream_t *install_stream,
                            apr_pool_t *scratch_pool)
 {
   struct install_baton_t *ib = install_stream->baton;
 
+  if (ib->baton_apr.file)
+    {
 #ifdef WIN32
-  svn_error_t *err;
+      svn_error_t *err;
 
-  /* Mark the file as delete on close to avoid having to reopen
-     the file as part of the delete handling. */
-  err = svn_io__win_delete_file_on_close(ib->baton_apr.file,  ib->tmp_path,
-                                         scratch_pool);
-  if (err == SVN_NO_ERROR)
-    {
-      SVN_ERR(svn_io_file_close(ib->baton_apr.file, scratch_pool));
-      return SVN_NO_ERROR; /* File is already gone */
-    }
+      /* Mark the file as delete on close to avoid having to reopen
+         the file as part of the delete handling. */
+      err = svn_io__win_delete_file_on_close(ib->baton_apr.file, ib->tmp_path,
+                                             scratch_pool);
+      if (err == SVN_NO_ERROR)
+        {
+          SVN_ERR(install_stream_close_file(ib, scratch_pool));
+          return SVN_NO_ERROR; /* File is already gone */
+        }
 
-  /* Deleting file on close may be unsupported, so ignore errors and
-     fallback to svn_io_remove_file2(). */
-  svn_error_clear(err);
+      /* Deleting file on close may be unsupported, so ignore errors and
+         fallback to svn_io_remove_file2(). */
+      svn_error_clear(err);
 #endif
 
-  SVN_ERR(svn_io_file_close(ib->baton_apr.file, scratch_pool));
+      SVN_ERR(install_stream_close_file(ib, scratch_pool));
+    }
 
   return svn_error_trace(svn_io_remove_file2(ib->tmp_path, FALSE,
                                              scratch_pool));

Modified: subversion/branches/multi-wc-format/subversion/libsvn_subr/string.c
URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/libsvn_subr/string.c?rev=1897034&r1=1897033&r2=1897034&view=diff
==============================================================================
--- subversion/branches/multi-wc-format/subversion/libsvn_subr/string.c (original)
+++ subversion/branches/multi-wc-format/subversion/libsvn_subr/string.c Fri Jan 14 14:01:45 2022
@@ -65,7 +65,7 @@ membuf_create(void **data, apr_size_t *s
  * this function does nothing.
  *
  * If *SIZE is 0, the allocated buffer size will be MINIMUM_SIZE
- * rounded up to the nearest APR alignment boundary. Otherwse, *SIZE
+ * rounded up to the nearest APR alignment boundary. Otherwise, *SIZE
  * will be multiplied by a power of two such that the result is
  * greater or equal to MINIMUM_SIZE. The pointer to the new buffer
  * will be returned in *DATA, and its size in *SIZE.

Modified: subversion/branches/multi-wc-format/subversion/libsvn_subr/subst.c
URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/libsvn_subr/subst.c?rev=1897034&r1=1897033&r2=1897034&view=diff
==============================================================================
--- subversion/branches/multi-wc-format/subversion/libsvn_subr/subst.c (original)
+++ subversion/branches/multi-wc-format/subversion/libsvn_subr/subst.c Fri Jan 14 14:01:45 2022
@@ -111,7 +111,8 @@ svn_subst_translation_required(svn_subst
                                svn_boolean_t special,
                                svn_boolean_t force_eol_check)
 {
-  return (special || keywords
+  return (special
+          || (keywords && apr_hash_count(keywords) > 0)
           || (style != svn_subst_eol_style_none && force_eol_check)
           || (style == svn_subst_eol_style_native &&
               strcmp(APR_EOL_STR, SVN_SUBST_NATIVE_EOL_STR) != 0)
@@ -1483,10 +1484,6 @@ stream_translated(svn_stream_t *stream,
                   svn_boolean_t expand,
                   apr_pool_t *result_pool)
 {
-  struct translated_stream_baton *baton
-    = apr_palloc(result_pool, sizeof(*baton));
-  svn_stream_t *s = svn_stream_create(baton, result_pool);
-
   /* Make sure EOL_STR and KEYWORDS are allocated in RESULT_POOL
      so they have the same lifetime as the stream. */
   if (eol_str)
@@ -1519,32 +1516,44 @@ stream_translated(svn_stream_t *stream,
         }
     }
 
-  /* Setup the baton fields */
-  baton->stream = stream;
-  baton->in_baton
-    = create_translation_baton(eol_str, translated_eol, repair, keywords,
-                               expand, result_pool);
-  baton->out_baton
-    = create_translation_baton(eol_str, translated_eol, repair, keywords,
-                               expand, result_pool);
-  baton->written = FALSE;
-  baton->readbuf = svn_stringbuf_create_empty(result_pool);
-  baton->readbuf_off = 0;
-  baton->iterpool = svn_pool_create(result_pool);
-  baton->buf = apr_palloc(result_pool, SVN__TRANSLATION_BUF_SIZE);
-
-  /* Setup the stream methods */
-  svn_stream_set_read2(s, NULL /* only full read support */,
-                       translated_stream_read);
-  svn_stream_set_write(s, translated_stream_write);
-  svn_stream_set_close(s, translated_stream_close);
-  if (svn_stream_supports_mark(stream))
+  if (eol_str || keywords)
     {
-      svn_stream_set_mark(s, translated_stream_mark);
-      svn_stream_set_seek(s, translated_stream_seek);
-    }
+      struct translated_stream_baton *baton
+        = apr_palloc(result_pool, sizeof(*baton));
+      svn_stream_t *s = svn_stream_create(baton, result_pool);
+
+      /* Setup the baton fields */
+      baton->stream = stream;
+      baton->in_baton
+        = create_translation_baton(eol_str, translated_eol, repair, keywords,
+                                   expand, result_pool);
+      baton->out_baton
+        = create_translation_baton(eol_str, translated_eol, repair, keywords,
+                                   expand, result_pool);
+      baton->written = FALSE;
+      baton->readbuf = svn_stringbuf_create_empty(result_pool);
+      baton->readbuf_off = 0;
+      baton->iterpool = svn_pool_create(result_pool);
+      baton->buf = apr_palloc(result_pool, SVN__TRANSLATION_BUF_SIZE);
+
+      /* Setup the stream methods */
+      svn_stream_set_read2(s, NULL /* only full read support */,
+                           translated_stream_read);
+      svn_stream_set_write(s, translated_stream_write);
+      svn_stream_set_close(s, translated_stream_close);
+      if (svn_stream_supports_mark(stream))
+        {
+          svn_stream_set_mark(s, translated_stream_mark);
+          svn_stream_set_seek(s, translated_stream_seek);
+        }
 
-  return s;
+      return s;
+    }
+  else
+    {
+      /* No translation is necessary, return the original stream. */
+      return stream;
+    }
 }
 
 svn_stream_t *

Modified: subversion/branches/multi-wc-format/subversion/libsvn_subr/sysinfo.c
URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/libsvn_subr/sysinfo.c?rev=1897034&r1=1897033&r2=1897034&view=diff
==============================================================================
--- subversion/branches/multi-wc-format/subversion/libsvn_subr/sysinfo.c (original)
+++ subversion/branches/multi-wc-format/subversion/libsvn_subr/sysinfo.c Fri Jan 14 14:01:45 2022
@@ -1,3 +1,4 @@
+
 /*
  * sysinfo.c :  information about the running system
  *
@@ -689,8 +690,8 @@ parse_pointer_value(const char *start, c
       || *end >= limit)         /* representation too long */
     return NULL;
 
-  ptr = (const unsigned char*)val;
-  if (val != (apr_uint64_t)ptr)  /* truncated value */
+  ptr = (const unsigned char*)(apr_uintptr_t)val;
+  if (val != (apr_uintptr_t)ptr)/* truncated value */
     return NULL;
 
   return ptr;
@@ -1076,7 +1077,7 @@ win32_release_name(apr_pool_t *pool)
 
 
 /* Get a list of handles of shared libs loaded by the current
-   process. Returns a NULL-terminated array alocated from POOL. */
+   process. Returns a NULL-terminated array allocated from POOL. */
 static HMODULE *
 enum_loaded_modules(apr_pool_t *pool)
 {
@@ -1324,68 +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 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;
@@ -1410,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",

Modified: subversion/branches/multi-wc-format/subversion/libsvn_subr/temp_serializer.c
URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/libsvn_subr/temp_serializer.c?rev=1897034&r1=1897033&r2=1897034&view=diff
==============================================================================
--- subversion/branches/multi-wc-format/subversion/libsvn_subr/temp_serializer.c (original)
+++ subversion/branches/multi-wc-format/subversion/libsvn_subr/temp_serializer.c Fri Jan 14 14:01:45 2022
@@ -143,7 +143,7 @@ svn_temp_serializer__init(const void *so
  * been serialized to BUFFER but contains references to new objects yet to
  * serialize. The current size of the serialized data is given in
  * CURRENTLY_USED. If the allocated data buffer is actually larger, you may
- * specifiy that in CURRENTLY_ALLOCATED to prevent unnecessary allocations.
+ * specify that in CURRENTLY_ALLOCATED to prevent unnecessary allocations.
  * Otherwise, set it to 0. All allocations will be made from POOl.
  */
 svn_temp_serializer__context_t *
@@ -261,7 +261,7 @@ svn_temp_serializer__push(svn_temp_seria
     svn_stringbuf_appendbytes(context->buffer, source, struct_size);
 }
 
-/* Remove the lastest structure from the stack.
+/* Remove the latest structure from the stack.
  */
 void
 svn_temp_serializer__pop(svn_temp_serializer__context_t *context)

Modified: subversion/branches/multi-wc-format/subversion/libsvn_subr/utf.c
URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/libsvn_subr/utf.c?rev=1897034&r1=1897033&r2=1897034&view=diff
==============================================================================
--- subversion/branches/multi-wc-format/subversion/libsvn_subr/utf.c (original)
+++ subversion/branches/multi-wc-format/subversion/libsvn_subr/utf.c Fri Jan 14 14:01:45 2022
@@ -72,7 +72,7 @@ typedef apr_xlate_t xlate_handle_t;
  * If there is no handle for a particular key when needed, a new is
  * handle is created and put in the cache after use.
  * This means that there will be at most N handles open for a key, where N
- * is the number of simultanous handles in use for that key. */
+ * is the number of simultaneous handles in use for that key. */
 
 typedef struct xlate_handle_node_t {
   xlate_handle_t *handle;

Propchange: subversion/branches/multi-wc-format/subversion/libsvn_subr/utf8proc/
------------------------------------------------------------------------------
  Merged /subversion/branches/swig-py3/subversion/libsvn_subr/utf8proc:r1813660-1869353
  Merged /subversion/trunk/subversion/libsvn_subr/utf8proc:r1819869-1897029

Modified: subversion/branches/multi-wc-format/subversion/libsvn_subr/utf8proc.c
URL: http://svn.apache.org/viewvc/subversion/branches/multi-wc-format/subversion/libsvn_subr/utf8proc.c?rev=1897034&r1=1897033&r2=1897034&view=diff
==============================================================================
--- subversion/branches/multi-wc-format/subversion/libsvn_subr/utf8proc.c (original)
+++ subversion/branches/multi-wc-format/subversion/libsvn_subr/utf8proc.c Fri Jan 14 14:01:45 2022
@@ -335,7 +335,7 @@ svn_utf__glob(svn_boolean_t *match,
                             _("Cannot use a custom escape token"
                               " in glob matching mode"));
 
-  /* Convert the patern to NFD UTF-8. We can't use the UCS-4 result
+  /* Convert the pattern to NFD UTF-8. We can't use the UCS-4 result
      because apr_fnmatch can't handle it.*/
   SVN_ERR(decompose_normalized(&tempbuf_len, pattern, pattern_len, temp_buf));
   if (!sql_like)