This version hits error.c only, no new APIs. Sending as an attachment per http://subversion.apache.org/docs/community-guide/general.html#patches
[[[ Produce readable error messages on non-ASCII systems. * subversion/libsvn_subr/error.c: print_error(): convert err->message and the message prefix to UTF-8 before calling svn_cmdline_printf. svn_error_wrap_apr(): remove UTF-8 conversion of apr_strerror output before storing it in err->message to avoid a double conversion ]]] Greg
Index: subversion/libsvn_subr/error.c =================================================================== --- subversion/libsvn_subr/error.c (revision 943729) +++ subversion/libsvn_subr/error.c (working copy) @@ -161,7 +161,7 @@ const char *fmt, ...) { - svn_error_t *err, *utf8_err; + svn_error_t *err; va_list ap; char errbuf[255]; const char *msg_apr, *msg; @@ -172,10 +172,6 @@ { /* Grab the APR error message. */ apr_strerror(status, errbuf, sizeof(errbuf)); - utf8_err = svn_utf_cstring_to_utf8(&msg_apr, errbuf, err->pool); - if (utf8_err) - msg_apr = NULL; - svn_error_clear(utf8_err); /* Append it to the formatted message. */ va_start(ap, fmt); @@ -183,7 +179,7 @@ va_end(ap); err->message = apr_psprintf(err->pool, "%s%s%s", msg, (msg_apr) ? ": " : "", - (msg_apr) ? msg_apr : ""); + (msg_apr) ? errbuf : ""); } return err; @@ -380,7 +376,7 @@ print_error(svn_error_t *err, FILE *stream, const char *prefix) { char errbuf[256]; - const char *err_string; + const char *err_string, *prefix_utf8; svn_error_t *temp_err = NULL; /* ensure initialized even if err->file == NULL */ /* Pretty-print the error */ @@ -413,15 +409,21 @@ /* Skip it. We already printed the file-line coordinates. */ } /* Only print the same APR error string once. */ - else if (err->message) - { - svn_error_clear(svn_cmdline_fprintf(stream, err->pool, "%s%s\n", - prefix, err->message)); - } else { + if (err->message) + { + /* set ERR_STRING to a UTF-8 version of ERR->message */ + temp_err = svn_utf_cstring_to_utf8(&err_string, err->message, + err->pool); + if (temp_err) + { + svn_error_clear(temp_err); + err_string = _("Can't recode error message"); + } + } /* Is this a Subversion-specific error code? */ - if ((err->apr_err > APR_OS_START_USEERR) + else if ((err->apr_err > APR_OS_START_USEERR) && (err->apr_err <= APR_OS_START_CANONERR)) err_string = svn_strerror(err->apr_err, errbuf, sizeof(errbuf)); /* Otherwise, this must be an APR error code. */ @@ -433,8 +435,14 @@ err_string = _("Can't recode error string from APR"); } + if (temp_err = svn_utf_cstring_to_utf8(&prefix_utf8, prefix, err->pool)) + { + svn_error_clear(temp_err); + err_string = _("Can't recode message prefix"); + } + svn_error_clear(svn_cmdline_fprintf(stream, err->pool, - "%s%s\n", prefix, err_string)); + "%s%s\n", prefix_utf8, err_string)); } }