Author: rinrab Date: Sun May 18 19:00:51 2025 New Revision: 1925683 URL: http://svn.apache.org/viewvc?rev=1925683&view=rev Log: On the 'xpatch' branch: Add API functions for creating xpatch files, but write constant text block for now. Then invoke those functions from the cmdline when executed with --xpatch argument.
$ svn diff --xpatch <?xml version="1.0" encoding="UTF-8" ?> <xpatch> this is an xpatch </xpatch> * subversion/include/svn_client.h (svn_client_diff_xpatch, svn_client_diff_xpatch_peg): Declare functions. * subversion/libsvn_client/diff.c (svn_client_diff_xpatch, svn_client_diff_xpatch_peg): Implement functions; They will require do_diff() local function later to drive the processor. * subversion/svn/diff-cmd.c (svn_cl__diff): Use xpatch API when invoked with appropriate option. Modified: subversion/branches/xpatch/subversion/include/svn_client.h subversion/branches/xpatch/subversion/libsvn_client/diff.c subversion/branches/xpatch/subversion/svn/diff-cmd.c Modified: subversion/branches/xpatch/subversion/include/svn_client.h URL: http://svn.apache.org/viewvc/subversion/branches/xpatch/subversion/include/svn_client.h?rev=1925683&r1=1925682&r2=1925683&view=diff ============================================================================== --- subversion/branches/xpatch/subversion/include/svn_client.h (original) +++ subversion/branches/xpatch/subversion/include/svn_client.h Sun May 18 19:00:51 2025 @@ -3715,6 +3715,59 @@ svn_client_diff_summarize_peg(const char svn_client_ctx_t *ctx, apr_pool_t *pool); +/** + * Produce a diff in xpatch format, which saves the entire working copy + * state, including copies, and can be applied trough a full merge of + * the file produced, making Subversion's conflict handling working. + * + * Writes the output to @a outstream, which should be writable. This stream + * can be opened using a svn_stream_open_writable() function, or any other + * function, producing writable stream as well. + * + * See svn_client_diff7() for a description of the other parameters. + * + * @since New in 1.15. + */ +svn_error_t * +svn_client_diff_xpatch(const char *path_or_url1, + const svn_opt_revision_t *revision1, + const char *path_or_url2, + const svn_opt_revision_t *revision2, + svn_depth_t depth, + svn_boolean_t ignore_ancestry, + const apr_array_header_t *changelists, + svn_stream_t *outstream, + svn_client_ctx_t *ctx, + apr_pool_t *pool); + +/** + * Produce a diff in xpatch format, which saves the entire working copy + * state, including copies, and can be applied trough a full merge of + * the file produced, making Subversion's conflict handling working. + * The differences will be produced between the filesystem object + * @a path_or_url in peg revision @a peg_revision, as it changed between + * @a start_revision and @a end_revision. @a path_or_url can be either a + * working-copy path or URL. + * + * Writes the output to @a outstream, which should be writable. This stream + * can be opened using a svn_stream_open_writable() function, or any other + * function, producing writable stream as well. + * + * See svn_client_diff_peg7() for a description of the other parameters. + * + * @since New in 1.15. + */ +svn_error_t * +svn_client_diff_xpatch_peg(const char *path_or_url, + const svn_opt_revision_t *peg_revision, + const svn_opt_revision_t *start_revision, + const svn_opt_revision_t *end_revision, + svn_depth_t depth, + svn_boolean_t ignore_ancestry, + svn_stream_t *outstream, + svn_client_ctx_t *ctx, + apr_pool_t *pool); + /** @} */ /** Modified: subversion/branches/xpatch/subversion/libsvn_client/diff.c URL: http://svn.apache.org/viewvc/subversion/branches/xpatch/subversion/libsvn_client/diff.c?rev=1925683&r1=1925682&r2=1925683&view=diff ============================================================================== --- subversion/branches/xpatch/subversion/libsvn_client/diff.c (original) +++ subversion/branches/xpatch/subversion/libsvn_client/diff.c Sun May 18 19:00:51 2025 @@ -1422,3 +1422,40 @@ svn_client_diff_summarize_peg2(const cha diff_processor, ctx, pool, pool)); } +#define TEST_XPATCH "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" APR_EOL_STR \ + "<xpatch>" APR_EOL_STR \ + " this is an xpatch" APR_EOL_STR \ + "</xpatch>" APR_EOL_STR + +svn_error_t * +svn_client_diff_xpatch(const char *path_or_url1, + const svn_opt_revision_t *revision1, + const char *path_or_url2, + const svn_opt_revision_t *revision2, + svn_depth_t depth, + svn_boolean_t ignore_ancestry, + const apr_array_header_t *changelists, + svn_stream_t *outstream, + svn_client_ctx_t *ctx, + apr_pool_t *pool) +{ + apr_size_t len = sizeof(TEST_XPATCH); + SVN_ERR(svn_stream_write(outstream, TEST_XPATCH, &len)); + return SVN_NO_ERROR; +} + +svn_error_t * +svn_client_diff_xpatch_peg(const char *path_or_url, + const svn_opt_revision_t *peg_revision, + const svn_opt_revision_t *start_revision, + const svn_opt_revision_t *end_revision, + svn_depth_t depth, + svn_boolean_t ignore_ancestry, + svn_stream_t *outstream, + svn_client_ctx_t *ctx, + apr_pool_t *pool) +{ + apr_size_t len = sizeof(TEST_XPATCH); + SVN_ERR(svn_stream_write(outstream, TEST_XPATCH, &len)); + return SVN_NO_ERROR; +} Modified: subversion/branches/xpatch/subversion/svn/diff-cmd.c URL: http://svn.apache.org/viewvc/subversion/branches/xpatch/subversion/svn/diff-cmd.c?rev=1925683&r1=1925682&r2=1925683&view=diff ============================================================================== --- subversion/branches/xpatch/subversion/svn/diff-cmd.c (original) +++ subversion/branches/xpatch/subversion/svn/diff-cmd.c Sun May 18 19:00:51 2025 @@ -481,6 +481,17 @@ svn_cl__diff(apr_getopt_t *os, summarize_func, summarize_baton, ctx, iterpool)); } + else if (opt_state->diff.xpatch) + SVN_ERR(svn_client_diff_xpatch( + target1, + &(opt_state->start_revision), + target2, + &(opt_state->end_revision), + opt_state->depth, + ! opt_state->diff.notice_ancestry, + opt_state->changelists, + outstream, + ctx, iterpool)); else SVN_ERR(svn_client_diff7( options, @@ -539,6 +550,16 @@ svn_cl__diff(apr_getopt_t *os, summarize_func, summarize_baton, ctx, iterpool)); } + else if (opt_state->diff.xpatch) + SVN_ERR(svn_client_diff_xpatch_peg( + truepath, + &peg_revision, + &opt_state->start_revision, + &opt_state->end_revision, + opt_state->depth, + ! opt_state->diff.notice_ancestry, + outstream, + ctx, iterpool)); else SVN_ERR(svn_client_diff_peg7( options,