I took another look at how 'svn blame' aligns its output.
static svn_error_t *
print_line_info(svn_stream_t *out,
svn_revnum_t revision,
const char *author,
const char *date,
const char *path,
svn_boolean_t verbose,
int rev_maxlength,
apr_pool_t *pool)
{
const char *time_utf8;
const char *time_stdout;
const char *rev_str;
rev_str = SVN_IS_VALID_REVNUM(revision)
? apr_psprintf(pool, "%*ld", rev_maxlength, revision)
: apr_psprintf(pool, "%*s", rev_maxlength, "-");
if (verbose)
{
if (date)
{
SVN_ERR(svn_cl__time_cstring_to_human_cstring(&time_utf8,
date, pool));
SVN_ERR(svn_cmdline_cstring_from_utf8(&time_stdout, time_utf8,
pool));
Converts timestamp to locale encoding ...
}
else
{
/* ### This is a 44 characters long string. It assumes the
current
format of svn_time_to_human_cstring and also 3 letter
abbreviations for the month and weekday names. Else, the
line contents will be misaligned. */
time_stdout = " -";
}
SVN_ERR(svn_stream_printf(out, pool, "%s %10s %s ", rev_str,
author ? author : " -",
time_stdout));
But author remains in UTF-8? The author name is extracted from
properties, I don't recall if we enforce UTF-8 in svn:author. I know
that we do in svn:log.
if (path)
SVN_ERR(svn_stream_printf(out, pool, "%-14s ", path));
And so does the path? The blame-receiver's docstring says nothing about
that.
}
else
{
return svn_stream_printf(out, pool, "%s %10.10s ", rev_str,
author ? author : " -");
}
return SVN_NO_ERROR;
}
I guess most of the time, locale encoding is UTF-8 or some other Unicode
format that's lossless. Otherwise I can't imagine how this could work
correctly, in general.
What am I missing?
-- Brane