Index: subversion/include/svn_subst.h =================================================================== --- subversion/include/svn_subst.h (revision 996730) +++ subversion/include/svn_subst.h (working copy) @@ -598,6 +598,26 @@ svn_error_t *svn_subst_translate_string(svn_string const char *encoding, apr_pool_t *pool); +/** Translate the data in @a value (assumed to be in encoded in charset + * @a encoding) to UTF8 and LF line-endings. If @a encoding is @c NULL, + * then assume that @a value is in the system-default language encoding. + * If @p translated_to_utf8 is not @c NULL, then + * @code *translated_to_utf8 @endcode is set to @c TRUE if at least one + * character of @p value in the source charset was translated to UTF-8; + * @c FALSE otherwise. If @p translated_line_endings is not @c NULL, then + * @code *translated_line_endings @endcode is set to @c TRUE if at least one + * line ending was changed to LF; @c FALSE otherwise. Return the translated data in @a *new_value, + * allocated in @a pool. + * + * @since New in 1.6 + */ +svn_error_t *svn_subst_translate_string2(svn_string_t **new_value, + svn_boolean_t *translated_to_utf8, + svn_boolean_t *translated_line_endings, + const svn_string_t *value, + const char *encoding, + apr_pool_t *pool); + /** Translate the data in @a value from UTF8 and LF line-endings into * native locale and native line-endings, or to the output locale if * @a for_output is TRUE. Return the translated data in @a Index: subversion/libsvn_subr/subst.c =================================================================== --- subversion/libsvn_subr/subst.c (revision 996730) +++ subversion/libsvn_subr/subst.c (working copy) @@ -765,6 +765,7 @@ svn_subst_keywords_differ2(apr_hash_t *a, struct translation_baton { const char *eol_str; + svn_boolean_t *translated_eol; svn_boolean_t repair; apr_hash_t *keywords; svn_boolean_t expand; @@ -805,6 +806,7 @@ struct translation_baton */ static struct translation_baton * create_translation_baton(const char *eol_str, + svn_boolean_t *translated_eol, svn_boolean_t repair, apr_hash_t *keywords, svn_boolean_t expand, @@ -818,6 +820,7 @@ create_translation_baton(const char *eol_str, b->eol_str = eol_str; b->eol_str_len = eol_str ? strlen(eol_str) : 0; + b->translated_eol = translated_eol; b->repair = repair; b->keywords = keywords; b->expand = expand; @@ -884,6 +887,8 @@ translate_chunk(svn_stream_t *dst, b->src_format, &b->src_format_len, b->newline_buf, b->newline_off, dst, b->repair)); + if (b->translated_eol) + *b->translated_eol = TRUE; b->newline_off = 0; } @@ -1256,13 +1261,14 @@ svn_subst_read_specialfile(svn_stream_t **stream, } -svn_stream_t * -svn_subst_stream_translated(svn_stream_t *stream, - const char *eol_str, - svn_boolean_t repair, - apr_hash_t *keywords, - svn_boolean_t expand, - apr_pool_t *result_pool) +static svn_stream_t * +stream_translated(svn_stream_t *stream, + const char *eol_str, + svn_boolean_t *translated_eol, + svn_boolean_t repair, + apr_hash_t *keywords, + svn_boolean_t expand, + apr_pool_t *result_pool) { struct translated_stream_baton *baton = apr_palloc(result_pool, sizeof(*baton)); @@ -1304,9 +1310,11 @@ svn_subst_read_specialfile(svn_stream_t **stream, /* Setup the baton fields */ baton->stream = stream; baton->in_baton - = create_translation_baton(eol_str, repair, keywords, expand, result_pool); + = create_translation_baton(eol_str, translated_eol, repair, keywords, + expand, result_pool); baton->out_baton - = create_translation_baton(eol_str, repair, keywords, expand, result_pool); + = create_translation_baton(eol_str, translated_eol, repair, keywords, + expand, result_pool); baton->written = FALSE; baton->readbuf = svn_stringbuf_create("", result_pool); baton->readbuf_off = 0; @@ -1323,15 +1331,28 @@ svn_subst_read_specialfile(svn_stream_t **stream, return s; } +svn_stream_t * +svn_subst_stream_translated(svn_stream_t *stream, + const char *eol_str, + svn_boolean_t repair, + apr_hash_t *keywords, + svn_boolean_t expand, + apr_pool_t *result_pool) +{ + return stream_translated(stream, eol_str, NULL, repair, keywords, expand, + result_pool); +} -svn_error_t * -svn_subst_translate_cstring2(const char *src, - const char **dst, - const char *eol_str, - svn_boolean_t repair, - apr_hash_t *keywords, - svn_boolean_t expand, - apr_pool_t *pool) + +static svn_error_t * +translate_cstring2(const char **dst, + svn_boolean_t *translated_eol, + const char *src, + const char *eol_str, + svn_boolean_t repair, + apr_hash_t *keywords, + svn_boolean_t expand, + apr_pool_t *pool) { svn_stringbuf_t *dst_stringbuf; svn_stream_t *dst_stream; @@ -1348,9 +1369,12 @@ svn_subst_read_specialfile(svn_stream_t **stream, dst_stringbuf = svn_stringbuf_create("", pool); dst_stream = svn_stream_from_stringbuf(dst_stringbuf, pool); + if (translated_eol) + *translated_eol = FALSE; + /* Another wrapper to translate the content. */ - dst_stream = svn_subst_stream_translated(dst_stream, eol_str, repair, - keywords, expand, pool); + dst_stream = stream_translated(dst_stream, eol_str, translated_eol, repair, + keywords, expand, pool); /* Jam the text into the destination stream (to translate it). */ SVN_ERR(svn_stream_write(dst_stream, src, &len)); @@ -1362,6 +1386,19 @@ svn_subst_read_specialfile(svn_stream_t **stream, return SVN_NO_ERROR; } +svn_error_t * +svn_subst_translate_cstring2(const char *src, + const char **dst, + const char *eol_str, + svn_boolean_t repair, + apr_hash_t *keywords, + svn_boolean_t expand, + apr_pool_t *pool) +{ + return translate_cstring2(dst, NULL, src, eol_str, repair, keywords, expand, + pool); +} + /* Given a special file at SRC, generate a textual representation of it in a normal file at DST. Perform all allocations in POOL. */ /* ### this should be folded into svn_subst_copy_and_translate3 */ @@ -1714,6 +1751,54 @@ svn_subst_translate_string(svn_string_t **new_valu svn_error_t * +svn_subst_translate_string2(svn_string_t **new_value, + svn_boolean_t *translated_to_utf8, + svn_boolean_t *translated_line_endings, + const svn_string_t *value, + const char *encoding, + apr_pool_t *pool) +{ + const char *val_utf8; + const char *val_utf8_lf; + apr_pool_t *scratch_pool = svn_pool_create(pool); + + if (value == NULL) + { + *new_value = NULL; + return SVN_NO_ERROR; + } + + if (encoding) + { + SVN_ERR(svn_utf_cstring_to_utf8_ex2(&val_utf8, value->data, + encoding, scratch_pool)); + } + else + { + SVN_ERR(svn_utf_cstring_to_utf8(&val_utf8, value->data, scratch_pool)); + } + + if (translated_to_utf8) + *translated_to_utf8 = strcmp(value->data, val_utf8) + ? /* not equal */ TRUE + : FALSE; + + SVN_ERR(translate_cstring2(&val_utf8_lf, + translated_line_endings, + val_utf8, + "\n", /* translate to LF */ + FALSE, /* no repair */ + NULL, /* no keywords */ + FALSE, /* no expansion */ + scratch_pool)); + + *new_value = svn_string_create(val_utf8_lf, pool); + svn_pool_destroy(scratch_pool); + return SVN_NO_ERROR; +} + + +svn_error_t * svn_subst_detranslate_string(svn_string_t **new_value, const svn_string_t *value, svn_boolean_t for_output, Index: subversion/svnsync/sync.h =================================================================== --- subversion/svnsync/sync.h (revision 996730) +++ subversion/svnsync/sync.h (working copy) @@ -33,15 +33,17 @@ extern "C" { #include "svn_delta.h" -/* Normalize the line ending style of the values of properties in REV_PROPS - * that "need translation" (according to svn_prop_needs_translation(), - * currently all svn:* props) so that they contain only LF (\n) line endings. - * The number of properties that needed normalization is returned in - * *NORMALIZED_COUNT. +/* Normalize the encoding and line ending style of the values of properties + * in REV_PROPS that "need translation" (according to + * svn_prop_needs_translation(), which is currently all svn:* props) so that + * they are encoded in UTF-8 and contain only LF (\n) line endings. + * The number of properties that needed line ending normalization is returned in + * *NORMALIZED_LE_COUNT. No re-encoding is performed if ENCODING is NULL. */ svn_error_t * svnsync_normalize_revprops(apr_hash_t *rev_props, - int *normalized_count, + int *normalized_le_count, + const char *encoding, apr_pool_t *pool); @@ -52,18 +54,23 @@ svnsync_normalize_revprops(apr_hash_t *rev_props, * which the commit is being made. * * As the sync editor encounters property values, it might see the need to - * normalize them (to LF line endings). Each carried out normalization adds 1 - * to the *NORMALIZED_NODE_PROPS_COUNTER (for notification). + * normalize them (re-encode and/or change to LF line endings). + * If PROP_ENCODING is NULL, then property values are presumed to be encoded + * in UTF-8 and are not re-encoded. Otherwise, the property values are + * presumed to be encoded in PROP_ENCODING, and are normalized to UTF-8. + * Each carried out line ending normalization adds 1 to the + * *NORMALIZED_LE_NODE_PROPS_COUNTER (for notification). */ svn_error_t * svnsync_get_sync_editor(const svn_delta_editor_t *wrapped_editor, void *wrapped_edit_baton, svn_revnum_t base_revision, const char *to_url, + const char *prop_encoding, svn_boolean_t quiet, const svn_delta_editor_t **editor, void **edit_baton, - int *normalized_node_props_counter, + int *normalized_le_node_props_counter, apr_pool_t *pool); Index: subversion/svnsync/main.c =================================================================== --- subversion/svnsync/main.c (revision 996730) +++ subversion/svnsync/main.c (working copy) @@ -61,6 +61,7 @@ enum svnsync__opt { svnsync_opt_sync_password, svnsync_opt_config_dir, svnsync_opt_config_options, + svnsync_opt_source_encoding, svnsync_opt_disable_locking, svnsync_opt_version, svnsync_opt_trust_server_cert, @@ -104,8 +105,8 @@ static const svn_opt_subcommand_desc2_t svnsync_cm "the destination repository by any method other than 'svnsync'.\n" "In other words, the destination repository should be a read-only\n" "mirror of the source repository.\n"), - { SVNSYNC_OPTS_DEFAULT, 'q', svnsync_opt_allow_non_empty, - svnsync_opt_disable_locking } }, + { SVNSYNC_OPTS_DEFAULT, svnsync_opt_source_encoding, 'q', + svnsync_opt_allow_non_empty, svnsync_opt_disable_locking } }, { "synchronize", synchronize_cmd, { "sync" }, N_("usage: svnsync synchronize DEST_URL [SOURCE_URL]\n" "\n" @@ -117,7 +118,8 @@ static const svn_opt_subcommand_desc2_t svnsync_cm "source URL. Specifying SOURCE_URL is recommended in particular\n" "if untrusted users/administrators may have write access to the\n" "DEST_URL repository.\n"), - { SVNSYNC_OPTS_DEFAULT, 'q', svnsync_opt_disable_locking } }, + { SVNSYNC_OPTS_DEFAULT, svnsync_opt_source_encoding, 'q', + svnsync_opt_disable_locking } }, { "copy-revprops", copy_revprops_cmd, { 0 }, N_("usage:\n" "\n" @@ -137,7 +139,8 @@ static const svn_opt_subcommand_desc2_t svnsync_cm "DEST_URL repository.\n" "\n" "Form 2 is deprecated syntax, equivalent to specifying \"-rREV[:REV2]\".\n"), - { SVNSYNC_OPTS_DEFAULT, 'q', 'r', svnsync_opt_disable_locking } }, + { SVNSYNC_OPTS_DEFAULT, svnsync_opt_source_encoding, 'q', 'r', + svnsync_opt_disable_locking } }, { "info", info_cmd, { 0 }, N_("usage: svnsync info DEST_URL\n" "\n" @@ -200,6 +203,12 @@ static const apr_getopt_option_t svnsync_options[] "For example:\n" " " " servers:global:http-library=serf")}, + {"source-encoding", svnsync_opt_source_encoding, 1, + N_("convert translatable properties from encoding ARG\n" + " " + "to UTF-8. If not specified, then properties are\n" + " " + "presumed to be encoded in UTF-8.")}, {"disable-locking", svnsync_opt_disable_locking, 0, N_("Disable built-in locking. Use of this option can\n" " " @@ -227,6 +236,7 @@ typedef struct { const char *sync_password; const char *config_dir; apr_hash_t *config; + const char *source_encoding; svn_boolean_t disable_locking; svn_boolean_t quiet; svn_boolean_t allow_non_empty; @@ -352,6 +362,9 @@ typedef struct { svn_boolean_t quiet; svn_boolean_t allow_non_empty; const char *to_url; + + /* initialize, synchronize, and copy-revprops only */ + const char *source_encoding; /* initialize only */ const char *from_url; @@ -603,9 +616,9 @@ log_properties_normalized(int normalized_rev_props static svn_error_t * copy_revprops(svn_ra_session_t *from_session, svn_ra_session_t *to_session, + subcommand_baton_t *sb, svn_revnum_t rev, svn_boolean_t sync, - svn_boolean_t quiet, int *normalized_count, apr_pool_t *pool) { @@ -621,9 +634,10 @@ copy_revprops(svn_ra_session_t *from_session, /* Get the list of revision properties on REV of SOURCE. */ SVN_ERR(svn_ra_rev_proplist(from_session, rev, &rev_props, subpool)); - /* If necessary, normalize line ending style, and return the count + /* If necessary, normalize encoding and line ending style and return the count of changes in int *NORMALIZED_COUNT. */ - SVN_ERR(svnsync_normalize_revprops(rev_props, normalized_count, pool)); + SVN_ERR(svnsync_normalize_revprops(rev_props, normalized_count, + sb->source_encoding, pool)); /* Copy all but the svn:svnsync properties. */ SVN_ERR(write_revprops(&filtered_count, to_session, rev, rev_props, pool)); @@ -633,7 +647,7 @@ copy_revprops(svn_ra_session_t *from_session, SVN_ERR(remove_props_not_in_source(to_session, rev, rev_props, existing_props, pool)); - if (! quiet) + if (! sb->quiet) SVN_ERR(log_properties_copied(filtered_count > 0, rev, pool)); svn_pool_destroy(subpool); @@ -664,6 +678,7 @@ make_subcommand_baton(opt_baton_t *opt_baton, b->quiet = opt_baton->quiet; b->allow_non_empty = opt_baton->allow_non_empty; b->to_url = to_url; + b->source_encoding = opt_baton->source_encoding; b->from_url = from_url; b->start_rev = start_rev; b->end_rev = end_rev; @@ -763,8 +778,8 @@ do_initialize(svn_ra_session_t *to_session, LATEST is not 0, this really serves merely aesthetic and informational purposes, keeping the output of this command consistent while allowing folks to see what the latest revision is. */ - SVN_ERR(copy_revprops(from_session, to_session, latest, FALSE, - baton->quiet, &normalized_rev_props_count, pool)); + SVN_ERR(copy_revprops(from_session, to_session, baton, latest, FALSE, + &normalized_rev_props_count, pool)); SVN_ERR(log_properties_normalized(normalized_rev_props_count, 0, pool)); @@ -1025,9 +1040,10 @@ replay_rev_started(svn_revnum_t revision, apr_hash_set(filtered, SVN_PROP_REVISION_LOG, APR_HASH_KEY_STRING, svn_string_create("", pool)); - /* If necessary, normalize line ending style, and add the number + /* If necessary, normalize encoding and line ending style, and add the number of changes to the overall count in the replay baton. */ - SVN_ERR(svnsync_normalize_revprops(filtered, &normalized_count, pool)); + SVN_ERR(svnsync_normalize_revprops(filtered, &normalized_count, + rb->sb->source_encoding, pool)); rb->normalized_rev_props_count += normalized_count; SVN_ERR(svn_ra_get_commit_editor3(rb->to_session, &commit_editor, @@ -1040,8 +1056,8 @@ replay_rev_started(svn_revnum_t revision, over the RA interface, so we need an editor that's smart enough to filter those out for us. */ SVN_ERR(svnsync_get_sync_editor(commit_editor, commit_baton, revision - 1, - rb->sb->to_url, rb->sb->quiet, - &sync_editor, &sync_baton, + rb->sb->to_url, rb->sb->source_encoding, + rb->sb->quiet, &sync_editor, &sync_baton, &(rb->normalized_node_props_count), pool)); SVN_ERR(svn_delta_get_cancellation_editor(check_cancel, NULL, @@ -1095,9 +1111,10 @@ replay_rev_finished(svn_revnum_t revision, : filter_exclude_log), subpool); - /* If necessary, normalize line ending style, and add the number + /* If necessary, normalize encoding and line ending style, and add the number of changes to the overall count in the replay baton. */ - SVN_ERR(svnsync_normalize_revprops(filtered, &normalized_count, pool)); + SVN_ERR(svnsync_normalize_revprops(filtered, &normalized_count, + rb->sb->source_encoding, pool)); rb->normalized_rev_props_count += normalized_count; SVN_ERR(write_revprops(&filtered_count, rb->to_session, revision, filtered, @@ -1200,10 +1217,9 @@ do_synchronize(svn_ra_session_t *to_session, { if (copying > last_merged) { - SVN_ERR(copy_revprops(from_session, to_session, - to_latest, TRUE, baton->quiet, - &normalized_rev_props_count, - pool)); + SVN_ERR(copy_revprops(from_session, to_session, baton, + to_latest, TRUE, + &normalized_rev_props_count, pool)); last_merged = copying; last_merged_rev = svn_string_create (apr_psprintf(pool, "%ld", last_merged), pool); @@ -1367,8 +1383,8 @@ do_copy_revprops(svn_ra_session_t *to_session, { int normalized_count; SVN_ERR(check_cancel(NULL)); - SVN_ERR(copy_revprops(from_session, to_session, i, FALSE, - baton->quiet, &normalized_count, pool)); + SVN_ERR(copy_revprops(from_session, to_session, baton, i, FALSE, + &normalized_count, pool)); normalized_rev_props_count += normalized_count; } @@ -1672,6 +1688,7 @@ main(int argc, const char *argv[]) const char *username = NULL, *source_username = NULL, *sync_username = NULL; const char *password = NULL, *source_password = NULL, *sync_password = NULL; apr_array_header_t *config_options = NULL; + opt_baton.source_encoding = NULL; apr_allocator_t *allocator; if (svn_cmdline_init("svnsync", stderr) != EXIT_SUCCESS) @@ -1795,6 +1812,11 @@ main(int argc, const char *argv[]) if (err) return svn_cmdline_handle_exit_error(err, pool, "svnsync: "); break; + + case svnsync_opt_source_encoding: + opt_err = svn_utf_cstring_to_utf8(&opt_baton.source_encoding, + opt_arg, pool); + break; case svnsync_opt_disable_locking: opt_baton.disable_locking = TRUE; Index: subversion/svnsync/sync.c =================================================================== --- subversion/svnsync/sync.c (revision 996730) +++ subversion/svnsync/sync.c (working copy) @@ -45,29 +45,37 @@ #include -/* Normalize the line ending style of *STR, so that it contains only - * LF (\n) line endings. After return, *STR may point at a new - * svn_string_t* allocated from POOL. - * - * *WAS_NORMALIZED is set to TRUE when *STR needed to be normalized, - * and to FALSE if *STR remains unchanged. +/* Normalize the encoding and line ending style of *STR, so that it contains + * only LF (\n) line endings and is encoded in UTF-8. After return, *STR may + * point at a new svn_string_t* allocated from POOL. If + * ENCODING is NULL, then *STR is presumed to be encoded in UTF-8. + * *LE_NORMALIZED is set to TRUE when *STR needed line ending normalization. */ static svn_error_t * normalize_string(const svn_string_t **str, - svn_boolean_t *was_normalized, + svn_boolean_t *le_normalized, + const char *encoding, apr_pool_t *pool) { - *was_normalized = FALSE; + *le_normalized = FALSE; if (*str == NULL) return SVN_NO_ERROR; SVN_ERR_ASSERT((*str)->data != NULL); - /* Detect inconsistent line ending style simply by looking - for carriage return (\r) characters. */ - if (strchr((*str)->data, '\r') != NULL) + if (encoding) { + svn_string_t *new_str = NULL; + SVN_ERR(svn_subst_translate_string2(&new_str, NULL, le_normalized, *str, + encoding, pool)); + *str = new_str; + } + + /* Only detect inconsistent line ending style. This is accomplished by simply + looking for carriage return (\r) characters. */ + else if (strchr((*str)->data, '\r') != NULL) + { /* Found some. Normalize. */ const char* cstring = NULL; SVN_ERR(svn_subst_translate_cstring2((*str)->data, &cstring, @@ -75,26 +83,28 @@ normalize_string(const svn_string_t **str, NULL, FALSE, pool)); *str = svn_string_create(cstring, pool); - *was_normalized = TRUE; + *le_normalized = TRUE; } return SVN_NO_ERROR; } -/* Normalize the line ending style of the values of properties in REV_PROPS - * that "need translation" (according to svn_prop_needs_translation(), - * currently all svn:* props) so that they contain only LF (\n) line endings. - * The number of properties that needed normalization is returned in - * *NORMALIZED_COUNT. +/* Normalize the encoding and line ending style of the values of properties + * in REV_PROPS that "need translation" (according to + * svn_prop_needs_translation(), which is currently all svn:* props) so that + * they are encoded in UTF-8 and contain only LF (\n) line endings. + * The number of properties that needed line ending normalization is returned in + * *NORMALIZED_LE_COUNT. No re-encoding is performed if ENCODING is NULL. */ svn_error_t * svnsync_normalize_revprops(apr_hash_t *rev_props, - int *normalized_count, + int *normalized_le_count, + const char *encoding, apr_pool_t *pool) { apr_hash_index_t *hi; - *normalized_count = 0; + *normalized_le_count = 0; for (hi = apr_hash_first(pool, rev_props); hi; @@ -105,15 +115,14 @@ svnsync_normalize_revprops(apr_hash_t *rev_props, if (svn_prop_needs_translation(propname)) { - svn_boolean_t was_normalized; - SVN_ERR(normalize_string(&propval, &was_normalized, pool)); - if (was_normalized) - { - /* Replace the existing prop value. */ - apr_hash_set(rev_props, propname, APR_HASH_KEY_STRING, propval); - /* And count this. */ - (*normalized_count)++; - } + svn_boolean_t le_normalized; + SVN_ERR(normalize_string(&propval, &le_normalized, encoding, pool)); + + /* Replace the existing prop value. */ + apr_hash_set(rev_props, propname, APR_HASH_KEY_STRING, propval); + + if (le_normalized) + (*normalized_le_count)++; /* Count it. */ } } return SVN_NO_ERROR; @@ -141,6 +150,7 @@ typedef struct { const svn_delta_editor_t *wrapped_editor; void *wrapped_edit_baton; const char *to_url; /* URL we're copying into, for correct copyfrom URLs */ + const char *prop_encoding; svn_boolean_t called_open_root; svn_boolean_t got_textdeltas; svn_revnum_t base_revision; @@ -150,7 +160,8 @@ typedef struct { svn_boolean_t mergeinfo_stripped; /* Did we strip svn:mergeinfo? */ svn_boolean_t svnmerge_migrated; /* Did we convert svnmerge.py data? */ svn_boolean_t svnmerge_blocked; /* Was there any blocked svnmerge data? */ - int *normalized_node_props_counter; /* Where to count normalizations? */ + int *normalized_le_node_props_counter; /* Where to count line ending + normalizations? */ } edit_baton_t; @@ -407,9 +418,10 @@ change_file_prop(void *file_baton, if (svn_prop_needs_translation(name)) { svn_boolean_t was_normalized; - SVN_ERR(normalize_string(&value, &was_normalized, pool)); + SVN_ERR(normalize_string(&value, &was_normalized, eb->prop_encoding, + pool)); if (was_normalized) - (*(eb->normalized_node_props_counter))++; + (*(eb->normalized_le_node_props_counter))++; } return eb->wrapped_editor->change_file_prop(fb->wrapped_node_baton, @@ -505,9 +517,10 @@ change_dir_prop(void *dir_baton, if (svn_prop_needs_translation(name)) { svn_boolean_t was_normalized; - SVN_ERR(normalize_string(&value, &was_normalized, pool)); + SVN_ERR(normalize_string(&value, &was_normalized, eb->prop_encoding, + pool)); if (was_normalized) - (*(eb->normalized_node_props_counter))++; + (*(eb->normalized_le_node_props_counter))++; } return eb->wrapped_editor->change_dir_prop(db->wrapped_node_baton, @@ -572,10 +585,11 @@ svnsync_get_sync_editor(const svn_delta_editor_t * void *wrapped_edit_baton, svn_revnum_t base_revision, const char *to_url, + const char *prop_encoding, svn_boolean_t quiet, const svn_delta_editor_t **editor, void **edit_baton, - int *normalized_node_props_counter, + int *normalized_le_node_props_counter, apr_pool_t *pool) { svn_delta_editor_t *tree_editor = svn_delta_default_editor(pool); @@ -602,8 +616,9 @@ svnsync_get_sync_editor(const svn_delta_editor_t * eb->wrapped_edit_baton = wrapped_edit_baton; eb->base_revision = base_revision; eb->to_url = to_url; + eb->prop_encoding = prop_encoding; eb->quiet = quiet; - eb->normalized_node_props_counter = normalized_node_props_counter; + eb->normalized_le_node_props_counter = normalized_le_node_props_counter; if (getenv("SVNSYNC_UNSUPPORTED_STRIP_MERGEINFO")) {