It doesn't on Ra local. Bert Huijben (Cell phone) From: Greg Stein Sent: zondag 24 april 2011 14:27 To: dev@subversion.apache.org Subject: Re: svn commit: r1096264 - in /subversion/trunk/subversion: include/svn_wc.h libsvn_client/diff.c libsvn_wc/deprecated.c libsvn_wc/diff.c This broke a ton of diff tests. Did you even run them before committing this?
Seriously, I'm really tired of all the buildbot breakage. On Apr 23, 2011 9:45 PM, <rhuij...@apache.org> wrote: > Author: rhuijben > Date: Sun Apr 24 01:44:57 2011 > New Revision: 1096264 > > URL: http://svn.apache.org/viewvc?rev=1096264&view=rev > Log: > Make the diff editor report changes relative from the anchor, instead of > relative from whatever is passed in to work more like the other editors. > (And reverse this behavior in the deprecated wrappers) > > * subversion/include/svn_wc.h > (svn_wc_get_diff_editor6): Update arguments. Takes an anchor_abspath now. > (svn_wc_diff6): Update arguments. Takes a target_abspath now. > > * subversion/libsvn_client/diff.c > (diff_cmd_baton): Store anchor. > (diff_props_changed): Update documentation. > (diff_dir_props_changed): New function, wrapping diff_dir_props_changed. > Calculate old style path. > (diff_file_changed, > diff_file_added, > diff_file_deleted_with_diff, > diff_file_deleted_no_diff, > diff_dir_added, > diff_dir_deleted, > diff_dir_opened, > diff_dir_closed): Calculate old style path. > (find_wc_root): Remove function. > (diff_wc_wc): Calculate anchor and store in baton. > (diff_repos_wc): Fetch wcroot directly and store anchor in baton. > > * subversion/libsvn_wc/deprecated.c > (diff_callbacks3_wrapper_baton): Add anchor. > (wrap_4to3_file_changed, > wrap_4to3_file_added, > wrap_4to3_file_deleted, > wrap_4to3_dir_added, > wrap_4to3_dir_deleted, > wrap_4to3_dir_props_changed, > wrap_4to3_dir_opened, > wrap_4to3_dir_closed): Join anchor before path. > (svn_wc_get_diff_editor5): Pass anchor_abspath and store anchor. > svn_wc_diff5): Pass target_abspath and store anchor. > > * subversion/libsvn_wc/diff.c > (edit_baton): Remove anchor. > (dir_baton): Update documentation of compared. > (file_baton): Remove wc_path. > (make_edit_baton): Update arguments. > (make_file_baton): Don't calculate wc_path. > (walk_local_nodes_diff): Simplify and path anchor calculations. > (report_wc_directory_as_added): Use relpath join. > (set_target_revision): Root path is "" now. > (delete_entry, > add_directory, > open_directory): Simplify path calculations. > (close_directory): Store path as key. > (add_file, > open_file): Simplify path calculations. > (close_edit): Use "" for anchor path. > (svn_wc_get_diff_editor6): Ensure anchor_abspath is absolute. > (svn_wc_diff6): Expect abspath > > Modified: > subversion/trunk/subversion/include/svn_wc.h > subversion/trunk/subversion/libsvn_client/diff.c > subversion/trunk/subversion/libsvn_wc/deprecated.c > subversion/trunk/subversion/libsvn_wc/diff.c > > Modified: subversion/trunk/subversion/include/svn_wc.h > URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_wc.h?rev=1096264&r1=1096263&r2=1096264&view=diff > ============================================================================== > --- subversion/trunk/subversion/include/svn_wc.h (original) > +++ subversion/trunk/subversion/include/svn_wc.h Sun Apr 24 01:44:57 2011 > @@ -5915,7 +5915,8 @@ svn_wc_canonicalize_svn_prop(const svn_s > * working copy (when @a use_text_base is #FALSE), or the current pristine > * information (when @a use_text_base is #TRUE) against the editor driver. > * > - * @a anchor_path/@a target represent the base of the hierarchy to be compared. > + * @a anchor_abspath/@a target represent the base of the hierarchy to be > + * compared. The diff callback paths will be relative to this path. > * > * @a callbacks/@a callback_baton is the callback table to use when two > * files are to be compared. > @@ -5958,7 +5959,7 @@ svn_error_t * > svn_wc_get_diff_editor6(const svn_delta_editor_t **editor, > void **edit_baton, > svn_wc_context_t *wc_ctx, > - const char *anchor_path, > + const char *anchor_abspath, > const char *target, > const svn_wc_diff_callbacks4_t *callbacks, > void *callback_baton, > @@ -6097,7 +6098,7 @@ svn_wc_get_diff_editor(svn_wc_adm_access > /** > * Compare working copy against the text-base. > * > - * @a target_path represents the base of the hierarchy to be compared. > + * @a target_abspath represents the base of the hierarchy to be compared. > * > * @a callbacks/@a callback_baton is the callback table to use when two > * files are to be compared. > @@ -6136,7 +6137,7 @@ svn_wc_get_diff_editor(svn_wc_adm_access > */ > svn_error_t * > svn_wc_diff6(svn_wc_context_t *wc_ctx, > - const char *target_path, > + const char *target_abspath, > const svn_wc_diff_callbacks4_t *callbacks, > void *callback_baton, > svn_depth_t depth, > > Modified: subversion/trunk/subversion/libsvn_client/diff.c > URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/diff.c?rev=1096264&r1=1096263&r2=1096264&view=diff > ============================================================================== > --- subversion/trunk/subversion/libsvn_client/diff.c (original) > +++ subversion/trunk/subversion/libsvn_client/diff.c Sun Apr 24 01:44:57 2011 > @@ -776,6 +776,9 @@ struct diff_cmd_baton { > * directory of the working copy involved in the diff. */ > const char *wc_root_abspath; > > + /* The anchor to prefix before wc paths */ > + const char *anchor; > + > /* A hashtable using the visited paths as keys. > * ### This is needed for us to know if we need to print a diff header for > * ### a path that has property changes. */ > @@ -783,8 +786,8 @@ struct diff_cmd_baton { > }; > > > -/* An svn_wc_diff_callbacks4_t function. Used for both file and directory > - property diffs. */ > +/* An helper for diff_dir_props_changed, diff_file_changed and diff_file_added > + */ > static svn_error_t * > diff_props_changed(const char *local_dir_abspath, > svn_wc_notify_state_t *state, > @@ -843,6 +846,31 @@ diff_props_changed(const char *local_dir > return SVN_NO_ERROR; > } > > +/* An svn_wc_diff_callbacks4_t function. */ > +static svn_error_t * > +diff_dir_props_changed(const char *local_dir_abspath, > + svn_wc_notify_state_t *state, > + svn_boolean_t *tree_conflicted, > + const char *path, > + const apr_array_header_t *propchanges, > + apr_hash_t *original_props, > + void *diff_baton, > + apr_pool_t *scratch_pool) > +{ > + struct diff_cmd_baton *diff_cmd_baton = diff_baton; > + > + if (diff_cmd_baton->anchor) > + path = svn_dirent_join(diff_cmd_baton->anchor, path, scratch_pool); > + > + return svn_error_return(diff_props_changed(local_dir_abspath, state, > + tree_conflicted, path, > + propchanges, > + original_props, > + diff_baton, > + scratch_pool)); > +} > + > + > /* Show differences between TMPFILE1 and TMPFILE2. PATH, REV1, and REV2 are > used in the headers to indicate the file and revisions. If either > MIMETYPE1 or MIMETYPE2 indicate binary content, don't show a diff, > @@ -1039,6 +1067,9 @@ diff_file_changed(const char *local_dir_ > void *diff_baton, > apr_pool_t *scratch_pool) > { > + struct diff_cmd_baton *diff_cmd_baton = diff_baton; > + if (diff_cmd_baton->anchor) > + path = svn_dirent_join(diff_cmd_baton->anchor, path, scratch_pool); > if (tmpfile1) > SVN_ERR(diff_content_changed(path, > tmpfile1, tmpfile2, rev1, rev2, > @@ -1083,6 +1114,9 @@ diff_file_added(const char *local_dir_ab > { > struct diff_cmd_baton *diff_cmd_baton = diff_baton; > > + if (diff_cmd_baton->anchor) > + path = svn_dirent_join(diff_cmd_baton->anchor, path, scratch_pool); > + > /* We want diff_file_changed to unconditionally show diffs, even if > the diff is empty (as would be the case if an empty file were > added.) It's important, because 'patch' would still see an empty > @@ -1133,6 +1167,9 @@ diff_file_deleted_with_diff(const char * > { > struct diff_cmd_baton *diff_cmd_baton = diff_baton; > > + if (diff_cmd_baton->anchor) > + path = svn_dirent_join(diff_cmd_baton->anchor, path, scratch_pool); > + > if (tmpfile1) > SVN_ERR(diff_content_changed(path, > tmpfile1, tmpfile2, diff_cmd_baton->revnum1, > @@ -1166,6 +1203,9 @@ diff_file_deleted_no_diff(const char *lo > { > struct diff_cmd_baton *diff_cmd_baton = diff_baton; > > + if (diff_cmd_baton->anchor) > + path = svn_dirent_join(diff_cmd_baton->anchor, path, scratch_pool); > + > if (state) > *state = svn_wc_notify_state_unknown; > if (tree_conflicted) > @@ -1190,6 +1230,9 @@ diff_dir_added(const char *local_dir_abs > void *diff_baton, > apr_pool_t *scratch_pool) > { > + struct diff_cmd_baton *diff_cmd_baton = diff_baton; > + if (diff_cmd_baton->anchor) > + path = svn_dirent_join(diff_cmd_baton->anchor, path, scratch_pool); > if (state) > *state = svn_wc_notify_state_unknown; > if (tree_conflicted) > @@ -1209,6 +1252,9 @@ diff_dir_deleted(const char *local_dir_a > void *diff_baton, > apr_pool_t *scratch_pool) > { > + struct diff_cmd_baton *diff_cmd_baton = diff_baton; > + if (diff_cmd_baton->anchor) > + path = svn_dirent_join(diff_cmd_baton->anchor, path, scratch_pool); > if (state) > *state = svn_wc_notify_state_unknown; > if (tree_conflicted) > @@ -1229,6 +1275,9 @@ diff_dir_opened(const char *local_dir_ab > void *diff_baton, > apr_pool_t *scratch_pool) > { > + struct diff_cmd_baton *diff_cmd_baton = diff_baton; > + if (diff_cmd_baton->anchor) > + path = svn_dirent_join(diff_cmd_baton->anchor, path, scratch_pool); > if (tree_conflicted) > *tree_conflicted = FALSE; > if (skip_children) > @@ -1249,6 +1298,9 @@ diff_dir_closed(const char *local_dir_ab > void *diff_baton, > apr_pool_t *scratch_pool) > { > + struct diff_cmd_baton *diff_cmd_baton = diff_baton; > + if (diff_cmd_baton->anchor) > + path = svn_dirent_join(diff_cmd_baton->anchor, path, scratch_pool); > if (contentstate) > *contentstate = svn_wc_notify_state_unknown; > if (propstate) > @@ -1322,49 +1374,6 @@ convert_to_url(const char **url, > return SVN_NO_ERROR; > } > > -/* Return the absolute path to the root of the working copy which > - * LOCAL_ABSPATH is located in, or NULL if LOCAL_ABSPATH is not within > - * a working copy. Use working copy context WC_CTX. > - * Allocate the result in RESULT_POOL. > - * Use SCRATCH_POOL for temporary allocations. */ > -static const char * > -find_wc_root(const char *local_abspath, svn_wc_context_t *wc_ctx, > - apr_pool_t *result_pool, apr_pool_t *scratch_pool) > -{ > - svn_boolean_t wc_root_found; > - apr_pool_t *iterpool; > - > - wc_root_found = FALSE; > - iterpool = svn_pool_create(scratch_pool); > - while (! wc_root_found && *local_abspath) > - { > - svn_error_t *err; > - > - svn_pool_clear(iterpool); > - > - err = svn_wc_is_wc_root2(&wc_root_found, wc_ctx, local_abspath, > - iterpool); > - if (err) > - { > - /* Ignore all errors. We don't care, because if all we get is > - * errors, the path is not in a working copy. */ > - svn_error_clear(err); > - } > - > - if (svn_dirent_is_root(local_abspath, strlen(local_abspath))) > - break; > - > - if (! wc_root_found) > - local_abspath = svn_dirent_dirname(local_abspath, scratch_pool); > - } > - svn_pool_destroy(iterpool); > - > - if (wc_root_found) > - return apr_pstrdup(result_pool, local_abspath); > - > - return NULL; > -} > - > /** Check if paths PATH1 and PATH2 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 non-local. > @@ -1604,6 +1613,7 @@ diff_wc_wc(const char *path1, > { > const char *abspath1; > svn_error_t *err; > + svn_node_kind_t kind; > > SVN_ERR_ASSERT(! svn_path_is_url(path1)); > SVN_ERR_ASSERT(! svn_path_is_url(path2)); > @@ -1640,8 +1650,15 @@ diff_wc_wc(const char *path1, > > callback_baton->revnum2 = SVN_INVALID_REVNUM; /* WC */ > > + SVN_ERR(svn_wc_read_kind(&kind, ctx->wc_ctx, abspath1, FALSE, pool)); > + > + if (kind != svn_node_dir) > + callback_baton->anchor = svn_dirent_dirname(path1, pool); > + else > + callback_baton->anchor = path1; > + > SVN_ERR(svn_wc_diff6(ctx->wc_ctx, > - path1, > + abspath1, > callbacks, callback_baton, > depth, > ignore_ancestry, show_copies_as_adds, > @@ -1843,12 +1860,16 @@ diff_repos_wc(const char *path1, > ctx, pool)); > callback_baton->ra_session = ra_session; > if (use_git_diff_format) > - callback_baton->wc_root_abspath = find_wc_root(anchor_abspath, ctx->wc_ctx, > - pool, pool); > + { > + SVN_ERR(svn_wc_get_wc_root(&callback_baton->wc_root_abspath, > + ctx->wc_ctx, anchor_abspath, > + pool, pool)); > + } > + callback_baton->anchor = anchor; > > SVN_ERR(svn_wc_get_diff_editor6(&diff_editor, &diff_edit_baton, > ctx->wc_ctx, > - anchor, > + anchor_abspath, > target, > callbacks, callback_baton, > depth, > @@ -2181,7 +2202,7 @@ svn_client_diff5(const apr_array_header_ > svn_client_ctx_t *ctx, > apr_pool_t *pool) > { > - struct diff_cmd_baton diff_cmd_baton; > + struct diff_cmd_baton diff_cmd_baton = { 0 }; > svn_wc_diff_callbacks4_t diff_callbacks; > > /* We will never do a pegged diff from here. */ > @@ -2195,7 +2216,7 @@ svn_client_diff5(const apr_array_header_ > diff_file_deleted_with_diff; > diff_callbacks.dir_added = diff_dir_added; > diff_callbacks.dir_deleted = diff_dir_deleted; > - diff_callbacks.dir_props_changed = diff_props_changed; > + diff_callbacks.dir_props_changed = diff_dir_props_changed; > diff_callbacks.dir_opened = diff_dir_opened; > diff_callbacks.dir_closed = diff_dir_closed; > > @@ -2219,6 +2240,7 @@ svn_client_diff5(const apr_array_header_ > diff_cmd_baton.visited_paths = apr_hash_make(pool); > diff_cmd_baton.ra_session = NULL; > diff_cmd_baton.wc_root_abspath = NULL; > + diff_cmd_baton.anchor = NULL; > > return do_diff(&diff_callbacks, &diff_cmd_baton, ctx, > path1, path2, revision1, revision2, &peg_revision, > @@ -2246,7 +2268,7 @@ svn_client_diff_peg5(const apr_array_hea > svn_client_ctx_t *ctx, > apr_pool_t *pool) > { > - struct diff_cmd_baton diff_cmd_baton; > + struct diff_cmd_baton diff_cmd_baton = { 0 }; > svn_wc_diff_callbacks4_t diff_callbacks; > > /* setup callback and baton */ > @@ -2256,7 +2278,7 @@ svn_client_diff_peg5(const apr_array_hea > diff_file_deleted_with_diff; > diff_callbacks.dir_added = diff_dir_added; > diff_callbacks.dir_deleted = diff_dir_deleted; > - diff_callbacks.dir_props_changed = diff_props_changed; > + diff_callbacks.dir_props_changed = diff_dir_props_changed; > diff_callbacks.dir_opened = diff_dir_opened; > diff_callbacks.dir_closed = diff_dir_closed; > > @@ -2280,6 +2302,7 @@ svn_client_diff_peg5(const apr_array_hea > diff_cmd_baton.visited_paths = apr_hash_make(pool); > diff_cmd_baton.ra_session = NULL; > diff_cmd_baton.wc_root_abspath = NULL; > + diff_cmd_baton.anchor = NULL; > > return do_diff(&diff_callbacks, &diff_cmd_baton, ctx, > path, path, start_revision, end_revision, peg_revision, > > Modified: subversion/trunk/subversion/libsvn_wc/deprecated.c > URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/deprecated.c?rev=1096264&r1=1096263&r2=1096264&view=diff > ============================================================================== > --- subversion/trunk/subversion/libsvn_wc/deprecated.c (original) > +++ subversion/trunk/subversion/libsvn_wc/deprecated.c Sun Apr 24 01:44:57 2011 > @@ -1575,6 +1575,7 @@ struct diff_callbacks3_wrapper_baton { > const svn_wc_diff_callbacks3_t *callbacks3; > svn_wc__db_t *db; > void *baton; > + const char *anchor; > }; > > /* An svn_wc_diff_callbacks4_t function for wrapping > @@ -1604,7 +1605,10 @@ wrap_4to3_file_changed(const char *local > scratch_pool); > > return b->callbacks3->file_changed(adm_access, contentstate, propstate, > - tree_conflicted, path, tmpfile1, tmpfile2, > + tree_conflicted, > + svn_dirent_join(b->anchor, path, > + scratch_pool), > + tmpfile1, tmpfile2, > rev1, rev2, mimetype1, mimetype2, > propchanges, originalprops, b->baton); > } > @@ -1638,7 +1642,10 @@ wrap_4to3_file_added(const char *local_d > scratch_pool); > > return b->callbacks3->file_added(adm_access, contentstate, propstate, > - tree_conflicted, path, tmpfile1, tmpfile2, > + tree_conflicted, > + svn_dirent_join(b->anchor, path, > + scratch_pool), > + tmpfile1, tmpfile2, > rev1, rev2, mimetype1, mimetype2, > propchanges, originalprops, b->baton); > } > @@ -1666,7 +1673,9 @@ wrap_4to3_file_deleted(const char *local > scratch_pool); > > return b->callbacks3->file_deleted(adm_access, state, tree_conflicted, > - path, tmpfile1, tmpfile2, > + svn_dirent_join(b->anchor, path, > + scratch_pool), > + tmpfile1, tmpfile2, > mimetype1, mimetype2, originalprops, > b->baton); > } > @@ -1691,7 +1700,10 @@ wrap_4to3_dir_added(const char *local_di > adm_access = svn_wc__adm_retrieve_internal2(b->db, local_dir_abspath, > scratch_pool); > > - return b->callbacks3->dir_added(adm_access, state, tree_conflicted, path, rev, b->baton); > + return b->callbacks3->dir_added(adm_access, state, tree_conflicted, > + svn_dirent_join(b->anchor, path, > + scratch_pool), > + rev, b->baton); > } > > /* An svn_wc_diff_callbacks4_t function for wrapping > @@ -1712,7 +1724,9 @@ wrap_4to3_dir_deleted(const char *local_ > scratch_pool); > > return b->callbacks3->dir_deleted(adm_access, state, tree_conflicted, > - path, b->baton); > + svn_dirent_join(b->anchor, path, > + scratch_pool), > + b->baton); > } > > /* An svn_wc_diff_callbacks4_t function for wrapping > @@ -1735,7 +1749,9 @@ wrap_4to3_dir_props_changed(const char * > scratch_pool); > > return b->callbacks3->dir_props_changed(adm_access, propstate, > - tree_conflicted, path, > + tree_conflicted, > + svn_dirent_join(b->anchor, path, > + scratch_pool), > propchanges, original_props, > b->baton); > } > @@ -1760,8 +1776,10 @@ wrap_4to3_dir_opened(const char *local_d > if (skip_children) > *skip_children = FALSE; > > - return b->callbacks3->dir_opened(adm_access, tree_conflicted, path, rev, > - b->baton); > + return b->callbacks3->dir_opened(adm_access, tree_conflicted, > + svn_dirent_join(b->anchor, path, > + scratch_pool), > + rev, b->baton); > } > > /* An svn_wc_diff_callbacks4_t function for wrapping > @@ -1783,7 +1801,10 @@ wrap_4to3_dir_closed(const char *local_d > scratch_pool); > > return b->callbacks3->dir_closed(adm_access, contentstate, propstate, > - tree_conflicted, path, b->baton); > + tree_conflicted, > + svn_dirent_join(b->anchor, path, > + scratch_pool), > + b->baton); > } > > > @@ -1824,11 +1845,12 @@ svn_wc_get_diff_editor5(svn_wc_adm_acces > b->callbacks3 = callbacks; > b->baton = callback_baton; > b->db = db; > + b->anchor = svn_wc_adm_access_path(anchor); > > SVN_ERR(svn_wc_get_diff_editor6(editor, > edit_baton, > wc_ctx, > - svn_wc_adm_access_path(anchor), > + svn_wc__adm_access_abspath(anchor), > target, > &diff_callbacks3_wrapper, > b, > @@ -1978,9 +2000,10 @@ svn_wc_diff5(svn_wc_adm_access_t *anchor > > b->callbacks3 = callbacks; > b->baton = callback_baton; > + b->anchor = svn_wc_adm_access_path(anchor); > > SVN_ERR(svn_wc_diff6(wc_ctx, > - svn_dirent_join(svn_wc_adm_access_path(anchor), > + svn_dirent_join(svn_wc__adm_access_abspath(anchor), > target, pool), > &diff_callbacks3_wrapper, > b, > > Modified: subversion/trunk/subversion/libsvn_wc/diff.c > URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/diff.c?rev=1096264&r1=1096263&r2=1096264&view=diff > ============================================================================== > --- subversion/trunk/subversion/libsvn_wc/diff.c (original) > +++ subversion/trunk/subversion/libsvn_wc/diff.c Sun Apr 24 01:44:57 2011 > @@ -199,7 +199,6 @@ struct edit_baton { > svn_wc__db_t *db; > > /* ANCHOR/TARGET represent the base of the hierarchy to be compared. */ > - const char *anchor_path; > const char *target; > > /* The absolute path of the anchor directory */ > @@ -274,7 +273,7 @@ struct dir_baton { > itself). > > If the directory's properties have been compared, an item with hash > - key of "" (an empty string) will be present in the hash. */ > + key of path will be present in the hash. */ > apr_hash_t *compared; > > /* The baton for the parent directory, or null if this is the root of the > @@ -302,11 +301,8 @@ struct file_baton { > const char *local_abspath; > > /* PATH is the "correct" path of the file, but it may not exist in the > - working copy. WC_PATH is a path we can use to make temporary files > - or open empty files; it doesn't necessarily exist either, but the > - directory part of it does. */ > + working copy */ > const char *path; > - const char *wc_path; > > /* When constructing the requested repository version of the file, we > drop the result into a file at TEMP_FILE_PATH. */ > @@ -346,7 +342,7 @@ struct file_baton { > static svn_error_t * > make_edit_baton(struct edit_baton **edit_baton, > svn_wc__db_t *db, > - const char *anchor_path, > + const char *anchor_abspath, > const char *target, > const svn_wc_diff_callbacks4_t *callbacks, > void *callback_baton, > @@ -364,13 +360,14 @@ make_edit_baton(struct edit_baton **edit > apr_hash_t *changelist_hash = NULL; > struct edit_baton *eb; > > + SVN_ERR_ASSERT(svn_dirent_is_absolute(anchor_abspath)); > + > if (changelists && changelists->nelts) > SVN_ERR(svn_hash_from_cstring_keys(&changelist_hash, changelists, pool)); > > eb = apr_pcalloc(pool, sizeof(*eb)); > eb->db = db; > - eb->anchor_path = anchor_path; > - SVN_ERR(svn_dirent_get_absolute(&eb->anchor_abspath, eb->anchor_path, pool)); > + eb->anchor_abspath = apr_pstrdup(pool, anchor_abspath); > eb->target = apr_pstrdup(pool, target); > eb->callbacks = callbacks; > eb->callback_baton = callback_baton; > @@ -452,29 +449,6 @@ make_file_baton(const char *path, > fb->local_abspath = svn_dirent_join(parent_baton->local_abspath, fb->name, > pool); > > - /* If the parent directory is added rather than replaced it does not > - exist in the working copy. Determine a working copy path whose > - directory part does exist; we can use that to create temporary > - files. It doesn't matter whether the file part exists in the > - directory. */ > - if (parent_baton->added) > - { > - struct dir_baton *wc_dir_baton = parent_baton; > - > - /* Ascend until a directory is not being added, this will be a > - directory that does exist. This must terminate since the root of > - the comparison cannot be added. */ > - while (wc_dir_baton->added) > - wc_dir_baton = wc_dir_baton->parent_baton; > - > - fb->wc_path = svn_dirent_join(wc_dir_baton->path, "unimportant", > - fb->pool); > - } > - else > - { > - fb->wc_path = fb->path; > - } > - > return fb; > } > > @@ -825,9 +799,7 @@ walk_local_nodes_diff(struct edit_baton > to the target. When the target is a file, the anchor is the parent > directory and if this is that directory the non-target entries must be > skipped. */ > - in_anchor_not_target = > - (*eb->target > - && (! svn_path_compare_paths(path, eb->anchor_path))); > + in_anchor_not_target = ((*path == '\0') && (*eb->target != '\0')); > > /* Check for local property mods on this directory, if we haven't > already reported them and we aren't changelist-filted. > @@ -837,7 +809,7 @@ walk_local_nodes_diff(struct edit_baton > if (svn_wc__internal_changelist_match(db, local_abspath, > eb->changelist_hash, scratch_pool) > && (! in_anchor_not_target) > - && (!compared || ! apr_hash_get(compared, "", 0))) > + && (!compared || ! apr_hash_get(compared, path, 0))) > { > svn_boolean_t modified; > > @@ -888,7 +860,6 @@ walk_local_nodes_diff(struct edit_baton > if (in_anchor_not_target && strcmp(eb->target, name)) > continue; > > - > child_abspath = svn_dirent_join(local_abspath, name, iterpool); > > SVN_ERR(svn_wc__db_read_info(&status, &kind, NULL, NULL, NULL, NULL, > @@ -903,7 +874,7 @@ walk_local_nodes_diff(struct edit_baton > || status == svn_wc__db_status_absent) > continue; > > - child_path = svn_dirent_join(path, name, iterpool); > + child_path = svn_relpath_join(path, name, iterpool); > > /* Skip this node if it is in the list of nodes already diff'd. */ > if (compared && apr_hash_get(compared, child_path, APR_HASH_KEY_STRING)) > @@ -1145,7 +1116,7 @@ report_wc_directory_as_added(struct edit > if (!eb->use_text_base && status == svn_wc__db_status_deleted) > continue; > > - child_path = svn_dirent_join(path, name, iterpool); > + child_path = svn_relpath_join(path, name, iterpool); > > switch (kind) > { > @@ -1205,7 +1176,7 @@ open_root(void *edit_baton, > struct dir_baton *db; > > eb->root_opened = TRUE; > - db = make_dir_baton(eb->anchor_path, NULL, eb, FALSE, eb->depth, dir_pool); > + db = make_dir_baton("", NULL, eb, FALSE, eb->depth, dir_pool); > *root_baton = db; > > return SVN_NO_ERROR; > @@ -1222,15 +1193,14 @@ delete_entry(const char *path, > struct edit_baton *eb = pb->eb; > svn_wc__db_t *db = eb->db; > const char *empty_file; > - const char *full_path = svn_dirent_join(eb->anchor_path, path, > - pb->pool); > - const char *name = svn_dirent_basename(path, pool); > + const char *name = svn_dirent_basename(path, NULL); > const char *local_abspath = svn_dirent_join(pb->local_abspath, name, pool); > svn_wc__db_status_t status; > svn_wc__db_kind_t kind; > > /* Mark this node as compared in the parent directory's baton. */ > - apr_hash_set(pb->compared, full_path, APR_HASH_KEY_STRING, ""); > + apr_hash_set(pb->compared, apr_pstrdup(pb->pool, path), > + APR_HASH_KEY_STRING, ""); > > SVN_ERR(svn_wc__db_read_info(&status, &kind, NULL, NULL, NULL, NULL, > NULL, NULL, NULL, NULL, NULL, NULL, NULL, > @@ -1269,7 +1239,7 @@ delete_entry(const char *path, > pool, pool)); > base_mimetype = get_prop_mimetype(baseprops); > > - SVN_ERR(eb->callbacks->file_deleted(NULL, NULL, NULL, full_path, > + SVN_ERR(eb->callbacks->file_deleted(NULL, NULL, NULL, path, > textbase, > empty_file, > base_mimetype, > @@ -1281,7 +1251,7 @@ delete_entry(const char *path, > else > { > /* Or normally, show the working file being added. */ > - SVN_ERR(report_wc_file_as_added(eb, local_abspath, full_path, pool)); > + SVN_ERR(report_wc_file_as_added(eb, local_abspath, path, pool)); > } > break; > case svn_wc__db_kind_dir: > @@ -1289,7 +1259,7 @@ delete_entry(const char *path, > revision, so diff should show this as an add. */ > SVN_ERR(report_wc_directory_as_added(eb, > local_abspath, > - full_path, > + path, > svn_depth_infinity, > pool)); > > @@ -1311,14 +1281,12 @@ add_directory(const char *path, > { > struct dir_baton *pb = parent_baton; > struct dir_baton *db; > - const char *full_path; > svn_depth_t subdir_depth = (pb->depth == svn_depth_immediates) > ? svn_depth_empty : pb->depth; > > /* ### TODO: support copyfrom? */ > > - full_path = svn_dirent_join(pb->eb->anchor_path, path, dir_pool); > - db = make_dir_baton(full_path, pb, pb->eb, TRUE, subdir_depth, > + db = make_dir_baton(path, pb, pb->eb, TRUE, subdir_depth, > dir_pool); > *child_baton = db; > > @@ -1335,14 +1303,12 @@ open_directory(const char *path, > { > struct dir_baton *pb = parent_baton; > struct dir_baton *db; > - const char *full_path; > svn_depth_t subdir_depth = (pb->depth == svn_depth_immediates) > ? svn_depth_empty : pb->depth; > > /* Allocate path from the parent pool since the memory is used in the > parent's compared hash */ > - full_path = svn_dirent_join(pb->eb->anchor_path, path, pb->pool); > - db = make_dir_baton(full_path, pb, pb->eb, FALSE, subdir_depth, dir_pool); > + db = make_dir_baton(path, pb, pb->eb, FALSE, subdir_depth, dir_pool); > *child_baton = db; > > return SVN_NO_ERROR; > @@ -1415,7 +1381,7 @@ close_directory(void *dir_baton, > /* Mark the properties of this directory as having already been > compared so that we know not to show any local modifications > later on. */ > - apr_hash_set(db->compared, "", 0, ""); > + apr_hash_set(db->compared, db->path, 0, ""); > } > > /* Report local modifications for this directory. Skip added > @@ -1432,7 +1398,8 @@ close_directory(void *dir_baton, > /* Mark this directory as compared in the parent directory's baton, > unless this is the root of the comparison. */ > if (pb) > - apr_hash_set(pb->compared, db->path, APR_HASH_KEY_STRING, ""); > + apr_hash_set(pb->compared, apr_pstrdup(pb->pool, db->path), > + APR_HASH_KEY_STRING, ""); > > return SVN_NO_ERROR; > } > @@ -1448,17 +1415,15 @@ add_file(const char *path, > { > struct dir_baton *pb = parent_baton; > struct file_baton *fb; > - const char *full_path; > > /* ### TODO: support copyfrom? */ > > - full_path = svn_dirent_join(pb->eb->anchor_path, path, file_pool); > - fb = make_file_baton(full_path, TRUE, pb, file_pool); > + fb = make_file_baton(path, TRUE, pb, file_pool); > *file_baton = fb; > > /* Add this filename to the parent directory's list of elements that > have been compared. */ > - apr_hash_set(pb->compared, apr_pstrdup(pb->pool, full_path), > + apr_hash_set(pb->compared, apr_pstrdup(pb->pool, path), > APR_HASH_KEY_STRING, ""); > > return SVN_NO_ERROR; > @@ -1475,15 +1440,13 @@ open_file(const char *path, > struct dir_baton *pb = parent_baton; > struct edit_baton *eb = pb->eb; > struct file_baton *fb; > - const char *full_path; > > - full_path = svn_dirent_join(pb->eb->anchor_path, path, file_pool); > - fb = make_file_baton(full_path, FALSE, pb, file_pool); > + fb = make_file_baton(path, FALSE, pb, file_pool); > *file_baton = fb; > > /* Add this filename to the parent directory's list of elements that > have been compared. */ > - apr_hash_set(pb->compared, apr_pstrdup(pb->pool, full_path), > + apr_hash_set(pb->compared, apr_pstrdup(pb->pool, path), > APR_HASH_KEY_STRING, ""); > > SVN_ERR(svn_wc__db_base_get_info(NULL, NULL, NULL, NULL, NULL, NULL, NULL, > @@ -1871,7 +1834,7 @@ close_edit(void *edit_baton, > { > SVN_ERR(walk_local_nodes_diff(eb, > eb->anchor_abspath, > - eb->anchor_path, > + "", > eb->depth, > NULL, > eb->pool)); > @@ -1888,7 +1851,7 @@ svn_error_t * > svn_wc_get_diff_editor6(const svn_delta_editor_t **editor, > void **edit_baton, > svn_wc_context_t *wc_ctx, > - const char *anchor_path, > + const char *anchor_abspath, > const char *target, > const svn_wc_diff_callbacks4_t *callbacks, > void *callback_baton, > @@ -1908,11 +1871,12 @@ svn_wc_get_diff_editor6(const svn_delta_ > void *inner_baton; > svn_delta_editor_t *tree_editor; > const svn_delta_editor_t *inner_editor; > - const char *anchor_abspath; > + > + SVN_ERR_ASSERT(svn_dirent_is_absolute(anchor_abspath)); > > SVN_ERR(make_edit_baton(&eb, > wc_ctx->db, > - anchor_path, target, > + anchor_abspath, target, > callbacks, callback_baton, > depth, ignore_ancestry, show_copies_as_adds, > use_git_diff_format, > @@ -1939,8 +1903,6 @@ svn_wc_get_diff_editor6(const svn_delta_ > inner_editor = tree_editor; > inner_baton = eb; > > - SVN_ERR(svn_dirent_get_absolute(&anchor_abspath, anchor_path, result_pool)); > - > if (depth == svn_depth_unknown) > SVN_ERR(svn_wc__ambient_depth_filter_editor(&inner_editor, > &inner_baton, > @@ -1965,7 +1927,7 @@ svn_wc_get_diff_editor6(const svn_delta_ > /* Compare working copy against the text-base. */ > svn_error_t * > svn_wc_diff6(svn_wc_context_t *wc_ctx, > - const char *target_path, > + const char *target_abspath, > const svn_wc_diff_callbacks4_t *callbacks, > void *callback_baton, > svn_depth_t depth, > @@ -1979,25 +1941,24 @@ svn_wc_diff6(svn_wc_context_t *wc_ctx, > { > struct edit_baton *eb; > const char *target; > - const char *target_abspath; > - const char *anchor_path; > + const char *anchor_abspath; > svn_wc__db_kind_t kind; > > - SVN_ERR(svn_dirent_get_absolute(&target_abspath, target_path, pool)); > + SVN_ERR_ASSERT(svn_dirent_is_absolute(target_abspath)); > SVN_ERR(svn_wc__db_read_kind(&kind, wc_ctx->db, target_abspath, FALSE, > pool)); > > if (kind == svn_wc__db_kind_dir) > { > - anchor_path = target_path; > + anchor_abspath = target_abspath; > target = ""; > } > else > - svn_dirent_split(&anchor_path, &target, target_path, pool); > + svn_dirent_split(&anchor_abspath, &target, target_abspath, pool); > > SVN_ERR(make_edit_baton(&eb, > wc_ctx->db, > - anchor_path, > + anchor_abspath, > target, > callbacks, callback_baton, > depth, ignore_ancestry, show_copies_as_adds, > @@ -2008,7 +1969,7 @@ svn_wc_diff6(svn_wc_context_t *wc_ctx, > > SVN_ERR(walk_local_nodes_diff(eb, > eb->anchor_abspath, > - eb->anchor_path, > + "", > depth, > NULL, > eb->pool)); > >