Attached is version 2 of the patch and log message.
>> + strncpy(orig_lc_all, setlocale(LC_ALL, NULL), sizeof orig_lc_all);
>
> sizeof() with parens please.
Fixed.
>> + if ((! setlocale(LC_ALL, "English.1252")) &&
>> + (! setlocale(LC_ALL, "German.1252")) &&
>> + (! setlocale(LC_ALL, "French.1252")) &&
>
> What are these three? Are they Windows syntax?
Yes.
>> + (! setlocale(LC_ALL, "en_US.ISO-8859-1")) &&
>> + (! setlocale(LC_ALL, "en_GB.ISO-8859-1")) &&
>> + (! setlocale(LC_ALL, "de_DE.ISO-8859-1")))
>> + return svn_error_createf(SVN_ERR_TEST_SKIPPED, NULL, "None of the
>> locales English.1252, German.1252, French.1252, en_US.ISO-8859-1,
>> en_GB.ISO-8859-1, and de_DE.ISO-8859-1 are installed.");
>
> The error message is too verbose, and doesn't fit within 80 columns.
Currently the error message is not displayed if none of the locales
are available; the output is simply:
SKIP: lt-subst_translate-test 2: test
svn_subst_translate_string2(encoding = NULL)
I wrapped it to 80 characters, but I would rather not change the
verbosity of the text because I like how it indicates what was tried
and also that setlocale() fails because a locale is not installed.
>> +
>> + SVN_ERR(svn_subst_translate_string2(&new_value, &translated_to_utf8,
>> + &translated_line_endings,
>> + source_string, NULL, FALSE,
>> + pool, pool));
>> + SVN_TEST_STRING_ASSERT(new_value->data, "\xc3\x86");
>> + SVN_TEST_ASSERT(translated_to_utf8 == TRUE);
>> + SVN_TEST_ASSERT(translated_line_endings == FALSE);
>> +
>> + SVN_TEST_ASSERT(setlocale(LC_ALL, orig_lc_all) != NULL);
>> + }
>
> So you only restore the locale if the test passed. How much does it
> matter?
It might cause problems in subsequent tests in the same test suite.
Using one of Brane's suggestions
(http://thread.gmane.org/gmane.comp.version-control.subversion.devel/125792/focus=125795),
the new patch uses a wrapper function to ensure that the original
LC_ALL locale is restored before the test returns.
>> +
>> + return SVN_NO_ERROR;
>> +}
>> +
>> +static svn_error_t *
>> test_repairing_svn_subst_translate_string2(apr_pool_t *pool)
>> {
>> {
>> @@ -171,6 +210,8 @@ struct svn_test_descriptor_t test_funcs[] =
>> SVN_TEST_NULL,
>> SVN_TEST_PASS2(test_svn_subst_translate_string2,
>> "test svn_subst_translate_string2()"),
>> + SVN_TEST_PASS2(test_svn_subst_translate_string2_null_encoding,
>> + "test svn_subst_translate_string2(), ENCODING = 0"),
>
> I know you are limited to 50 chars, but this "= 0" sacrifices
> readability IMHO. IMO, there are clearer alternatives, e.g.:
> "test svn_subst_translate_string2(encoding=NULL)"
I like that. Changed.
[[[
Add a test of svn_subst_translate_string2() to the subst_translate test suite.
As discussed at:
http://thread.gmane.org/gmane.comp.version-control.subversion.devel/125782
* subversion/tests/libsvn_subr/subst_translate-test.c
(test_svn_subst_translate_string2_null_encoding_helper): New function. It is
the core of the new svn_subst_translate_string2_null_encoding test.
(test_svn_subst_translate_string2_null_encoding): New test that tests
svn_subst_translate_string2() with ENCODING set to NULL. It wraps
test_svn_subst_translate_string2_null_encoding_helper() to ensure that the
system-default character encoding is set to either CP-1252 or ISO-8859-1
before test_svn_subst_translate_string2_null_encoding_helper() is called,
later restoring the original system-default character encoding.
(test_funcs): Add test_svn_subst_translate_string2_null_encoding().
]]]
Index: subversion/tests/libsvn_subr/subst_translate-test.c
===================================================================
--- subversion/tests/libsvn_subr/subst_translate-test.c (revision 1070074)
+++ subversion/tests/libsvn_subr/subst_translate-test.c (working copy)
@@ -21,6 +21,9 @@
* ====================================================================
*/
+#include <locale.h>
+#include <string.h>
+
#include "../svn_test.h"
#include "svn_types.h"
@@ -99,7 +102,64 @@ test_svn_subst_translate_string2(apr_pool_t *pool)
return SVN_NO_ERROR;
}
+/* The body of the svn_subst_translate_string2_null_encoding test. It should
+ only be called by test_svn_subst_translate_string2_null_encoding(), as this
+ code assumes that the process locale has been changed to a locale that uses
+ either CP-1252 or ISO-8859-1 for the default narrow string encoding. */
static svn_error_t *
+test_svn_subst_translate_string2_null_encoding_helper(apr_pool_t *pool)
+{
+ {
+ svn_string_t *new_value = NULL;
+ svn_boolean_t translated_to_utf8 = FALSE;
+ svn_boolean_t translated_line_endings = TRUE;
+ /* 'Æ', which is 0xc6 in both ISO-8859-1 and Windows-1252 */
+ svn_string_t *source_string = svn_string_create("\xc6", pool);
+
+ SVN_ERR(svn_subst_translate_string2(&new_value, &translated_to_utf8,
+ &translated_line_endings,
+ source_string, NULL, FALSE,
+ pool, pool));
+ SVN_TEST_STRING_ASSERT(new_value->data, "\xc3\x86");
+ SVN_TEST_ASSERT(translated_to_utf8 == TRUE);
+ SVN_TEST_ASSERT(translated_line_endings == FALSE);
+ }
+
+ return SVN_NO_ERROR;
+}
+
+/* Test that when ENCODING is NULL, the system-default language encoding is used. */
+static svn_error_t *
+test_svn_subst_translate_string2_null_encoding(apr_pool_t *pool)
+{
+ char orig_lc_all[256] = { '\0' };
+ svn_error_t *test_result;
+
+ strncpy(orig_lc_all, setlocale(LC_ALL, NULL), sizeof (orig_lc_all));
+
+ if ((! setlocale(LC_ALL, "English.1252")) &&
+ (! setlocale(LC_ALL, "German.1252")) &&
+ (! setlocale(LC_ALL, "French.1252")) &&
+ (! setlocale(LC_ALL, "en_US.ISO-8859-1")) &&
+ (! setlocale(LC_ALL, "en_GB.ISO-8859-1")) &&
+ (! setlocale(LC_ALL, "de_DE.ISO-8859-1")) &&
+ (! setlocale(LC_ALL, "en_US.ISO8859-1")) &&
+ (! setlocale(LC_ALL, "en_GB.ISO8859-1")) &&
+ (! setlocale(LC_ALL, "de_DE.ISO8859-1")))
+ return svn_error_createf(SVN_ERR_TEST_SKIPPED, NULL,
+ "None of the locales English.1252, German.1252, "
+ "French.1252, en_US.ISO-8859-1, en_GB.ISO-8859-1, "
+ "and de_DE.ISO-8859-1 are installed.");
+
+ test_result = test_svn_subst_translate_string2_null_encoding_helper(pool);
+
+ /* Restore the original locale for category LC_ALL. */
+ SVN_TEST_ASSERT(setlocale(LC_ALL, orig_lc_all) != NULL);
+
+ return test_result;
+}
+
+static svn_error_t *
test_repairing_svn_subst_translate_string2(apr_pool_t *pool)
{
{
@@ -171,6 +231,8 @@ struct svn_test_descriptor_t test_funcs[] =
SVN_TEST_NULL,
SVN_TEST_PASS2(test_svn_subst_translate_string2,
"test svn_subst_translate_string2()"),
+ SVN_TEST_PASS2(test_svn_subst_translate_string2_null_encoding,
+ "test svn_subst_translate_string2(encoding = NULL)"),
SVN_TEST_PASS2(test_repairing_svn_subst_translate_string2,
"test repairing svn_subst_translate_string2()"),
SVN_TEST_PASS2(test_svn_subst_translate_cstring2,