svn commit: r1921611 [2/2] - in /subversion/trunk/subversion/libsvn_client: diff.c diff_patch.c
[email protected] Sun, 27 Oct 2024 21:09:45 -0000
Newsgroups
gmane.comp.version-control.subversion.svn
Message-ID
<[email protected] >
Copied: subversion/trunk/subversion/libsvn_client/diff_patch.c (from r1921610, subversion/trunk/subversion/libsvn_client/diff.c)
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/diff_patch.c?p2=subversion/trunk/subversion/libsvn_client/diff_patch.c&p1=subversion/trunk/subversion/libsvn_client/diff.c&r1=1921610&r2=1921611&rev=1921611&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/diff.c (original)
+++ subversion/trunk/subversion/libsvn_client/diff_patch.c Sun Oct 27 21:09:45 2024
@@ -1,5 +1,5 @@
/*
- * diff.c: comparing
+ * diff_patch.c: writer for unidiff files from diff_processor.
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
@@ -23,10 +23,6 @@
/* ==================================================================== */
-/* We define this here to remove any further warnings about the usage of
- experimental functions in this file. */
-#define SVN_EXPERIMENTAL
-
/*** Includes. ***/
@@ -37,7 +33,6 @@
#include "svn_hash.h"
#include "svn_wc.h"
#include "svn_diff.h"
-#include "svn_mergeinfo.h"
#include "svn_client.h"
#include "svn_string.h"
#include "svn_error.h"
@@ -45,19 +40,13 @@
#include "svn_path.h"
#include "svn_io.h"
#include "svn_utf.h"
-#include "svn_pools.h"
-#include "svn_config.h"
#include "svn_props.h"
-#include "svn_subst.h"
#include "client.h"
-#include "private/svn_client_shelf.h"
#include "private/svn_client_private.h"
#include "private/svn_wc_private.h"
#include "private/svn_diff_private.h"
-#include "private/svn_subr_private.h"
#include "private/svn_io_private.h"
-#include "private/svn_ra_private.h"
#include "svn_private_config.h"
@@ -1400,1152 +1389,6 @@ diff_dir_deleted(const char *relpath,
return SVN_NO_ERROR;
}
-/*-----------------------------------------------------------------*/
-
-/** The logic behind 'svn diff' and 'svn merge'. */
-
-
-/* Hi! This is a comment left behind by Karl, and Ben is too afraid
- to erase it at this time, because he's not fully confident that all
- this knowledge has been grokked yet.
-
- There are five cases:
- 1. path is not a URL and start_revision != end_revision
- 2. path is not a URL and start_revision == end_revision
- 3. path is a URL and start_revision != end_revision
- 4. path is a URL and start_revision == end_revision
- 5. path is not a URL and no revisions given
-
- With only one distinct revision the working copy provides the
- other. When path is a URL there is no working copy. Thus
-
- 1: compare repository versions for URL corresponding to working copy
- 2: compare working copy against repository version
- 3: compare repository versions for URL
- 4: nothing to do.
- 5: compare working copy against text-base
-
- Case 4 is not as stupid as it looks, for example it may occur if
- the user specifies two dates that resolve to the same revision. */
-
-
-/** Check if paths PATH_OR_URL1 and PATH_OR_URL2 are urls and if the
- * revisions REVISION1 and REVISION2 are local. If PEG_REVISION is not
- * unspecified, ensure that at least one of the two revisions is not
- * BASE or WORKING.
- * If PATH_OR_URL1 can only be found in the repository, set *IS_REPOS1
- * to TRUE. If PATH_OR_URL2 can only be found in the repository, set
- * *IS_REPOS2 to TRUE. */
-static svn_error_t *
-check_paths(svn_boolean_t *is_repos1,
- svn_boolean_t *is_repos2,
- const char *path_or_url1,
- const char *path_or_url2,
- const svn_opt_revision_t *revision1,
- const svn_opt_revision_t *revision2,
- const svn_opt_revision_t *peg_revision)
-{
- svn_boolean_t is_local_rev1, is_local_rev2;
-
- /* Verify our revision arguments in light of the paths. */
- if ((revision1->kind == svn_opt_revision_unspecified)
- || (revision2->kind == svn_opt_revision_unspecified))
- return svn_error_create(SVN_ERR_CLIENT_BAD_REVISION, NULL,
- _("Not all required revisions are specified"));
-
- /* Revisions can be said to be local or remote.
- * BASE and WORKING are local revisions. */
- is_local_rev1 =
- ((revision1->kind == svn_opt_revision_base)
- || (revision1->kind == svn_opt_revision_working));
- is_local_rev2 =
- ((revision2->kind == svn_opt_revision_base)
- || (revision2->kind == svn_opt_revision_working));
-
- if (peg_revision->kind != svn_opt_revision_unspecified &&
- is_local_rev1 && is_local_rev2)
- return svn_error_create(SVN_ERR_CLIENT_BAD_REVISION, NULL,
- _("At least one revision must be something other "
- "than BASE or WORKING when diffing a URL"));
-
- /* Working copy paths with non-local revisions get turned into
- URLs. We don't do that here, though. We simply record that it
- needs to be done, which is information that helps us choose our
- diff helper function. */
- *is_repos1 = ! is_local_rev1 || svn_path_is_url(path_or_url1);
- *is_repos2 = ! is_local_rev2 || svn_path_is_url(path_or_url2);
-
- return SVN_NO_ERROR;
-}
-
-/* Raise an error if the diff target URL does not exist at REVISION.
- * If REVISION does not equal OTHER_REVISION, mention both revisions in
- * the error message. Use RA_SESSION to contact the repository.
- * Use POOL for temporary allocations. */
-static svn_error_t *
-check_diff_target_exists(const char *url,
- svn_revnum_t revision,
- svn_revnum_t other_revision,
- svn_ra_session_t *ra_session,
- apr_pool_t *pool)
-{
- svn_node_kind_t kind;
- const char *session_url;
-
- SVN_ERR(svn_ra_get_session_url(ra_session, &session_url, pool));
-
- if (strcmp(url, session_url) != 0)
- SVN_ERR(svn_ra_reparent(ra_session, url, pool));
-
- SVN_ERR(svn_ra_check_path(ra_session, "", revision, &kind, pool));
- if (kind == svn_node_none)
- {
- if (revision == other_revision)
- return svn_error_createf(SVN_ERR_FS_NOT_FOUND, NULL,
- _("Diff target '%s' was not found in the "
- "repository at revision '%ld'"),
- url, revision);
- else
- return svn_error_createf(SVN_ERR_FS_NOT_FOUND, NULL,
- _("Diff target '%s' was not found in the "
- "repository at revision '%ld' or '%ld'"),
- url, revision, other_revision);
- }
-
- if (strcmp(url, session_url) != 0)
- SVN_ERR(svn_ra_reparent(ra_session, session_url, pool));
-
- return SVN_NO_ERROR;
-}
-
-/** Prepare a repos repos diff between PATH_OR_URL1 and
- * PATH_OR_URL2@PEG_REVISION, in the revision range REVISION1:REVISION2.
- *
- * Return the resolved URL and peg revision pairs in *URL1, *REV1 and in
- * *URL2, *REV2.
- *
- * Return suitable anchor URL and target pairs in *ANCHOR1, *TARGET1 and
- * in *ANCHOR2, *TARGET2, corresponding to *URL1 and *URL2.
- *
- * (The choice of anchor URLs here appears to be: start with *URL1, *URL2;
- * then take the parent dir on both sides, unless either of *URL1 or *URL2
- * is the repository root or the parent dir of *URL1 is unreadable.)
- *
- * Set *KIND1 and *KIND2 to the node kinds of *URL1 and *URL2, and verify
- * that at least one of the diff targets exists.
- *
- * Set *RA_SESSION to an RA session parented at the URL *ANCHOR1.
- *
- * Use client context CTX. Do all allocations in POOL. */
-static svn_error_t *
-diff_prepare_repos_repos(const char **url1,
- const char **url2,
- svn_revnum_t *rev1,
- svn_revnum_t *rev2,
- const char **anchor1,
- const char **anchor2,
- const char **target1,
- const char **target2,
- svn_node_kind_t *kind1,
- svn_node_kind_t *kind2,
- svn_ra_session_t **ra_session,
- svn_client_ctx_t *ctx,
- const char *path_or_url1,
- const char *path_or_url2,
- const svn_opt_revision_t *revision1,
- const svn_opt_revision_t *revision2,
- const svn_opt_revision_t *peg_revision,
- apr_pool_t *pool)
-{
- const char *local_abspath1 = NULL;
- const char *local_abspath2 = NULL;
- const char *repos_root_url;
- const char *wri_abspath = NULL;
- svn_client__pathrev_t *resolved1;
- svn_client__pathrev_t *resolved2 = NULL;
- enum svn_opt_revision_kind peg_kind = peg_revision->kind;
-
- if (!svn_path_is_url(path_or_url2))
- {
- SVN_ERR(svn_dirent_get_absolute(&local_abspath2, path_or_url2, pool));
- SVN_ERR(svn_wc__node_get_url(url2, ctx->wc_ctx, local_abspath2,
- pool, pool));
- wri_abspath = local_abspath2;
- }
- else
- *url2 = apr_pstrdup(pool, path_or_url2);
-
- if (!svn_path_is_url(path_or_url1))
- {
- SVN_ERR(svn_dirent_get_absolute(&local_abspath1, path_or_url1, pool));
- wri_abspath = local_abspath1;
- }
-
- SVN_ERR(svn_client_open_ra_session2(ra_session, *url2, wri_abspath,
- ctx, pool, pool));
-
- /* If we are performing a pegged diff, we need to find out what our
- actual URLs will be. */
- if (peg_kind != svn_opt_revision_unspecified
- || path_or_url1 == path_or_url2
- || local_abspath2)
- {
- svn_error_t *err;
-
- err = svn_client__resolve_rev_and_url(&resolved2,
- *ra_session, path_or_url2,
- peg_revision, revision2,
- ctx, pool);
- if (err)
- {
- if (err->apr_err != SVN_ERR_CLIENT_UNRELATED_RESOURCES
- && err->apr_err != SVN_ERR_FS_NOT_FOUND)
- return svn_error_trace(err);
-
- svn_error_clear(err);
- resolved2 = NULL;
- }
- }
- else
- resolved2 = NULL;
-
- if (peg_kind != svn_opt_revision_unspecified
- || path_or_url1 == path_or_url2
- || local_abspath1)
- {
- svn_error_t *err;
-
- err = svn_client__resolve_rev_and_url(&resolved1,
- *ra_session, path_or_url1,
- peg_revision, revision1,
- ctx, pool);
- if (err)
- {
- if (err->apr_err != SVN_ERR_CLIENT_UNRELATED_RESOURCES
- && err->apr_err != SVN_ERR_FS_NOT_FOUND)
- return svn_error_trace(err);
-
- svn_error_clear(err);
- resolved1 = NULL;
- }
- }
- else
- resolved1 = NULL;
-
- if (resolved1)
- {
- *url1 = resolved1->url;
- *rev1 = resolved1->rev;
- }
- else
- {
- /* It would be nice if we could just return an error when resolving a
- location fails... But in many such cases we prefer diffing against
- a non-existent location to show adds or removes (see issue #4153) */
-
- if (resolved2
- && (peg_kind != svn_opt_revision_unspecified
- || path_or_url1 == path_or_url2))
- *url1 = resolved2->url;
- else if (! local_abspath1)
- *url1 = path_or_url1;
- else
- SVN_ERR(svn_wc__node_get_url(url1, ctx->wc_ctx, local_abspath1,
- pool, pool));
-
- SVN_ERR(svn_client__get_revision_number(rev1, NULL, ctx->wc_ctx,
- local_abspath1 /* may be NULL */,
- *ra_session, revision1, pool));
- }
-
- if (resolved2)
- {
- *url2 = resolved2->url;
- *rev2 = resolved2->rev;
- }
- else
- {
- /* It would be nice if we could just return an error when resolving a
- location fails... But in many such cases we prefer diffing against
- a non-existent location to show adds or removes (see issue #4153) */
-
- if (resolved1
- && (peg_kind != svn_opt_revision_unspecified
- || path_or_url1 == path_or_url2))
- *url2 = resolved1->url;
- /* else keep url2 */
-
- SVN_ERR(svn_client__get_revision_number(rev2, NULL, ctx->wc_ctx,
- local_abspath2 /* may be NULL */,
- *ra_session, revision2, pool));
- }
-
- /* Resolve revision and get path kind for the second target. */
- SVN_ERR(svn_ra_reparent(*ra_session, *url2, pool));
- SVN_ERR(svn_ra_check_path(*ra_session, "", *rev2, kind2, pool));
-
- /* Do the same for the first target. */
- SVN_ERR(svn_ra_reparent(*ra_session, *url1, pool));
- SVN_ERR(svn_ra_check_path(*ra_session, "", *rev1, kind1, pool));
-
- /* Either both URLs must exist at their respective revisions,
- * or one of them may be missing from one side of the diff. */
- if (*kind1 == svn_node_none && *kind2 == svn_node_none)
- {
- if (strcmp(*url1, *url2) == 0)
- return svn_error_createf(SVN_ERR_FS_NOT_FOUND, NULL,
- _("Diff target '%s' was not found in the "
- "repository at revisions '%ld' and '%ld'"),
- *url1, *rev1, *rev2);
- else
- return svn_error_createf(SVN_ERR_FS_NOT_FOUND, NULL,
- _("Diff targets '%s' and '%s' were not found "
- "in the repository at revisions '%ld' and "
- "'%ld'"),
- *url1, *url2, *rev1, *rev2);
- }
- else if (*kind1 == svn_node_none)
- SVN_ERR(check_diff_target_exists(*url1, *rev2, *rev1, *ra_session, pool));
- else if (*kind2 == svn_node_none)
- SVN_ERR(check_diff_target_exists(*url2, *rev1, *rev2, *ra_session, pool));
-
- SVN_ERR(svn_ra_get_repos_root2(*ra_session, &repos_root_url, pool));
-
- /* Choose useful anchors and targets for our two URLs. */
- *anchor1 = *url1;
- *anchor2 = *url2;
- *target1 = "";
- *target2 = "";
-
- /* If none of the targets is the repository root open the parent directory
- to allow describing replacement of the target itself */
- if (strcmp(*url1, repos_root_url) != 0
- && strcmp(*url2, repos_root_url) != 0)
- {
- svn_node_kind_t ignored_kind;
- svn_error_t *err;
-
- svn_uri_split(anchor1, target1, *url1, pool);
- svn_uri_split(anchor2, target2, *url2, pool);
-
- SVN_ERR(svn_ra_reparent(*ra_session, *anchor1, pool));
-
- /* We might not have the necessary rights to read the root now.
- (It is ok to pass a revision here where the node doesn't exist) */
- err = svn_ra_check_path(*ra_session, "", *rev1, &ignored_kind, pool);
-
- if (err && (err->apr_err == SVN_ERR_RA_DAV_FORBIDDEN
- || err->apr_err == SVN_ERR_RA_NOT_AUTHORIZED))
- {
- svn_error_clear(err);
-
- /* Ok, lets undo the reparent...
-
- We can't report replacements this way, but at least we can
- report changes on the descendants */
-
- *anchor1 = svn_path_url_add_component2(*anchor1, *target1, pool);
- *anchor2 = svn_path_url_add_component2(*anchor2, *target2, pool);
- *target1 = "";
- *target2 = "";
-
- SVN_ERR(svn_ra_reparent(*ra_session, *anchor1, pool));
- }
- else
- SVN_ERR(err);
- }
-
- return SVN_NO_ERROR;
-}
-
-/* A Theoretical Note From Ben, regarding do_diff().
-
- This function is really svn_client_diff7(). If you read the public
- API description for svn_client_diff7(), it sounds quite Grand. It
- sounds really generalized and abstract and beautiful: that it will
- diff any two paths, be they working-copy paths or URLs, at any two
- revisions.
-
- Now, the *reality* is that we have exactly three 'tools' for doing
- diffing, and thus this routine is built around the use of the three
- tools. Here they are, for clarity:
-
- - svn_wc_diff: assumes both paths are the same wcpath.
- compares wcpath@BASE vs. wcpath@WORKING
-
- - svn_wc_get_diff_editor: compares some URL@REV vs. wcpath@WORKING
-
- - svn_client__get_diff_editor: compares some URL1@REV1 vs. URL2@REV2
-
- Since Subversion 1.8 we also have a variant of svn_wc_diff called
- svn_client__arbitrary_nodes_diff, that allows handling WORKING-WORKING
- comparisons between nodes in the working copy.
-
- So the truth of the matter is, if the caller's arguments can't be
- pigeonholed into one of these use-cases, we currently bail with a
- friendly apology.
-
- Perhaps someday a brave soul will truly make svn_client_diff7()
- perfectly general. For now, we live with the 90% case. Certainly,
- the commandline client only calls this function in legal ways.
- When there are other users of svn_client.h, maybe this will become
- a more pressing issue.
- */
-
-/* Return a "you can't do that" error, optionally wrapping another
- error CHILD_ERR. */
-static svn_error_t *
-unsupported_diff_error(svn_error_t *child_err)
-{
- return svn_error_create(SVN_ERR_INCORRECT_PARAMS, child_err,
- _("Sorry, svn_client_diff7 was called in a way "
- "that is not yet supported"));
-}
-
-/* Perform a diff between two working-copy paths.
-
- PATH1 and PATH2 are both working copy paths. REVISION1 and
- REVISION2 are their respective revisions.
-
- For now, require PATH1=PATH2, REVISION1='base', REVISION2='working',
- otherwise return an error.
-
- Anchor DIFF_PROCESSOR at the requested diff targets.
-
- All other options are the same as those passed to svn_client_diff7(). */
-static svn_error_t *
-diff_wc_wc(const char *path1,
- const svn_opt_revision_t *revision1,
- const char *path2,
- const svn_opt_revision_t *revision2,
- svn_depth_t depth,
- svn_boolean_t ignore_ancestry,
- const apr_array_header_t *changelists,
- const svn_diff_tree_processor_t *diff_processor,
- svn_client_ctx_t *ctx,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- const char *abspath1;
-
- SVN_ERR_ASSERT(! svn_path_is_url(path1));
- SVN_ERR_ASSERT(! svn_path_is_url(path2));
-
- SVN_ERR(svn_dirent_get_absolute(&abspath1, path1, scratch_pool));
-
- /* Currently we support only the case where path1 and path2 are the
- same path. */
- if ((strcmp(path1, path2) != 0)
- || (! ((revision1->kind == svn_opt_revision_base)
- && (revision2->kind == svn_opt_revision_working))))
- return unsupported_diff_error(
- svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
- _("A non-URL diff at this time must be either from "
- "a path's base to the same path's working version "
- "or between the working versions of two paths"
- )));
-
- /* This will open the RA session internally if needed. */
- SVN_ERR(svn_client__textbase_sync(NULL, abspath1, TRUE, TRUE, ctx,
- NULL, scratch_pool, scratch_pool));
-
- SVN_ERR(svn_wc__diff7(TRUE,
- ctx->wc_ctx, abspath1, depth,
- ignore_ancestry, changelists,
- diff_processor,
- ctx->cancel_func, ctx->cancel_baton,
- result_pool, scratch_pool));
-
- SVN_ERR(svn_client__textbase_sync(NULL, abspath1, FALSE, TRUE, ctx,
- NULL, scratch_pool, scratch_pool));
-
- return SVN_NO_ERROR;
-}
-
-/* Perform a diff between two repository paths.
-
- PATH_OR_URL1 and PATH_OR_URL2 may be either URLs or the working copy paths.
- REVISION1 and REVISION2 are their respective revisions.
- If PEG_REVISION is specified, PATH_OR_URL2 is the path at the peg revision,
- and the actual two paths compared are determined by following copy
- history from PATH_OR_URL2.
-
- If DDI is null, anchor the DIFF_PROCESSOR at the requested diff
- targets. (This case is used by diff-summarize.)
-
- If DDI is non-null: Set DDI->orig_path_* to the two diff target URLs as
- resolved at the given revisions; set DDI->anchor to an anchor WC path
- if either of PATH_OR_URL* is given as a WC path, else to null; set
- DDI->session_relpath to the repository-relpath of the anchor URL for
- DDI->orig_path_1. Anchor the DIFF_PROCESSOR at the anchor chosen
- for the underlying diff implementation if the target on either side
- is a file, else at the actual requested targets.
-
- (The choice of WC anchor implemented here for DDI->anchor appears to
- be: choose PATH_OR_URL2 (if it's a WC path) or else PATH_OR_URL1 (if
- it's a WC path); then take its parent dir unless both resolved URLs
- refer to directories.)
-
- (For the choice of URL anchor for DDI->session_relpath, see
- diff_prepare_repos_repos().)
-
- ### Bizarre anchoring. TODO: always anchor DIFF_PROCESSOR at the
- requested targets.
-
- All other options are the same as those passed to svn_client_diff7(). */
-static svn_error_t *
-diff_repos_repos(svn_client__diff_driver_info_t *ddi,
- const char *path_or_url1,
- const char *path_or_url2,
- const svn_opt_revision_t *revision1,
- const svn_opt_revision_t *revision2,
- const svn_opt_revision_t *peg_revision,
- svn_depth_t depth,
- svn_boolean_t ignore_ancestry,
- svn_boolean_t text_deltas,
- const svn_diff_tree_processor_t *diff_processor,
- svn_client_ctx_t *ctx,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- svn_ra_session_t *extra_ra_session;
-
- const svn_ra_reporter3_t *reporter;
- void *reporter_baton;
-
- const svn_delta_editor_t *diff_editor;
- void *diff_edit_baton;
-
- const char *url1;
- const char *url2;
- svn_revnum_t rev1;
- svn_revnum_t rev2;
- svn_node_kind_t kind1;
- svn_node_kind_t kind2;
- const char *anchor1;
- const char *anchor2;
- const char *target1;
- const char *target2;
- svn_ra_session_t *ra_session;
-
- /* Prepare info for the repos repos diff. */
- SVN_ERR(diff_prepare_repos_repos(&url1, &url2, &rev1, &rev2,
- &anchor1, &anchor2, &target1, &target2,
- &kind1, &kind2, &ra_session,
- ctx, path_or_url1, path_or_url2,
- revision1, revision2, peg_revision,
- scratch_pool));
-
- /* Set up the repos_diff editor on BASE_PATH, if available.
- Otherwise, we just use "". */
-
- if (ddi)
- {
- /* Get actual URLs. */
- ddi->orig_path_1 = url1;
- ddi->orig_path_2 = url2;
-
- /* This should be moved to the diff writer
- - path_or_url are provided by the caller
- - target1 is available as *root_relpath
- - (kind1 != svn_node_dir || kind2 != svn_node_dir) = !*root_is_dir */
-
- if (!svn_path_is_url(path_or_url2))
- ddi->anchor = path_or_url2;
- else if (!svn_path_is_url(path_or_url1))
- ddi->anchor = path_or_url1;
- else
- ddi->anchor = NULL;
-
- if (*target1 && ddi->anchor
- && (kind1 != svn_node_dir || kind2 != svn_node_dir))
- ddi->anchor = svn_dirent_dirname(ddi->anchor, result_pool);
- }
-
- /* The repository can bring in a new working copy, but not delete
- everything. Luckily our new diff handler can just be reversed. */
- if (kind2 == svn_node_none)
- {
- const char *str_tmp;
- svn_revnum_t rev_tmp;
-
- str_tmp = url2;
- url2 = url1;
- url1 = str_tmp;
-
- rev_tmp = rev2;
- rev2 = rev1;
- rev1 = rev_tmp;
-
- str_tmp = anchor2;
- anchor2 = anchor1;
- anchor1 = str_tmp;
-
- str_tmp = target2;
- target2 = target1;
- target1 = str_tmp;
-
- diff_processor = svn_diff__tree_processor_reverse_create(diff_processor,
- scratch_pool);
- }
-
- /* Filter the first path component using a filter processor, until we fixed
- the diff processing to handle this directly */
- if (!ddi)
- {
- diff_processor = svn_diff__tree_processor_filter_create(
- diff_processor, target1, scratch_pool);
- }
- else if ((kind1 != svn_node_file && kind2 != svn_node_file)
- && target1[0] != '\0')
- {
- diff_processor = svn_diff__tree_processor_filter_create(
- diff_processor, target1, scratch_pool);
- }
-
- /* Now, we open an extra RA session to the correct anchor
- location for URL1. This is used during the editor calls to fetch file
- contents. */
- SVN_ERR(svn_ra__dup_session(&extra_ra_session, ra_session, anchor1,
- scratch_pool, scratch_pool));
-
- if (ddi)
- {
- const char *repos_root_url;
- const char *session_url;
-
- SVN_ERR(svn_ra_get_repos_root2(ra_session, &repos_root_url,
- scratch_pool));
- SVN_ERR(svn_ra_get_session_url(ra_session, &session_url,
- scratch_pool));
-
- ddi->session_relpath = svn_uri_skip_ancestor(repos_root_url,
- session_url,
- result_pool);
- }
-
- SVN_ERR(svn_client__get_diff_editor2(
- &diff_editor, &diff_edit_baton,
- extra_ra_session, depth,
- rev1,
- text_deltas,
- diff_processor,
- ctx->cancel_func, ctx->cancel_baton,
- scratch_pool));
-
- /* We want to switch our txn into URL2 */
- SVN_ERR(svn_ra_do_diff3(ra_session, &reporter, &reporter_baton,
- rev2, target1,
- depth, ignore_ancestry, text_deltas,
- url2, diff_editor, diff_edit_baton, scratch_pool));
-
- /* Drive the reporter; do the diff. */
- SVN_ERR(reporter->set_path(reporter_baton, "", rev1,
- svn_depth_infinity,
- FALSE, NULL,
- scratch_pool));
-
- return svn_error_trace(
- reporter->finish_report(reporter_baton, scratch_pool));
-}
-
-/* Perform a diff between a repository path and a working-copy path.
-
- PATH_OR_URL1 may be either a URL or a working copy path. PATH2 is a
- working copy path. REVISION1 is the revision of URL1. If PEG_REVISION1
- is specified, then PATH_OR_URL1 is the path in the peg revision, and the
- actual repository path to be compared is determined by following copy
- history.
-
- REVISION_KIND2 specifies which revision should be reported from the
- working copy (BASE or WORKING)
-
- If REVERSE is TRUE, the diff will be reported in reverse.
-
- If DDI is null, anchor the DIFF_PROCESSOR at the requested diff
- targets. (This case is used by diff-summarize.)
-
- If DDI is non-null: Set DDI->orig_path_* to the URLs of the two diff
- targets as resolved at the given revisions; set DDI->anchor to a WC path
- anchor for PATH2; set DDI->session_relpath to the repository-relpath of
- the URL of that same anchor WC path.
-
- All other options are the same as those passed to svn_client_diff7(). */
-static svn_error_t *
-diff_repos_wc(svn_client__diff_driver_info_t *ddi,
- const char *path_or_url1,
- const svn_opt_revision_t *revision1,
- const svn_opt_revision_t *peg_revision1,
- const char *path2,
- enum svn_opt_revision_kind revision2_kind,
- svn_boolean_t reverse,
- svn_depth_t depth,
- svn_boolean_t ignore_ancestry,
- const apr_array_header_t *changelists,
- const svn_diff_tree_processor_t *diff_processor,
- svn_client_ctx_t *ctx,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- const char *anchor, *anchor_url, *target;
- svn_ra_session_t *ra_session;
- svn_depth_t diff_depth;
- const svn_ra_reporter3_t *reporter;
- void *reporter_baton;
- const svn_delta_editor_t *diff_editor;
- void *diff_edit_baton;
- svn_boolean_t rev2_is_base = (revision2_kind == svn_opt_revision_base);
- svn_boolean_t server_supports_depth;
- const char *abspath_or_url1;
- const char *abspath2;
- const char *anchor_abspath;
- svn_boolean_t is_copy;
- svn_revnum_t cf_revision;
- const char *cf_repos_relpath;
- const char *cf_repos_root_url;
- svn_depth_t cf_depth;
- const char *copy_root_abspath;
- const char *target_url;
- svn_client__pathrev_t *loc1;
-
- SVN_ERR_ASSERT(! svn_path_is_url(path2));
-
- if (!svn_path_is_url(path_or_url1))
- {
- SVN_ERR(svn_dirent_get_absolute(&abspath_or_url1, path_or_url1,
- scratch_pool));
- }
- else
- {
- abspath_or_url1 = path_or_url1;
- }
-
- SVN_ERR(svn_dirent_get_absolute(&abspath2, path2, scratch_pool));
-
- /* Check if our diff target is a copied node. */
- SVN_ERR(svn_wc__node_get_origin(&is_copy,
- &cf_revision,
- &cf_repos_relpath,
- &cf_repos_root_url,
- NULL, &cf_depth,
- ©_root_abspath,
- ctx->wc_ctx, abspath2,
- FALSE, scratch_pool, scratch_pool));
-
- SVN_ERR(svn_client__ra_session_from_path2(&ra_session, &loc1,
- path_or_url1, abspath2,
- peg_revision1, revision1,
- ctx, scratch_pool));
-
- if (revision2_kind == svn_opt_revision_base || !is_copy)
- {
- /* Convert path_or_url1 to a URL to feed to do_diff. */
- SVN_ERR(svn_wc_get_actual_target2(&anchor, &target, ctx->wc_ctx, path2,
- scratch_pool, scratch_pool));
-
- /* Handle the ugly case where target is ".." */
- if (*target && !svn_path_is_single_path_component(target))
- {
- anchor = svn_dirent_join(anchor, target, scratch_pool);
- target = "";
- }
-
- /* Fetch the URL of the anchor directory. */
- SVN_ERR(svn_dirent_get_absolute(&anchor_abspath, anchor, scratch_pool));
- SVN_ERR(svn_wc__node_get_url(&anchor_url, ctx->wc_ctx, anchor_abspath,
- scratch_pool, scratch_pool));
- SVN_ERR_ASSERT(anchor_url != NULL);
-
- target_url = NULL;
- }
- else /* is_copy && revision2->kind != svn_opt_revision_base */
- {
-#if 0
- svn_node_kind_t kind;
-#endif
- /* ### Ugly hack ahead ###
- *
- * We're diffing a locally copied/moved node.
- * Describe the copy source to the reporter instead of the copy itself.
- * Doing the latter would generate a single add_directory() call to the
- * diff editor which results in an unexpected diff (the copy would
- * be shown as deleted).
- *
- * ### But if we will receive any real changes from the repositor we
- * will most likely fail to apply them as the wc diff editor assumes
- * that we have the data to which the change applies in BASE...
- */
-
- target_url = svn_path_url_add_component2(cf_repos_root_url,
- cf_repos_relpath,
- scratch_pool);
-
-#if 0
- /*SVN_ERR(svn_wc_read_kind2(&kind, ctx->wc_ctx, abspath2, FALSE, FALSE,
- scratch_pool));
-
- if (kind != svn_node_dir
- || strcmp(copy_root_abspath, abspath2) != 0) */
-#endif
- {
- /* We are looking at a subdirectory of the repository,
- We can describe the parent directory as the anchor..
-
- ### This 'appears to work', but that is really dumb luck
- ### for the simple cases in the test suite */
- anchor_abspath = svn_dirent_dirname(abspath2, scratch_pool);
- anchor_url = svn_path_url_add_component2(cf_repos_root_url,
- svn_relpath_dirname(
- cf_repos_relpath,
- scratch_pool),
- scratch_pool);
- target = svn_dirent_basename(abspath2, NULL);
- anchor = svn_dirent_dirname(path2, scratch_pool);
- }
-#if 0
- else
- {
- /* This code, while ok can't be enabled without causing test
- * failures. The repository will send some changes against
- * BASE for nodes that don't have BASE...
- */
- anchor_abspath = abspath2;
- anchor_url = svn_path_url_add_component2(cf_repos_root_url,
- cf_repos_relpath,
- scratch_pool);
- anchor = path2;
- target = "";
- }
-#endif
- }
-
- SVN_ERR(svn_ra_reparent(ra_session, anchor_url, scratch_pool));
-
- if (ddi)
- {
- const char *repos_root_url;
-
- ddi->anchor = anchor;
-
- if (!reverse)
- {
- ddi->orig_path_1 = apr_pstrdup(result_pool, loc1->url);
- ddi->orig_path_2 =
- svn_path_url_add_component2(anchor_url, target, result_pool);
- }
- else
- {
- ddi->orig_path_1 =
- svn_path_url_add_component2(anchor_url, target, result_pool);
- ddi->orig_path_2 = apr_pstrdup(result_pool, loc1->url);
- }
-
- SVN_ERR(svn_ra_get_repos_root2(ra_session, &repos_root_url,
- scratch_pool));
-
- ddi->session_relpath = svn_uri_skip_ancestor(repos_root_url,
- anchor_url,
- result_pool);
- }
- else
- {
- diff_processor = svn_diff__tree_processor_filter_create(
- diff_processor, target, scratch_pool);
- }
-
- if (reverse)
- diff_processor = svn_diff__tree_processor_reverse_create(diff_processor, scratch_pool);
-
- SVN_ERR(svn_client__textbase_sync(NULL, abspath2, TRUE, TRUE, ctx,
- ra_session, scratch_pool, scratch_pool));
-
- /* Use the diff editor to generate the diff. */
- SVN_ERR(svn_ra_has_capability(ra_session, &server_supports_depth,
- SVN_RA_CAPABILITY_DEPTH, scratch_pool));
- SVN_ERR(svn_wc__get_diff_editor(&diff_editor, &diff_edit_baton,
- ctx->wc_ctx,
- anchor_abspath,
- target,
- depth,
- ignore_ancestry,
- rev2_is_base,
- reverse,
- server_supports_depth,
- changelists,
- diff_processor,
- ctx->cancel_func, ctx->cancel_baton,
- scratch_pool, scratch_pool));
-
- if (depth != svn_depth_infinity)
- diff_depth = depth;
- else
- diff_depth = svn_depth_unknown;
-
- /* Tell the RA layer we want a delta to change our txn to URL1 */
- SVN_ERR(svn_ra_do_diff3(ra_session,
- &reporter, &reporter_baton,
- loc1->rev,
- target,
- diff_depth,
- ignore_ancestry,
- TRUE, /* text_deltas */
- loc1->url,
- diff_editor, diff_edit_baton,
- scratch_pool));
-
- if (is_copy && revision2_kind != svn_opt_revision_base)
- {
- /* Report the copy source. */
- if (cf_depth == svn_depth_unknown)
- cf_depth = svn_depth_infinity;
-
- /* Reporting the in-wc revision as r0, makes the repository send
- everything as added, which avoids using BASE for pristine information,
- which is not there (or unrelated) for a copy */
-
- SVN_ERR(reporter->set_path(reporter_baton, "",
- ignore_ancestry ? 0 : cf_revision,
- cf_depth, FALSE, NULL, scratch_pool));
-
- if (*target)
- SVN_ERR(reporter->link_path(reporter_baton, target,
- target_url,
- ignore_ancestry ? 0 : cf_revision,
- cf_depth, FALSE, NULL, scratch_pool));
-
- /* Finish the report to generate the diff. */
- SVN_ERR(reporter->finish_report(reporter_baton, scratch_pool));
- }
- else
- {
- /* Create a txn mirror of path2; the diff editor will print
- diffs in reverse. :-) */
- SVN_ERR(svn_wc_crawl_revisions6(ctx->wc_ctx, abspath2,
- reporter, reporter_baton,
- FALSE, depth, TRUE,
- (! server_supports_depth),
- FALSE,
- ctx->cancel_func, ctx->cancel_baton,
- NULL, NULL, /* notification is N/A */
- scratch_pool));
- }
-
- SVN_ERR(svn_client__textbase_sync(NULL, abspath2, FALSE, TRUE, ctx,
- NULL, scratch_pool, scratch_pool));
-
- return SVN_NO_ERROR;
-}
-
-/* Run diff on shelf SHELF_NAME, if it exists.
- */
-static svn_error_t *
-diff_shelf(const char *shelf_name,
- const char *target_abspath,
- svn_depth_t depth,
- svn_boolean_t ignore_ancestry,
- const svn_diff_tree_processor_t *diff_processor,
- svn_client_ctx_t *ctx,
- apr_pool_t *scratch_pool)
-{
- svn_error_t *err;
- svn_client__shelf_t *shelf;
- svn_client__shelf_version_t *shelf_version;
- const char *wc_relpath;
-
- err = svn_client__shelf_open_existing(&shelf,
- shelf_name, target_abspath,
- ctx, scratch_pool);
- if (err && err->apr_err == SVN_ERR_ILLEGAL_TARGET)
- {
- svn_error_clear(err);
- return SVN_NO_ERROR;
- }
- else
- SVN_ERR(err);
-
- SVN_ERR(svn_client__shelf_version_open(&shelf_version,
- shelf, shelf->max_version,
- scratch_pool, scratch_pool));
- wc_relpath = svn_dirent_skip_ancestor(shelf->wc_root_abspath, target_abspath);
- SVN_ERR(svn_client__shelf_diff(shelf_version, wc_relpath,
- depth, ignore_ancestry,
- diff_processor, scratch_pool));
- SVN_ERR(svn_client__shelf_close(shelf, scratch_pool));
-
- return SVN_NO_ERROR;
-}
-
-/* Run diff on all shelves named in CHANGELISTS by a changelist name
- * of the form "svn:shelf:SHELF_NAME", if they exist.
- */
-static svn_error_t *
-diff_shelves(const apr_array_header_t *changelists,
- const char *target_abspath,
- svn_depth_t depth,
- svn_boolean_t ignore_ancestry,
- const svn_diff_tree_processor_t *diff_processor,
- svn_client_ctx_t *ctx,
- apr_pool_t *scratch_pool)
-{
- static const char PREFIX[] = "svn:shelf:";
- static const int PREFIX_LEN = 10;
- int i;
-
- if (! changelists)
- return SVN_NO_ERROR;
- for (i = 0; i < changelists->nelts; i++)
- {
- const char *cl = APR_ARRAY_IDX(changelists, i, const char *);
-
- if (strncmp(cl, PREFIX, PREFIX_LEN) == 0)
- {
- const char *shelf_name = cl + PREFIX_LEN;
-
- SVN_ERR(diff_shelf(shelf_name, target_abspath,
- depth, ignore_ancestry,
- diff_processor, ctx, scratch_pool));
- }
- }
-
- return SVN_NO_ERROR;
-}
-
-
-/* This is basically just the guts of svn_client_diff[_summarize][_peg]6(). */
-static svn_error_t *
-do_diff(svn_client__diff_driver_info_t *ddi,
- const char *path_or_url1,
- const char *path_or_url2,
- const svn_opt_revision_t *revision1,
- const svn_opt_revision_t *revision2,
- const svn_opt_revision_t *peg_revision,
- svn_boolean_t no_peg_revision,
- svn_depth_t depth,
- svn_boolean_t ignore_ancestry,
- const apr_array_header_t *changelists,
- svn_boolean_t text_deltas,
- const svn_diff_tree_processor_t *diff_processor,
- svn_client_ctx_t *ctx,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- svn_boolean_t is_repos1;
- svn_boolean_t is_repos2;
-
- /* Check if paths/revisions are urls/local. */
- SVN_ERR(check_paths(&is_repos1, &is_repos2, path_or_url1, path_or_url2,
- revision1, revision2, peg_revision));
-
- if (is_repos1)
- {
- if (is_repos2)
- {
- /* Ignores changelists. */
- SVN_ERR(diff_repos_repos(ddi,
- path_or_url1, path_or_url2,
- revision1, revision2,
- peg_revision, depth, ignore_ancestry,
- text_deltas,
- diff_processor, ctx,
- result_pool, scratch_pool));
- }
- else /* path_or_url2 is a working copy path */
- {
- SVN_ERR(diff_repos_wc(ddi,
- path_or_url1, revision1,
- no_peg_revision ? revision1
- : peg_revision,
- path_or_url2, revision2->kind,
- FALSE, depth,
- ignore_ancestry, changelists,
- diff_processor, ctx,
- result_pool, scratch_pool));
- }
- }
- else /* path_or_url1 is a working copy path */
- {
- if (is_repos2)
- {
- SVN_ERR(diff_repos_wc(ddi,
- path_or_url2, revision2,
- no_peg_revision ? revision2
- : peg_revision,
- path_or_url1,
- revision1->kind,
- TRUE, depth,
- ignore_ancestry, changelists,
- diff_processor, ctx,
- result_pool, scratch_pool));
- }
- else /* path_or_url2 is a working copy path */
- {
- if (revision1->kind == svn_opt_revision_working
- && revision2->kind == svn_opt_revision_working)
- {
- const char *abspath1;
- const char *abspath2;
-
- SVN_ERR(svn_dirent_get_absolute(&abspath1, path_or_url1,
- scratch_pool));
- SVN_ERR(svn_dirent_get_absolute(&abspath2, path_or_url2,
- scratch_pool));
-
- if (ddi)
- {
- svn_node_kind_t kind1, kind2;
-
- SVN_ERR(svn_io_check_resolved_path(abspath1, &kind1,
- scratch_pool));
- SVN_ERR(svn_io_check_resolved_path(abspath2, &kind2,
- scratch_pool));
- if (kind1 == svn_node_dir && kind2 == svn_node_dir)
- {
- ddi->anchor = "";
- }
- else
- {
- ddi->anchor = svn_dirent_basename(abspath1, NULL);
- }
- ddi->orig_path_1 = path_or_url1;
- ddi->orig_path_2 = path_or_url2;
- }
-
- /* Ignores changelists, ignore_ancestry */
- SVN_ERR(svn_client__arbitrary_nodes_diff(abspath1, abspath2,
- depth,
- diff_processor,
- ctx, scratch_pool));
- }
- else
- {
- if (ddi)
- {
- ddi->anchor = path_or_url1;
- ddi->orig_path_1 = path_or_url1;
- ddi->orig_path_2 = path_or_url2;
- }
-
- {
- const char *abspath1;
-
- SVN_ERR(svn_dirent_get_absolute(&abspath1, path_or_url1,
- scratch_pool));
- SVN_ERR(diff_shelves(changelists, abspath1,
- depth, ignore_ancestry,
- diff_processor, ctx, scratch_pool));
- }
- SVN_ERR(diff_wc_wc(path_or_url1, revision1,
- path_or_url2, revision2,
- depth, ignore_ancestry, changelists,
- diff_processor, ctx,
- result_pool, scratch_pool));
- }
- }
- }
-
- return SVN_NO_ERROR;
-}
-
/* Initialize DWI.diff_cmd and DWI.options,
* according to OPTIONS and CONFIG. CONFIG and OPTIONS may be null.
* Allocate the fields in RESULT_POOL, which should be at least as long-lived
@@ -2673,224 +1516,3 @@ svn_client__get_diff_writer_svn(
*ddi_p = &dwi->ddi;
return SVN_NO_ERROR;
}
-
-/*----------------------------------------------------------------------- */
-
-/*** Public Interfaces. ***/
-
-/* Display context diffs between two PATH/REVISION pairs. Each of
- these inputs will be one of the following:
-
- - a repository URL at a given revision.
- - a working copy path, ignoring local mods.
- - a working copy path, including local mods.
-
- We can establish a matrix that shows the nine possible types of
- diffs we expect to support.
-
-
- ` . DST || URL:rev | WC:base | WC:working |
- ` . || | | |
- SRC ` . || | | |
- ============++============+============+============+
- URL:rev || (*) | (*) | (*) |
- || | | |
- || | | |
- || | | |
- ------------++------------+------------+------------+
- WC:base || (*) | |
- || | New svn_wc_diff which |
- || | is smart enough to |
- || | handle two WC paths |
- ------------++------------+ and their related +
- WC:working || (*) | text-bases and working |
- || | files. This operation |
- || | is entirely local. |
- || | |
- ------------++------------+------------+------------+
- * These cases require server communication.
-*/
-svn_error_t *
-svn_client_diff7(const apr_array_header_t *options,
- const char *path_or_url1,
- const svn_opt_revision_t *revision1,
- const char *path_or_url2,
- const svn_opt_revision_t *revision2,
- const char *relative_to_dir,
- svn_depth_t depth,
- svn_boolean_t ignore_ancestry,
- svn_boolean_t no_diff_added,
- svn_boolean_t no_diff_deleted,
- svn_boolean_t show_copies_as_adds,
- svn_boolean_t ignore_content_type,
- svn_boolean_t ignore_properties,
- svn_boolean_t properties_only,
- svn_boolean_t use_git_diff_format,
- svn_boolean_t pretty_print_mergeinfo,
- const char *header_encoding,
- svn_stream_t *outstream,
- svn_stream_t *errstream,
- const apr_array_header_t *changelists,
- svn_client_ctx_t *ctx,
- apr_pool_t *pool)
-{
- svn_opt_revision_t peg_revision;
- svn_diff_tree_processor_t *diff_processor;
- svn_client__diff_driver_info_t *ddi;
-
- if (ignore_properties && properties_only)
- return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
- _("Cannot ignore properties and show only "
- "properties at the same time"));
-
- /* We will never do a pegged diff from here. */
- peg_revision.kind = svn_opt_revision_unspecified;
-
- /* --show-copies-as-adds and --git imply --notice-ancestry */
- if (show_copies_as_adds || use_git_diff_format)
- ignore_ancestry = FALSE;
-
- SVN_ERR(svn_client__get_diff_writer_svn(&diff_processor, &ddi,
- options,
- relative_to_dir,
- no_diff_added,
- no_diff_deleted,
- show_copies_as_adds,
- ignore_content_type,
- ignore_properties,
- properties_only,
- use_git_diff_format,
- pretty_print_mergeinfo,
- header_encoding,
- outstream, errstream,
- ctx, pool));
-
- return svn_error_trace(do_diff(ddi,
- path_or_url1, path_or_url2,
- revision1, revision2,
- &peg_revision, TRUE /* no_peg_revision */,
- depth, ignore_ancestry, changelists,
- TRUE /* text_deltas */,
- diff_processor, ctx, pool, pool));
-}
-
-svn_error_t *
-svn_client_diff_peg7(const apr_array_header_t *options,
- 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,
- const char *relative_to_dir,
- svn_depth_t depth,
- svn_boolean_t ignore_ancestry,
- svn_boolean_t no_diff_added,
- svn_boolean_t no_diff_deleted,
- svn_boolean_t show_copies_as_adds,
- svn_boolean_t ignore_content_type,
- svn_boolean_t ignore_properties,
- svn_boolean_t properties_only,
- svn_boolean_t use_git_diff_format,
- svn_boolean_t pretty_print_mergeinfo,
- const char *header_encoding,
- svn_stream_t *outstream,
- svn_stream_t *errstream,
- const apr_array_header_t *changelists,
- svn_client_ctx_t *ctx,
- apr_pool_t *pool)
-{
- svn_diff_tree_processor_t *diff_processor;
- svn_client__diff_driver_info_t *ddi;
-
- if (ignore_properties && properties_only)
- return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
- _("Cannot ignore properties and show only "
- "properties at the same time"));
-
- /* --show-copies-as-adds and --git imply --notice-ancestry */
- if (show_copies_as_adds || use_git_diff_format)
- ignore_ancestry = FALSE;
-
- SVN_ERR(svn_client__get_diff_writer_svn(&diff_processor, &ddi,
- options,
- relative_to_dir,
- no_diff_added,
- no_diff_deleted,
- show_copies_as_adds,
- ignore_content_type,
- ignore_properties,
- properties_only,
- use_git_diff_format,
- pretty_print_mergeinfo,
- header_encoding,
- outstream, errstream,
- ctx, pool));
-
- return svn_error_trace(do_diff(ddi,
- path_or_url, path_or_url,
- start_revision, end_revision,
- peg_revision, FALSE /* no_peg_revision */,
- depth, ignore_ancestry, changelists,
- TRUE /* text_deltas */,
- diff_processor, ctx, pool, pool));
-}
-
-svn_error_t *
-svn_client_diff_summarize2(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_client_diff_summarize_func_t summarize_func,
- void *summarize_baton,
- svn_client_ctx_t *ctx,
- apr_pool_t *pool)
-{
- svn_diff_tree_processor_t *diff_processor;
- svn_opt_revision_t peg_revision;
-
- /* We will never do a pegged diff from here. */
- peg_revision.kind = svn_opt_revision_unspecified;
-
- SVN_ERR(svn_client__get_diff_summarize_callbacks(&diff_processor,
- summarize_func, summarize_baton,
- pool, pool));
-
- return svn_error_trace(do_diff(NULL,
- path_or_url1, path_or_url2,
- revision1, revision2,
- &peg_revision, TRUE /* no_peg_revision */,
- depth, ignore_ancestry, changelists,
- FALSE /* text_deltas */,
- diff_processor, ctx, pool, pool));
-}
-
-svn_error_t *
-svn_client_diff_summarize_peg2(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,
- const apr_array_header_t *changelists,
- svn_client_diff_summarize_func_t summarize_func,
- void *summarize_baton,
- svn_client_ctx_t *ctx,
- apr_pool_t *pool)
-{
- svn_diff_tree_processor_t *diff_processor;
-
- SVN_ERR(svn_client__get_diff_summarize_callbacks(&diff_processor,
- summarize_func, summarize_baton,
- pool, pool));
-
- return svn_error_trace(do_diff(NULL,
- path_or_url, path_or_url,
- start_revision, end_revision,
- peg_revision, FALSE /* no_peg_revision */,
- depth, ignore_ancestry, changelists,
- FALSE /* text_deltas */,
- diff_processor, ctx, pool, pool));
-}
-