On Tue, Apr 26, 2011 at 5:38 PM, <rhuijben_at_apache.org> wrote:
> Author: rhuijben
> Date: Tue Apr 26 21:38:34 2011
> New Revision: 1096921
>
> URL: http://svn.apache.org/viewvc?rev=1096921&view=rev
> Log:
> Remove the last bit of working copy obstruction detection from the repository
> diff editor.
>
> This patch makes the merge editor aware of the list of added directories to
> allow dry run property merges to directories.
>
> * subversion/libsvn_client/merge.c
> Â (merge_cmd_baton_t): Add hashtable of merge added paths.
> Â (dry_run_added_p): New function.
> Â (perform_obstruction_check): Specialize handling of merge-added paths.
> Â (merge_dir_props_changed): Don't perform actual prop merging for added
> Â Â directories when doing a dry-run merge.
> Â (merge_file_added,
> Â merge_dir_added,
> Â merge_dir_deleted,
> Â merge_dir_closed): Don't set optional output arguments to their default.
>
> * subversion/libsvn_client/repos_diff.c
> Â (close_directory): When an obstruction is noticed, update the content state
> Â Â and use updated notifications.
>
> * subversion/tests/cmdline/merge_tree_conflict_tests.py
> Â (tree_conflicts_merge_edit_onto_missing,
> Â tree_conflicts_merge_del_onto_missing): Expect more skip notifications.
>
> * subversion/tests/cmdline/tree_conflict_tests.py
> Â (at_directory_external): Mark as XFail again. This change moves the failure
> Â Â to where we step into the external for the first time. The merge code
> Â Â detects this properly now, but wants to apply mergeinfo on the external
> Â Â to notice that it wasn't merged. But it can't and shouldn't store this
> Â Â information.
>
> Modified:
> Â Â subversion/trunk/subversion/libsvn_client/merge.c
> Â Â subversion/trunk/subversion/libsvn_client/repos_diff.c
> Â Â subversion/trunk/subversion/tests/cmdline/merge_tree_conflict_tests.py
> Â Â subversion/trunk/subversion/tests/cmdline/tree_conflict_tests.py
>
> Modified: subversion/trunk/subversion/libsvn_client/merge.c
> URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/merge.c?rev=1096921&r1=1096920&r2=1096921&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/libsvn_client/merge.c (original)
> +++ subversion/trunk/subversion/libsvn_client/merge.c Tue Apr 26 21:38:34 2011
> @@ -276,6 +276,10 @@ typedef struct merge_cmd_baton_t {
> Â Â Â dry_run mode. */
> Â apr_hash_t *dry_run_deletions;
>
> + Â /* The list of paths for entries we've added, used only when in
> + Â Â dry_run mode. */
> + Â apr_hash_t *dry_run_added;
> +
> Â /* The list of any paths which remained in conflict after a
> Â Â Â resolution attempt was made. Â We track this in-memory, rather
> Â Â Â than just using WC entry state, since the latter doesn't help us
> @@ -353,6 +357,20 @@ dry_run_deleted_p(const merge_cmd_baton_
> Â Â Â Â Â Â Â Â Â Â Â Â APR_HASH_KEY_STRING) != NULL);
> Â }
>
> +/* Return true iff we're in dry-run mode and WCPATH would have been
> + Â added by now if we weren't in dry-run mode.
> + Â Used to avoid spurious notifications (e.g. conflicts) from a merge
> + Â attempt into an existing target which would have been deleted if we
> + Â weren't in dry_run mode (issue #2584). Â Assumes that WCPATH is
> + Â still versioned (e.g. has an associated entry). */
> +static APR_INLINE svn_boolean_t
> +dry_run_added_p(const merge_cmd_baton_t *merge_b, const char *wcpath)
> +{
> + Â return (merge_b->dry_run &&
> + Â Â Â Â Â apr_hash_get(merge_b->dry_run_added, wcpath,
> + Â Â Â Â Â Â Â Â Â Â Â APR_HASH_KEY_STRING) != NULL);
> +}
> +
> Â /* Return whether any WC path was put in conflict by the merge
> Â Â operation corresponding to MERGE_B. */
> Â static APR_INLINE svn_boolean_t
> @@ -408,20 +426,36 @@ perform_obstruction_check(svn_wc_notify_
> Â Â *kind = svn_node_none;
>
> Â /* In a dry run, make as if nodes "deleted" by the dry run appear so. */
> - Â if (merge_b->dry_run && dry_run_deleted_p(merge_b, local_abspath))
> + Â if (merge_b->dry_run)
> Â Â {
> - Â Â Â *obstruction_state = svn_wc_notify_state_inapplicable;
> + Â Â Â if (dry_run_deleted_p(merge_b, local_abspath))
> + Â Â Â Â {
> + Â Â Â Â Â *obstruction_state = svn_wc_notify_state_inapplicable;
> +
> + Â Â Â Â Â if (versioned)
> + Â Â Â Â Â Â *versioned = TRUE;
> + Â Â Â Â Â if (deleted)
> + Â Â Â Â Â Â *deleted = TRUE;
> +
> + Â Â Â Â Â if (expected_kind != svn_node_unknown
> + Â Â Â Â Â Â Â && expected_kind != svn_node_none)
> + Â Â Â Â Â Â *obstruction_state = svn_wc_notify_state_obstructed;
> + Â Â Â Â Â return SVN_NO_ERROR;
> + Â Â Â Â }
> + Â Â Â else if (dry_run_added_p(merge_b, local_abspath))
> + Â Â Â Â {
> + Â Â Â Â Â *obstruction_state = svn_wc_notify_state_inapplicable;
>
> - Â Â Â if (versioned)
> - Â Â Â Â *versioned = TRUE;
> - Â Â Â if (deleted)
> - Â Â Â Â *deleted = TRUE;
> -
> - Â Â Â if (expected_kind != svn_node_unknown
> - Â Â Â Â Â && expected_kind != svn_node_none)
> - Â Â Â Â *obstruction_state = svn_wc_notify_state_obstructed;
> - Â Â Â return SVN_NO_ERROR;
> - Â Â }
> + Â Â Â Â Â if (versioned)
> + Â Â Â Â Â Â *versioned = TRUE;
> + Â Â Â Â Â if (added)
> + Â Â Â Â Â Â *added = TRUE;
> + Â Â Â Â Â if (kind)
> + Â Â Â Â Â Â *kind = svn_node_dir; /* Currently only used for dirs */
> +
> + Â Â Â Â Â return SVN_NO_ERROR;
> + Â Â Â Â }
> + Â Â }
>
> Â if (kind == NULL)
> Â Â kind = &wc_kind;
> @@ -1224,6 +1258,13 @@ merge_dir_props_changed(svn_wc_notify_st
> Â Â Â return SVN_NO_ERROR;
> Â Â }
>
> + Â if (dir_was_added
> + Â Â Â && merge_b->dry_run
> + Â Â Â && dry_run_added_p(merge_b, local_abspath))
> + Â Â {
> + Â Â Â return SVN_NO_ERROR; /* We can't do a real prop merge for added dirs */
> + Â Â }
> +
> Â return svn_error_return(merge_props_changed(state,
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â tree_conflicted,
> Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â local_abspath,
> @@ -1544,8 +1585,6 @@ merge_file_added(svn_wc_notify_state_t *
> Â Â Â Â *content_state = svn_wc_notify_state_unchanged;
> Â Â Â if (prop_state)
> Â Â Â Â *prop_state = svn_wc_notify_state_unchanged;
> - Â Â Â if (tree_conflicted)
> - Â Â Â Â *tree_conflicted = FALSE;
> Â Â Â return SVN_NO_ERROR;
> Â Â }
>
> @@ -1555,9 +1594,6 @@ merge_file_added(svn_wc_notify_state_t *
> Â if (prop_state)
> Â Â *prop_state = svn_wc_notify_state_unknown;
>
> - Â if (tree_conflicted)
> - Â Â *tree_conflicted = FALSE;
> -
> Â /* Apply the prop changes to a new hash table. */
> Â file_props = apr_hash_copy(subpool, original_props);
> Â for (i = 0; i < prop_changes->nelts; ++i)
> @@ -1996,8 +2032,6 @@ merge_dir_added(svn_wc_notify_state_t *s
> Â Â Â svn_pool_destroy(subpool);
> Â Â Â if (state)
> Â Â Â Â *state = svn_wc_notify_state_unchanged;
> - Â Â Â if (tree_conflicted)
> - Â Â Â Â *tree_conflicted = FALSE;
> Â Â Â return SVN_NO_ERROR;
> Â Â }
>
> @@ -2069,7 +2103,11 @@ merge_dir_added(svn_wc_notify_state_t *s
> Â Â case svn_node_none:
> Â Â Â /* Unversioned or schedule-delete */
> Â Â Â if (merge_b->dry_run)
> - Â Â Â Â merge_b->added_path = apr_pstrdup(merge_b->pool, local_abspath);
> + Â Â Â Â {
> + Â Â Â Â Â merge_b->added_path = apr_pstrdup(merge_b->pool, local_abspath);
> + Â Â Â Â Â apr_hash_set(merge_b->dry_run_added, merge_b->added_path,
> + Â Â Â Â Â Â Â Â Â Â Â APR_HASH_KEY_STRING, merge_b->added_path);
> + Â Â Â Â }
> Â Â Â else
> Â Â Â Â {
> Â Â Â Â Â SVN_ERR(svn_io_dir_make(local_abspath, APR_OS_DEFAULT, subpool));
> @@ -2183,12 +2221,8 @@ merge_dir_deleted(svn_wc_notify_state_t
> Â Â Â svn_pool_destroy(subpool);
> Â Â Â if (state)
> Â Â Â Â *state = svn_wc_notify_state_unchanged;
> - Â Â Â if (tree_conflicted)
> - Â Â Â Â *tree_conflicted = FALSE;
> Â Â Â return SVN_NO_ERROR;
> Â Â }
> - Â if (tree_conflicted)
> - Â Â *tree_conflicted = FALSE;
>
> Â /* Check for an obstructed or missing node on disk. */
> Â {
> @@ -2434,12 +2468,6 @@ merge_dir_closed(svn_wc_notify_state_t *
> Â Â Â Â Â Â Â Â Â apr_pool_t *scratch_pool)
> Â {
> Â merge_cmd_baton_t *merge_b = baton;
> - Â if (contentstate)
> - Â Â *contentstate = svn_wc_notify_state_unknown;
> - Â if (propstate)
> - Â Â *propstate = svn_wc_notify_state_unknown;
> - Â if (tree_conflicted)
> - Â Â *tree_conflicted = FALSE;
>
> Â if (merge_b->dry_run)
> Â Â svn_hash__clear(merge_b->dry_run_deletions, scratch_pool);
> @@ -8654,6 +8682,8 @@ do_merge(apr_hash_t **modified_subtrees,
> Â Â Â merge_cmd_baton.add_necessitated_merge = FALSE;
> Â Â Â merge_cmd_baton.dry_run_deletions =
> Â Â Â Â dry_run ? apr_hash_make(subpool) : NULL;
> + Â Â Â merge_cmd_baton.dry_run_added =
> + Â Â Â Â dry_run ? apr_hash_make(subpool) : NULL;
> Â Â Â merge_cmd_baton.conflicted_paths = NULL;
> Â Â Â merge_cmd_baton.paths_with_new_mergeinfo = NULL;
> Â Â Â merge_cmd_baton.paths_with_deleted_mergeinfo = NULL;
>
> Modified: subversion/trunk/subversion/libsvn_client/repos_diff.c
> URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/repos_diff.c?rev=1096921&r1=1096920&r2=1096921&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/libsvn_client/repos_diff.c (original)
> +++ subversion/trunk/subversion/libsvn_client/repos_diff.c Tue Apr 26 21:38:34 2011
> @@ -983,40 +983,12 @@ close_directory(void *dir_baton,
> Â struct edit_baton *eb = b->edit_baton;
> Â svn_wc_notify_state_t content_state = svn_wc_notify_state_unknown;
> Â svn_wc_notify_state_t prop_state = svn_wc_notify_state_unknown;
> - Â svn_node_kind_t kind;
> - Â const char *local_dir_abspath;
> + Â svn_boolean_t skipped = FALSE;
>
> Â /* Skip *everything* within a newly tree-conflicted directory. */
> Â if (b->skip)
> Â Â return SVN_NO_ERROR;
>
> - Â if (eb->wc_ctx)
> - Â Â SVN_ERR(svn_wc_read_kind(&kind, eb->wc_ctx, b->wcpath, FALSE, pool));
> - Â else
> - Â Â kind = svn_node_dir;
> -
> - Â if (kind != svn_node_dir)
> - Â Â {
> - Â Â Â /* ### maybe try to stat the local b->wcpath? */
> - Â Â Â /* If the path doesn't exist, then send a 'skipped' notification.
> - Â Â Â Â Don't notify added directories as they triggered notification
> - Â Â Â Â in add_directory. */
> - Â Â Â if (! b->added && eb->notify_func)
> - Â Â Â Â {
> - Â Â Â Â Â svn_wc_notify_t *notify
> - Â Â Â Â Â Â = svn_wc_create_notify(b->wcpath,
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â b->tree_conflicted
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ? svn_wc_notify_tree_conflict
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â : svn_wc_notify_skip,
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â pool);
> - Â Â Â Â Â notify->kind = svn_node_dir;
> - Â Â Â Â Â notify->content_state = notify->prop_state
> - Â Â Â Â Â Â = svn_wc_notify_state_missing;
> - Â Â Â Â Â (*eb->notify_func)(eb->notify_baton, notify, pool);
> - Â Â Â Â }
> - Â Â Â return SVN_NO_ERROR;
> - Â Â }
> -
> Â /* Don't do the props_changed stuff if this is a dry_run and we don't
> Â Â Â have an access baton, since in that case the directory will already
> Â Â Â have been recognised as added, in which case they cannot conflict. */
> @@ -1030,23 +1002,30 @@ close_directory(void *dir_baton,
> Â Â Â Â Â Â Â Â b->edit_baton->diff_cmd_baton, pool));
> Â Â Â if (tree_conflicted)
> Â Â Â Â b->tree_conflicted = TRUE;
> +
> + Â Â Â if (prop_state == svn_wc_notify_state_obstructed
> + Â Â Â Â Â || prop_state == svn_wc_notify_state_missing)
> + Â Â Â Â {
> + Â Â Â Â Â content_state = prop_state;
> + Â Â Â Â Â skipped = TRUE;
> + Â Â Â Â }
> Â Â }
>
> - Â SVN_ERR(eb->diff_callbacks->dir_closed(
> - Â Â Â Â Â NULL, NULL, NULL,
> - Â Â Â Â Â b->wcpath, b->added,
> - Â Â Â Â Â b->edit_baton->diff_cmd_baton, pool));
> + Â SVN_ERR(eb->diff_callbacks->dir_closed(NULL, NULL, NULL,
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â b->wcpath, b->added,
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â b->edit_baton->diff_cmd_baton,
> + Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â pool));
>
> Â /* Don't notify added directories as they triggered notification
> Â Â Â in add_directory. */
> - Â if (!b->added && eb->notify_func)
> + Â if (!skipped && !b->added && eb->notify_func)
> Â Â {
> - Â Â Â svn_wc_notify_t *notify;
> Â Â Â apr_hash_index_t *hi;
>
> Â Â Â for (hi = apr_hash_first(pool, eb->deleted_paths); hi;
> Â Â Â Â Â Â hi = apr_hash_next(hi))
> Â Â Â Â {
> + Â Â Â Â Â svn_wc_notify_t *notify;
> Â Â Â Â Â const char *deleted_path = svn__apr_hash_index_key(hi);
> Â Â Â Â Â deleted_path_notify_t *dpn = svn__apr_hash_index_val(hi);
>
> @@ -1058,12 +1037,21 @@ close_directory(void *dir_baton,
> Â Â Â Â Â apr_hash_set(eb->deleted_paths, deleted_path,
> Â Â Â Â Â Â Â Â Â Â Â Â APR_HASH_KEY_STRING, NULL);
> Â Â Â Â }
> + Â Â }
> +
> + Â if (!b->added && eb->notify_func)
> + Â Â {
> + Â Â Â svn_wc_notify_t *notify;
> + Â Â Â svn_wc_notify_action_t action;
> +
> + Â Â Â if (b->tree_conflicted)
> + Â Â Â Â action = svn_wc_notify_tree_conflict;
> + Â Â Â else if (skipped)
> + Â Â Â Â action = svn_wc_notify_skip;
> + Â Â Â else
> + Â Â Â Â action = svn_wc_notify_update_update;
>
> - Â Â Â notify = svn_wc_create_notify(b->wcpath,
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â b->tree_conflicted
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ? svn_wc_notify_tree_conflict
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â : svn_wc_notify_update_update,
> - Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â pool);
> + Â Â Â notify = svn_wc_create_notify(b->wcpath, action, pool);
> Â Â Â notify->kind = svn_node_dir;
>
> Â Â Â /* In case of a tree conflict during merge, the diff callback
>
> Modified: subversion/trunk/subversion/tests/cmdline/merge_tree_conflict_tests.py
> URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/merge_tree_conflict_tests.py?rev=1096921&r1=1096920&r2=1096921&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/tests/cmdline/merge_tree_conflict_tests.py (original)
> +++ subversion/trunk/subversion/tests/cmdline/merge_tree_conflict_tests.py Tue Apr 26 21:38:34 2011
> @@ -1348,6 +1348,13 @@ def tree_conflicts_merge_edit_onto_missi
>
> Â expected_skip = svntest.wc.State('', {
> Â Â 'F/alpha' Â Â Â Â Â : Item(),
> + Â Â # BH: After fixing several issues in the obstruction handling
> + Â Â # Â Â I get the following Skip notifications. Please review!
> + Â Â 'D/D1' Â Â Â Â Â Â Â : Item(),
> + Â Â 'DD/D1' Â Â Â Â Â Â : Item(),
> + Â Â 'DF/D1' Â Â Â Â Â Â : Item(),
> + Â Â 'DDD/D1' Â Â Â Â Â Â : Item(),
> + Â Â 'DDF/D1' Â Â Â Â Â Â : Item(),
> Â Â })
Hi Bert,
Short answer: I think your change to this test's expectations are correct.
Long answer:
So this merge tries to apply diffs to subtrees which are missing due
to an OS-level deletion. In 1.6 this would have produced tree
conflicts, but in r946186 stsp adjusted the merge behavior to skip
obstructed and missing directories during a merge (missing/obstructed
files were already skipped). The log for that change explains the
reasoning for this, so I won't rehash it here except to note that
since that change was made we now prevent merge-tracking aware merges
when subtrees are missing. So the bit in the log about
non-inheritable mergeinfo no longer applies.
Anyway, assuming r946186 is the desired behavior (I think it is) then
your changes in r1096921 actually fix a bug we missed:
Prior to r1096921we only issued notifications for missing *files*:
trunk_at_1096920>svn st
! local_tree_missing_incoming_leaf_edit\local\D\D1
! local_tree_missing_incoming_leaf_edit\local\F\alpha
! local_tree_missing_incoming_leaf_edit\local\DD\D1
! local_tree_missing_incoming_leaf_edit\local\DD\D1\D2
! local_tree_missing_incoming_leaf_edit\local\DF\D1
! local_tree_missing_incoming_leaf_edit\local\DF\D1\beta
! local_tree_missing_incoming_leaf_edit\local\DDD\D1
! local_tree_missing_incoming_leaf_edit\local\DDD\D1\D2
! local_tree_missing_incoming_leaf_edit\local\DDD\D1\D2\D3
! local_tree_missing_incoming_leaf_edit\local\DDF\D1
! local_tree_missing_incoming_leaf_edit\local\DDF\D1\D2
! local_tree_missing_incoming_leaf_edit\local\DDF\D1\D2\gamma
trunk_at_1096920>svn merge ^^/local_tree_missing_incoming_leaf_edit/incoming
local_tree_missing_incoming_leaf_edit\local --ignore-ancestry
Skipped missing target: 'local_tree_missing_incoming_leaf_edit\local\F\alpha'
Summary of conflicts:
Skipped paths: 1
Uh, that seems quite wrong since the incoming change touches a lot
more than alpha:
trunk_at_1096920>svn log -v -r4 ^^/local_tree_missing_incoming_leaf_edit/incoming
------------------------------------------------------------------------
r4 | jrandom | 2011-04-28 09:26:12 -0400 (Thu, 28 Apr 2011) | 1 line
Changed paths:
M /local_tree_missing_incoming_leaf_edit/incoming/D/D1
A /local_tree_missing_incoming_leaf_edit/incoming/D/D1/delta
M /local_tree_missing_incoming_leaf_edit/incoming/DD/D1/D2
A /local_tree_missing_incoming_leaf_edit/incoming/DD/D1/D2/epsilon
M /local_tree_missing_incoming_leaf_edit/incoming/DDD/D1/D2/D3
A /local_tree_missing_incoming_leaf_edit/incoming/DDD/D1/D2/D3/zeta
M /local_tree_missing_incoming_leaf_edit/incoming/DDF/D1/D2/gamma
M /local_tree_missing_incoming_leaf_edit/incoming/DF/D1/beta
M /local_tree_missing_incoming_leaf_edit/incoming/F/alpha
Committing incoming actions
------------------------------------------------------------------------
trunk_at_1096921>svn merge ^^/local_tree_missing_incoming_leaf_edit/incoming
local_tree_missing_incoming_leaf_edit\local --ignore-ancestry --dry-run
Skipped missing target: 'local_tree_missing_incoming_leaf_edit\local\D\D1'
Skipped missing target: 'local_tree_missing_incoming_leaf_edit\local\F\alpha'
Skipped missing target: 'local_tree_missing_incoming_leaf_edit\local\DD\D1'
Skipped missing target: 'local_tree_missing_incoming_leaf_edit\local\DF\D1'
Skipped missing target: 'local_tree_missing_incoming_leaf_edit\local\DDD\D1'
Skipped missing target: 'local_tree_missing_incoming_leaf_edit\local\DDF\D1'
Summary of conflicts:
Skipped paths: 6
Now we see a notification for the root of each missing subtree in
which we are attempting to apply a diff. No longer are those five
directories silently skipped.
> @@ -1424,6 +1431,13 @@ def tree_conflicts_merge_del_onto_missin
> Â expected_skip = svntest.wc.State('', {
> Â Â 'F/alpha' Â Â Â Â Â : Item(),
> Â Â 'D/D1' Â Â Â Â Â Â Â : Item(),
> + Â Â # BH: After fixing several issues in the obstruction handling
> + Â Â # Â Â I get the following Skip notifications. Please review!
> + Â Â 'D/D1' Â Â Â Â Â Â Â : Item(),
> + Â Â 'DD/D1' Â Â Â Â Â Â : Item(),
> + Â Â 'DF/D1' Â Â Â Â Â Â : Item(),
> + Â Â 'DDD/D1' Â Â Â Â Â Â : Item(),
> + Â Â 'DDF/D1' Â Â Â Â Â Â : Item(),
> Â Â })
Pretty much the same thing as above except prior to r1096921 we did
get a notification that the *directory* D/D1 was skipped. This was
because of yet another inconsistency in reporting skips: An incoming
delete on the root of a missing subtree produced a notification, but
not an incoming delete below the root of a missing subtree.
Fortunately you took care to avoid duplicate notifications in this
case.
Paul
> Â svntest.actions.deep_trees_run_tests_scheme_for_merge(sbox,
>
> Modified: subversion/trunk/subversion/tests/cmdline/tree_conflict_tests.py
> URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/tree_conflict_tests.py?rev=1096921&r1=1096920&r2=1096921&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/tests/cmdline/tree_conflict_tests.py (original)
> +++ subversion/trunk/subversion/tests/cmdline/tree_conflict_tests.py Tue Apr 26 21:38:34 2011
> @@ -1084,6 +1084,7 @@ def lock_update_only(sbox):
> Â # Â Â subversion/libsvn_wc/lock.c:1437: (apr_err=155005)
> Â # Â Â svn: E155005: No write-lock in '/.../svn-test-work/working_copies/tree_conflict_tests-22/E'
> Â @Issue(3469)
> +@XFail()
> Â def at_directory_external(sbox):
> Â "tree conflict at directory external"
Received on 2011-04-28 17:41:11 CEST