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,


Reply via email to