Author: ivan
Date: Wed May 20 15:07:02 2026
New Revision: 1934437

Log:
Make `svn --version -v` report actual character encoding used on Windows.

Currently Windows has platform specific code for character set conversion.

On Windows CP_THREAD_ACP used as "locale encoding", while
SVN_APR_LOCALE_CHARSET is used on non-Windows platforms.

* subversion/include/private/svn_utf_private.h
  (svn_utf__locale_encoding): New function declaration.

* subversion/libsvn_subr/sysinfo.c
  (): Remove #include <apr_portable.h>
  (svn_sysinfo__character_encoding): Use svn_utf__locale_encoding()
   instead of apr_os_locale_encoding().

* subversion/libsvn_subr/utf.c
  (svn_utf__locale_encoding): New. Use
   svn_subr__win32_xlate_locale_encoding() on Windows and
   apr_os_locale_encoding() on other platforms.
 
* subversion/libsvn_subr/win32_xlate.c
  (svn_subr__win32_xlate_locale_encoding): New. Use GetCPInfoExW()
   to get actual codepage for CP_THREAD_ACP.

* subversion/libsvn_subr/win32_xlate.h
  (svn_subr__win32_xlate_locale_encoding): New function declaration.

Modified:
   subversion/trunk/subversion/include/private/svn_utf_private.h
   subversion/trunk/subversion/libsvn_subr/sysinfo.c
   subversion/trunk/subversion/libsvn_subr/utf.c
   subversion/trunk/subversion/libsvn_subr/win32_xlate.c
   subversion/trunk/subversion/libsvn_subr/win32_xlate.h

Modified: subversion/trunk/subversion/include/private/svn_utf_private.h
==============================================================================
--- subversion/trunk/subversion/include/private/svn_utf_private.h       Wed May 
20 13:44:49 2026        (r1934436)
+++ subversion/trunk/subversion/include/private/svn_utf_private.h       Wed May 
20 15:07:02 2026        (r1934437)
@@ -93,6 +93,10 @@ svn_utf__cstring_from_utf8_fuzzy(const c
                                                const char *,
                                                apr_pool_t *));
 
+/* Get the actual name of the character that will be used when
+ * SVN_APR_LOCALE_CHARSET is provided.
+ * Allocate result in POOL. */
+const char *svn_utf__locale_encoding(apr_pool_t *pool);
 
 #if defined(WIN32)
 /* On Windows: Convert the UTF-8 string SRC to UTF-16.

Modified: subversion/trunk/subversion/libsvn_subr/sysinfo.c
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/sysinfo.c   Wed May 20 13:44:49 
2026        (r1934436)
+++ subversion/trunk/subversion/libsvn_subr/sysinfo.c   Wed May 20 15:07:02 
2026        (r1934437)
@@ -35,7 +35,6 @@
 #include <apr_thread_proc.h>
 #include <apr_version.h>
 #include <apu_version.h>
-#include <apr_portable.h>       /* for apr_os_locale_encoding() */
 
 #include "svn_pools.h"
 #include "svn_ctype.h"
@@ -141,7 +140,7 @@ svn_sysinfo__release_name(apr_pool_t *po
 const char *
 svn_sysinfo__character_encoding(apr_pool_t *pool)
 {
-  return apr_os_locale_encoding(pool);
+  return svn_utf__locale_encoding(pool);
 }
 
 const apr_array_header_t *

Modified: subversion/trunk/subversion/libsvn_subr/utf.c
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/utf.c       Wed May 20 13:44:49 
2026        (r1934436)
+++ subversion/trunk/subversion/libsvn_subr/utf.c       Wed May 20 15:07:02 
2026        (r1934437)
@@ -31,6 +31,7 @@
 #include <apr_lib.h>
 #include <apr_xlate.h>
 #include <apr_atomic.h>
+#include <apr_portable.h>       /* for apr_os_locale_encoding() */
 
 #include "svn_hash.h"
 #include "svn_string.h"
@@ -1195,6 +1196,16 @@ svn_utf__utf32_to_utf8(const svn_string_
   return SVN_NO_ERROR;
 }
 
+const char *
+svn_utf__locale_encoding(apr_pool_t *pool)
+{
+#if defined(WIN32)
+  /* We have special code for xlate on Windows. */
+  return svn_subr__win32_xlate_locale_encoding(pool);
+#else
+  return apr_os_locale_encoding(pool);
+#endif
+}
 
 #ifdef WIN32
 

Modified: subversion/trunk/subversion/libsvn_subr/win32_xlate.c
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/win32_xlate.c       Wed May 20 
13:44:49 2026        (r1934436)
+++ subversion/trunk/subversion/libsvn_subr/win32_xlate.c       Wed May 20 
15:07:02 2026        (r1934437)
@@ -259,6 +259,23 @@ svn_subr__win32_xlate_to_stringbuf(svn_s
   return APR_SUCCESS;
 }
 
+const char *
+svn_subr__win32_xlate_locale_encoding(apr_pool_t *pool)
+{
+  CPINFOEXW cpinfo = { 0 };
+
+  if (GetCPInfoExW(CP_THREAD_ACP, 0, &cpinfo))
+    {
+      return apr_psprintf(pool, "CP%u", (unsigned int)cpinfo.CodePage);
+    }
+  else
+    {
+      /* Fallback to apr_os_default_encoding() like
+        * apr_os_locale_encoding(). */
+      return apr_os_default_encoding(pool);
+    }
+}
+
 #else  /* !WIN32 */
 
 /* Silence OSX ranlib warnings about object files with no symbols. */

Modified: subversion/trunk/subversion/libsvn_subr/win32_xlate.h
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/win32_xlate.h       Wed May 20 
13:44:49 2026        (r1934436)
+++ subversion/trunk/subversion/libsvn_subr/win32_xlate.h       Wed May 20 
15:07:02 2026        (r1934437)
@@ -49,6 +49,9 @@ svn_subr__win32_xlate_to_stringbuf(svn_s
                                    svn_stringbuf_t **dest,
                                    apr_pool_t *pool);
 
+/* Windows specific implementation of svn_utf__locale_encoding(). */
+const char *svn_subr__win32_xlate_locale_encoding(apr_pool_t *pool);
+
 #endif /* WIN32 */
 
 #endif /* SVN_LIBSVN_SUBR_WIN32_XLATE_H */

Reply via email to