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 */