Index: subversion/libsvn_diff/deprecated.c =================================================================== --- subversion/libsvn_diff/deprecated.c (revision 1064135) +++ subversion/libsvn_diff/deprecated.c (working copy) @@ -41,7 +41,61 @@ /*** Code. ***/ +struct fns_wrapper_baton +{ + /* We put the old baton in front of this one, so that we can still use + this baton in place of the old. This prevents us from having to + implement simple wrappers around each member of diff_fns_t. */ + void *old_baton; + const svn_diff_fns_t *vtable; +}; +static svn_error_t * +datasources_open(void *baton, apr_off_t *prefix_lines, + svn_diff_datasource_e datasources[], + apr_size_t datasource_len) +{ + struct fns_wrapper_baton *fwb = baton; + int i; + + /* Just iterate over the datasources, using the old singular version. */ + for (i = 0; i < datasource_len; i++) + { + SVN_ERR(fwb->vtable->datasource_open(baton, datasources[i])); + } + + /* Don't claim any prefix matches. */ + *prefix_lines = 0; + + return SVN_NO_ERROR; +} + +static void +wrap_diff_fns(svn_diff_fns2_t **diff_fns2, + struct fns_wrapper_baton **baton2, + const svn_diff_fns_t *diff_fns, + void *baton, + apr_pool_t *result_pool) +{ + /* Initialize the return vtable. */ + *diff_fns2 = apr_palloc(result_pool, sizeof(**diff_fns2)); + + (*diff_fns2)->datasource_open = diff_fns->datasource_open; + (*diff_fns2)->datasource_close = diff_fns->datasource_close; + (*diff_fns2)->datasource_get_next_token = diff_fns->datasource_get_next_token; + (*diff_fns2)->token_compare = diff_fns->token_compare; + (*diff_fns2)->token_discard = diff_fns->token_discard; + (*diff_fns2)->token_discard_all = diff_fns->token_discard_all; + + (*diff_fns2)->datasources_open = datasources_open; + + /* Initialize the wrapper baton. */ + *baton2 = apr_palloc(result_pool, sizeof (**baton2)); + (*baton2)->old_baton = baton; + (*baton2)->vtable = diff_fns; +} + + /*** From diff_file.c ***/ svn_error_t * svn_diff_file_output_unified2(svn_stream_t *output_stream, @@ -142,3 +196,48 @@ svn_diff_file_output_merge(svn_stream_t *output_st style, pool); } + + +/*** From diff.c ***/ +svn_error_t * +svn_diff_diff(svn_diff_t **diff, + void *diff_baton, + const svn_diff_fns_t *vtable, + apr_pool_t *pool) +{ + svn_diff_fns2_t *diff_fns2; + struct fns_wrapper_baton *fwb; + + wrap_diff_fns(&diff_fns2, &fwb, vtable, diff_baton, pool); + return svn_diff_diff_2(diff, fwb, diff_fns2, pool); +} + + +/*** From diff3.c ***/ +svn_error_t * +svn_diff_diff3(svn_diff_t **diff, + void *diff_baton, + const svn_diff_fns_t *vtable, + apr_pool_t *pool) +{ + svn_diff_fns2_t *diff_fns2; + struct fns_wrapper_baton *fwb; + + wrap_diff_fns(&diff_fns2, &fwb, vtable, diff_baton, pool); + return svn_diff_diff3_2(diff, fwb, diff_fns2, pool); +} + + +/*** From diff4.c ***/ +svn_error_t * +svn_diff_diff4(svn_diff_t **diff, + void *diff_baton, + const svn_diff_fns_t *vtable, + apr_pool_t *pool) +{ + svn_diff_fns2_t *diff_fns2; + struct fns_wrapper_baton *fwb; + + wrap_diff_fns(&diff_fns2, &fwb, vtable, diff_baton, pool); + return svn_diff_diff4_2(diff, fwb, diff_fns2, pool); +} Index: subversion/libsvn_diff/diff_memory.c =================================================================== --- subversion/libsvn_diff/diff_memory.c (revision 1064135) +++ subversion/libsvn_diff/diff_memory.c (working copy) @@ -202,7 +202,7 @@ token_discard_all(void *baton) static const svn_diff_fns_t svn_diff__mem_vtable = { datasource_open, - datasources_open, + /*datasources_open,*/ datasource_close, datasource_get_next_token, token_compare, Index: subversion/libsvn_diff/token.c =================================================================== --- subversion/libsvn_diff/token.c (revision 1064135) +++ subversion/libsvn_diff/token.c (working copy) @@ -137,7 +137,7 @@ svn_error_t * svn_diff__get_tokens(svn_diff__position_t **position_list, svn_diff__tree_t *tree, void *diff_baton, - const svn_diff_fns_t *vtable, + const svn_diff_fns2_t *vtable, svn_diff_datasource_e datasource, apr_off_t prefix_lines, apr_pool_t *pool) Index: subversion/libsvn_diff/diff_file.c =================================================================== --- subversion/libsvn_diff/diff_file.c (revision 1064135) +++ subversion/libsvn_diff/diff_file.c (working copy) @@ -1064,7 +1064,7 @@ token_discard_all(void *baton) static const svn_diff_fns_t svn_diff__file_vtable = { datasource_open, - datasources_open, + /*datasources_open,*/ datasource_close, datasource_get_next_token, token_compare, Index: subversion/libsvn_diff/diff.c =================================================================== --- subversion/libsvn_diff/diff.c (revision 1064135) +++ subversion/libsvn_diff/diff.c (working copy) @@ -98,10 +98,10 @@ svn_diff__diff(svn_diff__lcs_t *lcs, svn_error_t * -svn_diff_diff(svn_diff_t **diff, - void *diff_baton, - const svn_diff_fns_t *vtable, - apr_pool_t *pool) +svn_diff_diff_2(svn_diff_t **diff, + void *diff_baton, + const svn_diff_fns2_t *vtable, + apr_pool_t *pool) { svn_diff__tree_t *tree; svn_diff__position_t *position_list[2]; Index: subversion/libsvn_diff/diff3.c =================================================================== --- subversion/libsvn_diff/diff3.c (revision 1064135) +++ subversion/libsvn_diff/diff3.c (working copy) @@ -244,10 +244,10 @@ svn_diff__resolve_conflict(svn_diff_t *hunk, svn_error_t * -svn_diff_diff3(svn_diff_t **diff, - void *diff_baton, - const svn_diff_fns_t *vtable, - apr_pool_t *pool) +svn_diff_diff3_2(svn_diff_t **diff, + void *diff_baton, + const svn_diff_fns2_t *vtable, + apr_pool_t *pool) { svn_diff__tree_t *tree; svn_diff__position_t *position_list[3]; Index: subversion/libsvn_diff/diff4.c =================================================================== --- subversion/libsvn_diff/diff4.c (revision 1064135) +++ subversion/libsvn_diff/diff4.c (working copy) @@ -166,10 +166,10 @@ adjust_diff(svn_diff_t *diff, svn_diff_t *adjust) } svn_error_t * -svn_diff_diff4(svn_diff_t **diff, - void *diff_baton, - const svn_diff_fns_t *vtable, - apr_pool_t *pool) +svn_diff_diff4_2(svn_diff_t **diff, + void *diff_baton, + const svn_diff_fns2_t *vtable, + apr_pool_t *pool) { svn_diff__tree_t *tree; svn_diff__position_t *position_list[4]; Index: subversion/libsvn_diff/diff.h =================================================================== --- subversion/libsvn_diff/diff.h (revision 1064135) +++ subversion/libsvn_diff/diff.h (working copy) @@ -110,7 +110,7 @@ svn_error_t * svn_diff__get_tokens(svn_diff__position_t **position_list, svn_diff__tree_t *tree, void *diff_baton, - const svn_diff_fns_t *vtable, + const svn_diff_fns2_t *vtable, svn_diff_datasource_e datasource, apr_off_t prefix_lines, apr_pool_t *pool); Index: subversion/include/svn_diff.h =================================================================== --- subversion/include/svn_diff.h (revision 1064135) +++ subversion/include/svn_diff.h (working copy) @@ -106,7 +106,7 @@ typedef enum svn_diff_datasource_e /** A vtable for reading data from the three datasources. */ -typedef struct svn_diff_fns_t +typedef struct svn_diff_fns2_t { /** Open the datasource of type @a datasource. */ svn_error_t *(*datasource_open)(void *diff_baton, @@ -146,6 +146,48 @@ typedef enum svn_diff_datasource_e /** Free *all* tokens from memory, they're no longer needed. */ void (*token_discard_all)(void *diff_baton); +} svn_diff_fns2_t; + + +/** A vtable for reading data from the three datasources. + * + * @deprecated Provided for backward compatibility with the 1.6 API. + */ +typedef struct svn_diff_fns_t +{ + /** Open the datasource of type @a datasource. */ + svn_error_t *(*datasource_open)(void *diff_baton, + svn_diff_datasource_e datasource); + + /** Close the datasource of type @a datasource. */ + svn_error_t *(*datasource_close)(void *diff_baton, + svn_diff_datasource_e datasource); + + /** Get the next "token" from the datasource of type @a datasource. + * Return a "token" in @a *token. Return a hash of "token" in @a *hash. + * Leave @a token and @a hash untouched when the datasource is exhausted. + */ + svn_error_t *(*datasource_get_next_token)(apr_uint32_t *hash, void **token, + void *diff_baton, + svn_diff_datasource_e datasource); + + /** A function for ordering the tokens, resembling 'strcmp' in functionality. + * @a compare should contain the return value of the comparison: + * If @a ltoken and @a rtoken are "equal", return 0. If @a ltoken is + * "less than" @a rtoken, return a number < 0. If @a ltoken is + * "greater than" @a rtoken, return a number > 0. + */ + svn_error_t *(*token_compare)(void *diff_baton, + void *ltoken, + void *rtoken, + int *compare); + + /** Free @a token from memory, the diff algorithm is done with it. */ + void (*token_discard)(void *diff_baton, + void *token); + + /** Free *all* tokens from memory, they're no longer needed. */ + void (*token_discard_all)(void *diff_baton); } svn_diff_fns_t; @@ -154,8 +196,23 @@ typedef enum svn_diff_datasource_e /** Given a vtable of @a diff_fns/@a diff_baton for reading datasources, * return a diff object in @a *diff that represents a difference between * an "original" and "modified" datasource. Do all allocation in @a pool. + * + * @since New in 1.7. */ svn_error_t * +svn_diff_diff_2(svn_diff_t **diff, + void *diff_baton, + const svn_diff_fns2_t *diff_fns, + apr_pool_t *pool); + +/** Given a vtable of @a diff_fns/@a diff_baton for reading datasources, + * return a diff object in @a *diff that represents a difference between + * an "original" and "modified" datasource. Do all allocation in @a pool. + * + * @deprecated Provided for backward compatibility with the 1.6 API. + */ +SVN_DEPRECATED +svn_error_t * svn_diff_diff(svn_diff_t **diff, void *diff_baton, const svn_diff_fns_t *diff_fns, @@ -165,8 +222,24 @@ svn_diff_diff(svn_diff_t **diff, * return a diff object in @a *diff that represents a difference between * three datasources: "original", "modified", and "latest". Do all * allocation in @a pool. + * + * @since New in 1.7. */ svn_error_t * +svn_diff_diff3_2(svn_diff_t **diff, + void *diff_baton, + const svn_diff_fns2_t *diff_fns, + apr_pool_t *pool); + +/** Given a vtable of @a diff_fns/@a diff_baton for reading datasources, + * return a diff object in @a *diff that represents a difference between + * three datasources: "original", "modified", and "latest". Do all + * allocation in @a pool. + * + * @deprecated Provided for backward compatibility with the 1.6 API. + */ +SVN_DEPRECATED +svn_error_t * svn_diff_diff3(svn_diff_t **diff, void *diff_baton, const svn_diff_fns_t *diff_fns, @@ -177,8 +250,25 @@ svn_diff_diff3(svn_diff_t **diff, * two datasources: "original" and "latest", adjusted to become a full * difference between "original", "modified" and "latest" using "ancestor". * Do all allocation in @a pool. + * + * @since New in 1.7. */ svn_error_t * +svn_diff_diff4_2(svn_diff_t **diff, + void *diff_baton, + const svn_diff_fns2_t *diff_fns, + apr_pool_t *pool); + +/** Given a vtable of @a diff_fns/@a diff_baton for reading datasources, + * return a diff object in @a *diff that represents a difference between + * two datasources: "original" and "latest", adjusted to become a full + * difference between "original", "modified" and "latest" using "ancestor". + * Do all allocation in @a pool. + * + * @deprecated Provided for backward compatibility with the 1.6 API. + */ +SVN_DEPRECATED +svn_error_t * svn_diff_diff4(svn_diff_t **diff, void *diff_baton, const svn_diff_fns_t *diff_fns,