You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2011/04/07 10:41:45 UTC
svn commit: r1089779 - in /subversion/trunk/subversion: include/svn_wc.h
libsvn_wc/update_editor.c svn/notify.c tests/cmdline/svntest/wc.py
tests/cmdline/switch_tests.py tests/cmdline/update_tests.py
Author: rhuijben
Date: Thu Apr 7 08:41:44 2011
New Revision: 1089779
URL: http://svn.apache.org/viewvc?rev=1089779&view=rev
Log:
More preparation for allowing more kinds of shadowed updates: Show
notifications of shadowed updates in the tree conflict column, to
make it more obvious that they are special and to allow verifying
their behavior in the test suite.
* subversion/include/svn_wc.h
(svn_wc_notify_action_t): Give two notifications a more generic name and
description and add a third notification for shadowed updates.
* subversion/libsvn_wc/update_editor.c
(do_entry_deletion): Rename argument and use a specific notification for
shadowed deletes.
(add_directory): Don't check for local obstructions when we are just
performing a shadowed add. Use the cheapest way to detect a working copy
root. Switched can't happen with single-db, as we would have described
those nodes to the repository before the update. Update notification
(add_file): Don't check for local obstructions when we are just performing
a shadowed add.
(close_file): Don't check for local node kind changes and/or perform an
attribute change when performing a shadowed update. Provide a more
detailed notification.
* subversion/svn/notify.c
(notify): Provide a more detailed notification for shadowed updates. Move
the code for this to the (more related) tree conflict notification.
* subversion/tests/cmdline/svntest/wc.py
(_re_parse_checkout): Check for shadowed update notifications.
(State::from_checkout): Allow other tree conflict values.
* subversion/tests/cmdline/switch_tests.py
(tree_conflicts_on_switch_1_1,
tree_conflicts_on_switch_1_2): Update expected notifications for changes
below the tree conflict.
* subversion/tests/cmdline/update_tests.py
(tree_conflicts_on_update_1_1,
tree_conflicts_on_update_1_2): Update expected notifications for changes
below the tree conflict.
Modified:
subversion/trunk/subversion/include/svn_wc.h
subversion/trunk/subversion/libsvn_wc/update_editor.c
subversion/trunk/subversion/svn/notify.c
subversion/trunk/subversion/tests/cmdline/svntest/wc.py
subversion/trunk/subversion/tests/cmdline/switch_tests.py
subversion/trunk/subversion/tests/cmdline/update_tests.py
Modified: subversion/trunk/subversion/include/svn_wc.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_wc.h?rev=1089779&r1=1089778&r2=1089779&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_wc.h (original)
+++ subversion/trunk/subversion/include/svn_wc.h Thu Apr 7 08:41:44 2011
@@ -1102,18 +1102,21 @@ typedef enum svn_wc_notify_action_t
/** An update tried to add a file or directory at path but an
* unversioned obstruction was found. @since New in 1.7. */
svn_wc_notify_update_obstruction,
-
/** An update operation removed an external working copy.
* @since New in 1.7. */
svn_wc_notify_update_external_removed,
- /** A node below a deleted and tree conflicted directory was added
- * during update @since New in 1.7. */
- svn_wc_notify_update_add_deleted,
+ /** A node below an existing node was added during update.
+ * @since New in 1.7. */
+ svn_wc_notify_update_shadowed_add,
+
+ /** A node below an exising node was updated during update.
+ * @since New in 1.7. */
+ svn_wc_notify_update_shadowed_update,
- /** A node below a deleted and tree conflicted directory was updated
+ /** A node below an existing node was deleted during update.
* @since New in 1.7. */
- svn_wc_notify_update_update_deleted,
+ svn_wc_notify_update_shadowed_delete,
/** The mergeinfo on path was updated. @since New in 1.7. */
svn_wc_notify_merge_record_info,
Modified: subversion/trunk/subversion/libsvn_wc/update_editor.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/update_editor.c?rev=1089779&r1=1089778&r2=1089779&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/update_editor.c (original)
+++ subversion/trunk/subversion/libsvn_wc/update_editor.c Thu Apr 7 08:41:44 2011
@@ -612,7 +612,7 @@ static svn_error_t *
do_entry_deletion(struct edit_baton *eb,
const char *local_abspath,
const char *their_url,
- svn_boolean_t in_deleted_and_tree_conflicted_subtree,
+ svn_boolean_t shadowed,
apr_pool_t *pool);
static svn_error_t *
@@ -1783,7 +1783,7 @@ static svn_error_t *
do_entry_deletion(struct edit_baton *eb,
const char *local_abspath,
const char *their_relpath,
- svn_boolean_t in_deleted_and_tree_conflicted_subtree,
+ svn_boolean_t shadowed,
apr_pool_t *pool)
{
svn_wc__db_status_t status;
@@ -1838,7 +1838,7 @@ do_entry_deletion(struct edit_baton *eb,
/* Check for conflicts only when we haven't already recorded
* a tree-conflict on a parent node. */
- if (!in_deleted_and_tree_conflicted_subtree)
+ if (!shadowed)
SVN_ERR(check_tree_conflict(&tree_conflict, eb, local_abspath,
status, kind, TRUE,
svn_wc_conflict_action_delete, svn_node_none,
@@ -1932,8 +1932,20 @@ do_entry_deletion(struct edit_baton *eb,
/* Notify. (If tree_conflict, we've already notified.) */
if (tree_conflict == NULL)
- do_notification(eb, local_abspath, svn_node_unknown,
- svn_wc_notify_update_delete, pool);
+ {
+ svn_wc_notify_action_t action = svn_wc_notify_update_delete;
+ svn_node_kind_t node_kind;
+
+ if (shadowed)
+ action = svn_wc_notify_update_shadowed_delete;
+
+ if (kind == svn_wc__db_kind_dir)
+ node_kind = svn_node_dir;
+ else
+ node_kind = svn_node_file;
+
+ do_notification(eb, local_abspath, node_kind, action, pool);
+ }
return SVN_NO_ERROR;
}
@@ -2117,8 +2129,11 @@ add_directory(const char *path,
return SVN_NO_ERROR;
}
-
- if (versioned_locally_and_present)
+ if (db->shadowed)
+ {
+ /* Nothing to check; does not and will not exist in working copy */
+ }
+ else if (versioned_locally_and_present)
{
/* What to do with a versioned or schedule-add dir:
@@ -2153,16 +2168,24 @@ add_directory(const char *path,
if (local_is_dir)
{
- svn_boolean_t wc_root;
- svn_boolean_t switched;
+ const char *wcroot_abspath;
- SVN_ERR(svn_wc__check_wc_root(&wc_root, NULL, &switched, eb->db,
- db->local_abspath, pool));
+ SVN_ERR(svn_wc__db_get_wcroot(&wcroot_abspath, eb->db,
+ db->local_abspath, pool, pool));
- err = NULL;
-
- if (wc_root)
+ if (! strcmp(wcroot_abspath, db->local_abspath))
{
+ /* Problem: We have a separate working copy in place where
+ we would like to add a new node.
+
+ Any change to this node would change the sub-working copy
+ instead of our own working copy!!!
+
+ So, the only safe thing to do is to return with an error. A
+ future update will resolve this problem, because the
+ parent directory will be marked incomplete.
+ */
+
/* ### In 1.6 we provided a bit more information on
what kind of working copy was found */
err = svn_error_createf(
@@ -2170,21 +2193,7 @@ add_directory(const char *path,
_("Failed to add directory '%s': a separate "
"working copy with the same name already exists"),
svn_dirent_local_style(db->local_abspath, pool));
- }
-
- if (!err && switched && !eb->switch_relpath)
- {
- err = svn_error_createf(
- SVN_ERR_WC_OBSTRUCTED_UPDATE, NULL,
- _("Switched directory '%s' does not match "
- "expected URL '%s'"),
- svn_dirent_local_style(db->local_abspath, pool),
- svn_path_url_add_component2(eb->repos_root,
- db->new_relpath, pool));
- }
- if (err != NULL)
- {
db->already_notified = TRUE;
do_notification(eb, db->local_abspath, svn_node_dir,
svn_wc_notify_update_obstruction, pool);
@@ -2330,7 +2339,7 @@ add_directory(const char *path,
svn_wc_notify_action_t action;
if (db->shadowed)
- action = svn_wc_notify_update_add_deleted;
+ action = svn_wc_notify_update_shadowed_add;
else if (db->obstruction_found)
action = svn_wc_notify_exists;
else
@@ -2784,7 +2793,7 @@ close_directory(void *dir_baton,
svn_wc_notify_action_t action;
if (db->shadowed)
- action = svn_wc_notify_update_update_deleted;
+ action = svn_wc_notify_update_shadowed_update;
else if (db->obstruction_found || db->add_existed)
action = svn_wc_notify_exists;
else
@@ -3030,8 +3039,11 @@ add_file(const char *path,
return SVN_NO_ERROR;
}
-
- if (versioned_locally_and_present)
+ if (fb->shadowed)
+ {
+ /* Nothing to check; does not and will not exist in working copy */
+ }
+ else if (versioned_locally_and_present)
{
/* What to do with a versioned or schedule-add file:
@@ -3968,7 +3980,7 @@ close_file(void *file_baton,
* locally there already is a file scheduled for addition, or vice versa.
* It sees incoming symlinks as simple files and may wrongly try to offer
* a text conflict. So flag a tree conflict here. */
- if (fb->adding_file && fb->add_existed)
+ if (!fb->shadowed && fb->adding_file && fb->add_existed)
{
svn_boolean_t local_is_link = FALSE;
svn_boolean_t incoming_is_link = FALSE;
@@ -4114,7 +4126,8 @@ close_file(void *file_baton,
/* Now that all the state has settled, should we update the readonly
status of the working file? The LOCK_STATE will signal what we should
do for this node. */
- if (fb->new_text_base_sha1_checksum == NULL
+ if (!fb->shadowed
+ && fb->new_text_base_sha1_checksum == NULL
&& lock_state == svn_wc_notify_lock_state_unlocked)
{
/* If a lock was removed and we didn't update the text contents, we
@@ -4264,7 +4277,9 @@ close_file(void *file_baton,
svn_wc_notify_action_t action = svn_wc_notify_update_update;
if (fb->shadowed)
- action = svn_wc_notify_update_add_deleted;
+ action = fb->adding_file
+ ? svn_wc_notify_update_shadowed_add
+ : svn_wc_notify_update_shadowed_update;
else if (fb->obstruction_found || fb->add_existed)
{
if (content_state != svn_wc_notify_state_conflicted)
Modified: subversion/trunk/subversion/svn/notify.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/svn/notify.c?rev=1089779&r1=1089778&r2=1089779&view=diff
==============================================================================
--- subversion/trunk/subversion/svn/notify.c (original)
+++ subversion/trunk/subversion/svn/notify.c Thu Apr 7 08:41:44 2011
@@ -150,13 +150,6 @@ notify(void *baton, const svn_wc_notify_
}
break;
- case svn_wc_notify_update_add_deleted:
- case svn_wc_notify_update_update_deleted:
- /* ### Before 1.7.0 these notifications were suppressed in the wc
- ### library.. how should we notify these?
-
- ### Fall through in deleted notification. */
-
case svn_wc_notify_update_delete:
case svn_wc_notify_update_external_removed:
nb->received_some_change = TRUE;
@@ -857,6 +850,24 @@ notify(void *baton, const svn_wc_notify_
goto print_error;
break;
+ case svn_wc_notify_update_shadowed_add:
+ nb->received_some_change = TRUE;
+ if ((err = svn_cmdline_printf(pool, " A %s\n", path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_update_shadowed_update:
+ nb->received_some_change = TRUE;
+ if ((err = svn_cmdline_printf(pool, " U %s\n", path_local)))
+ goto print_error;
+ break;
+
+ case svn_wc_notify_update_shadowed_delete:
+ nb->received_some_change = TRUE;
+ if ((err = svn_cmdline_printf(pool, " D %s\n", path_local)))
+ goto print_error;
+ break;
+
case svn_wc_notify_property_modified:
case svn_wc_notify_property_added:
err = svn_cmdline_printf(pool,
Modified: subversion/trunk/subversion/tests/cmdline/svntest/wc.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/svntest/wc.py?rev=1089779&r1=1089778&r2=1089779&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/svntest/wc.py (original)
+++ subversion/trunk/subversion/tests/cmdline/svntest/wc.py Thu Apr 7 08:41:44 2011
@@ -89,7 +89,7 @@ _re_parse_summarize = re.compile("^([MAD
_re_parse_checkout = re.compile('^([RMAGCUDE_ ][MAGCUDE_ ])'
'([B ])'
- '([C ])\s+'
+ '([CAUD ])\s+'
'(.+)')
_re_parse_co_skipped = re.compile('^(Restored|Skipped)\s+\'(.+)\'')
_re_parse_co_restored = re.compile('^(Restored)\s+\'(.+)\'')
@@ -460,8 +460,8 @@ class State:
match = _re_parse_checkout.search(line)
if match:
- if match.group(3) == 'C':
- treeconflict = 'C'
+ if match.group(3) != ' ':
+ treeconflict = match.group(3)
else:
treeconflict = None
desc[to_relpath(match.group(4))] = StateItem(status=match.group(1),
Modified: subversion/trunk/subversion/tests/cmdline/switch_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/switch_tests.py?rev=1089779&r1=1089778&r2=1089779&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/switch_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/switch_tests.py Thu Apr 7 08:41:44 2011
@@ -2529,15 +2529,15 @@ def tree_conflicts_on_switch_1_1(sbox):
expected_output = deep_trees_conflict_output.copy()
expected_output.add({
- 'DDD/D1/D2' : Item(status='D '),
- 'DDD/D1/D2/D3' : Item(status='D '),
- 'DDD/D1/D2/D3/zeta' : Item(status='D '),
- 'DD/D1/D2' : Item(status='D '),
- 'DD/D1/D2/epsilon' : Item(status='D '),
- 'DF/D1/beta' : Item(status='D '),
- 'D/D1/delta' : Item(status='D '),
- 'DDF/D1/D2' : Item(status='D '),
- 'DDF/D1/D2/gamma' : Item(status='D ')
+ 'DDD/D1/D2' : Item(status=' ', treeconflict='U'),
+ 'DDD/D1/D2/D3' : Item(status=' ', treeconflict='U'),
+ 'DDD/D1/D2/D3/zeta' : Item(status=' ', treeconflict='A'),
+ 'DD/D1/D2' : Item(status=' ', treeconflict='U'),
+ 'DD/D1/D2/epsilon' : Item(status=' ', treeconflict='A'),
+ 'DF/D1/beta' : Item(status=' ', treeconflict='U'),
+ 'D/D1/delta' : Item(status=' ', treeconflict='A'),
+ 'DDF/D1/D2' : Item(status=' ', treeconflict='U'),
+ 'DDF/D1/D2/gamma' : Item(status=' ', treeconflict='U')
})
expected_disk = disk_empty_dirs.copy()
@@ -2619,12 +2619,12 @@ def tree_conflicts_on_switch_1_2(sbox):
expected_output = deep_trees_conflict_output.copy()
expected_output.add({
- 'DD/D1/D2' : Item(status='D '),
- 'DDF/D1/D2' : Item(status='D '),
- 'DDF/D1/D2/gamma' : Item(status='D '),
- 'DDD/D1/D2' : Item(status='D '),
- 'DDD/D1/D2/D3' : Item(status='D '),
- 'DF/D1/beta' : Item(status='D '),
+ 'DD/D1/D2' : Item(status=' ', treeconflict='D'),
+ 'DDF/D1/D2' : Item(status=' ', treeconflict='U'),
+ 'DDF/D1/D2/gamma' : Item(status=' ', treeconflict='D'),
+ 'DDD/D1/D2' : Item(status=' ', treeconflict='U'),
+ 'DDD/D1/D2/D3' : Item(status=' ', treeconflict='D'),
+ 'DF/D1/beta' : Item(status=' ', treeconflict='D'),
})
expected_disk = disk_empty_dirs.copy()
Modified: subversion/trunk/subversion/tests/cmdline/update_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/update_tests.py?rev=1089779&r1=1089778&r2=1089779&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/update_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/update_tests.py Thu Apr 7 08:41:44 2011
@@ -4194,15 +4194,15 @@ def tree_conflicts_on_update_1_1(sbox):
expected_output = deep_trees_conflict_output.copy()
expected_output.add({
- 'DDF/D1/D2' : Item(status='D '),
- 'DDF/D1/D2/gamma' : Item(status='D '),
- 'DD/D1/D2' : Item(status='D '),
- 'DD/D1/D2/epsilon' : Item(status='D '),
- 'DDD/D1/D2' : Item(status='D '),
- 'DDD/D1/D2/D3' : Item(status='D '),
- 'DDD/D1/D2/D3/zeta' : Item(status='D '),
- 'D/D1/delta' : Item(status='D '),
- 'DF/D1/beta' : Item(status='D '),
+ 'DDF/D1/D2' : Item(status=' ', treeconflict='U'),
+ 'DDF/D1/D2/gamma' : Item(status=' ', treeconflict='U'),
+ 'DD/D1/D2' : Item(status=' ', treeconflict='U'),
+ 'DD/D1/D2/epsilon' : Item(status=' ', treeconflict='A'),
+ 'DDD/D1/D2' : Item(status=' ', treeconflict='U'),
+ 'DDD/D1/D2/D3' : Item(status=' ', treeconflict='U'),
+ 'DDD/D1/D2/D3/zeta' : Item(status=' ', treeconflict='A'),
+ 'D/D1/delta' : Item(status=' ', treeconflict='A'),
+ 'DF/D1/beta' : Item(status=' ', treeconflict='U'),
})
expected_disk = disk_empty_dirs.copy()
@@ -4282,12 +4282,12 @@ def tree_conflicts_on_update_1_2(sbox):
expected_output = deep_trees_conflict_output.copy()
expected_output.add({
- 'DDD/D1/D2' : Item(status='D '),
- 'DDD/D1/D2/D3' : Item(status='D '),
- 'DF/D1/beta' : Item(status='D '),
- 'DD/D1/D2' : Item(status='D '),
- 'DDF/D1/D2' : Item(status='D '),
- 'DDF/D1/D2/gamma' : Item(status='D '),
+ 'DDD/D1/D2' : Item(status=' ', treeconflict='U'),
+ 'DDD/D1/D2/D3' : Item(status=' ', treeconflict='D'),
+ 'DF/D1/beta' : Item(status=' ', treeconflict='D'),
+ 'DD/D1/D2' : Item(status=' ', treeconflict='D'),
+ 'DDF/D1/D2' : Item(status=' ', treeconflict='U'),
+ 'DDF/D1/D2/gamma' : Item(status=' ', treeconflict='D'),
})
expected_disk = disk_empty_dirs.copy()
Re: svn commit: r1089779 - in /subversion/trunk/subversion:
include/svn_wc.h libsvn_wc/update_editor.c svn/notify.c tests/cmdline/svntest/wc.py
tests/cmdline/switch_tests.py tests/cmdline/update_tests.py
Posted by Paul Burba <pt...@gmail.com>.
On Thu, Apr 7, 2011 at 4:41 AM, <rh...@apache.org> wrote:
> Author: rhuijben
> Date: Thu Apr 7 08:41:44 2011
> New Revision: 1089779
>
> URL: http://svn.apache.org/viewvc?rev=1089779&view=rev
> Log:
> More preparation for allowing more kinds of shadowed updates: Show
> notifications of shadowed updates in the tree conflict column, to
> make it more obvious that they are special and to allow verifying
> their behavior in the test suite.
>
> * subversion/include/svn_wc.h
> (svn_wc_notify_action_t): Give two notifications a more generic name and
> description and add a third notification for shadowed updates.
>
> * subversion/libsvn_wc/update_editor.c
> (do_entry_deletion): Rename argument and use a specific notification for
> shadowed deletes.
> (add_directory): Don't check for local obstructions when we are just
> performing a shadowed add. Use the cheapest way to detect a working copy
> root. Switched can't happen with single-db, as we would have described
> those nodes to the repository before the update. Update notification
> (add_file): Don't check for local obstructions when we are just performing
> a shadowed add.
> (close_file): Don't check for local node kind changes and/or perform an
> attribute change when performing a shadowed update. Provide a more
> detailed notification.
>
> * subversion/svn/notify.c
> (notify): Provide a more detailed notification for shadowed updates. Move
> the code for this to the (more related) tree conflict notification.
>
> * subversion/tests/cmdline/svntest/wc.py
> (_re_parse_checkout): Check for shadowed update notifications.
> (State::from_checkout): Allow other tree conflict values.
>
> * subversion/tests/cmdline/switch_tests.py
> (tree_conflicts_on_switch_1_1,
> tree_conflicts_on_switch_1_2): Update expected notifications for changes
> below the tree conflict.
>
> * subversion/tests/cmdline/update_tests.py
> (tree_conflicts_on_update_1_1,
> tree_conflicts_on_update_1_2): Update expected notifications for changes
> below the tree conflict.
>
> Modified:
> subversion/trunk/subversion/include/svn_wc.h
> subversion/trunk/subversion/libsvn_wc/update_editor.c
> subversion/trunk/subversion/svn/notify.c
> subversion/trunk/subversion/tests/cmdline/svntest/wc.py
> subversion/trunk/subversion/tests/cmdline/switch_tests.py
> subversion/trunk/subversion/tests/cmdline/update_tests.py
>
> Modified: subversion/trunk/subversion/include/svn_wc.h
> URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_wc.h?rev=1089779&r1=1089778&r2=1089779&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/include/svn_wc.h (original)
> +++ subversion/trunk/subversion/include/svn_wc.h Thu Apr 7 08:41:44 2011
> @@ -1102,18 +1102,21 @@ typedef enum svn_wc_notify_action_t
> /** An update tried to add a file or directory at path but an
> * unversioned obstruction was found. @since New in 1.7. */
> svn_wc_notify_update_obstruction,
> -
> /** An update operation removed an external working copy.
> * @since New in 1.7. */
> svn_wc_notify_update_external_removed,
>
> - /** A node below a deleted and tree conflicted directory was added
> - * during update @since New in 1.7. */
> - svn_wc_notify_update_add_deleted,
> + /** A node below an existing node was added during update.
> + * @since New in 1.7. */
> + svn_wc_notify_update_shadowed_add,
> +
> + /** A node below an exising node was updated during update.
> + * @since New in 1.7. */
> + svn_wc_notify_update_shadowed_update,
>
> - /** A node below a deleted and tree conflicted directory was updated
> + /** A node below an existing node was deleted during update.
> * @since New in 1.7. */
> - svn_wc_notify_update_update_deleted,
> + svn_wc_notify_update_shadowed_delete,
>
> /** The mergeinfo on path was updated. @since New in 1.7. */
> svn_wc_notify_merge_record_info,
>
> Modified: subversion/trunk/subversion/libsvn_wc/update_editor.c
> URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/update_editor.c?rev=1089779&r1=1089778&r2=1089779&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/libsvn_wc/update_editor.c (original)
> +++ subversion/trunk/subversion/libsvn_wc/update_editor.c Thu Apr 7 08:41:44 2011
> @@ -612,7 +612,7 @@ static svn_error_t *
> do_entry_deletion(struct edit_baton *eb,
> const char *local_abspath,
> const char *their_url,
> - svn_boolean_t in_deleted_and_tree_conflicted_subtree,
> + svn_boolean_t shadowed,
> apr_pool_t *pool);
>
> static svn_error_t *
> @@ -1783,7 +1783,7 @@ static svn_error_t *
> do_entry_deletion(struct edit_baton *eb,
> const char *local_abspath,
> const char *their_relpath,
> - svn_boolean_t in_deleted_and_tree_conflicted_subtree,
> + svn_boolean_t shadowed,
> apr_pool_t *pool)
> {
> svn_wc__db_status_t status;
> @@ -1838,7 +1838,7 @@ do_entry_deletion(struct edit_baton *eb,
>
> /* Check for conflicts only when we haven't already recorded
> * a tree-conflict on a parent node. */
> - if (!in_deleted_and_tree_conflicted_subtree)
> + if (!shadowed)
> SVN_ERR(check_tree_conflict(&tree_conflict, eb, local_abspath,
> status, kind, TRUE,
> svn_wc_conflict_action_delete, svn_node_none,
> @@ -1932,8 +1932,20 @@ do_entry_deletion(struct edit_baton *eb,
>
> /* Notify. (If tree_conflict, we've already notified.) */
> if (tree_conflict == NULL)
> - do_notification(eb, local_abspath, svn_node_unknown,
> - svn_wc_notify_update_delete, pool);
> + {
> + svn_wc_notify_action_t action = svn_wc_notify_update_delete;
> + svn_node_kind_t node_kind;
> +
> + if (shadowed)
> + action = svn_wc_notify_update_shadowed_delete;
> +
> + if (kind == svn_wc__db_kind_dir)
> + node_kind = svn_node_dir;
> + else
> + node_kind = svn_node_file;
> +
> + do_notification(eb, local_abspath, node_kind, action, pool);
> + }
>
> return SVN_NO_ERROR;
> }
> @@ -2117,8 +2129,11 @@ add_directory(const char *path,
> return SVN_NO_ERROR;
> }
>
> -
> - if (versioned_locally_and_present)
> + if (db->shadowed)
> + {
> + /* Nothing to check; does not and will not exist in working copy */
> + }
> + else if (versioned_locally_and_present)
> {
> /* What to do with a versioned or schedule-add dir:
>
> @@ -2153,16 +2168,24 @@ add_directory(const char *path,
>
> if (local_is_dir)
> {
> - svn_boolean_t wc_root;
> - svn_boolean_t switched;
> + const char *wcroot_abspath;
>
> - SVN_ERR(svn_wc__check_wc_root(&wc_root, NULL, &switched, eb->db,
> - db->local_abspath, pool));
> + SVN_ERR(svn_wc__db_get_wcroot(&wcroot_abspath, eb->db,
> + db->local_abspath, pool, pool));
>
> - err = NULL;
> -
> - if (wc_root)
> + if (! strcmp(wcroot_abspath, db->local_abspath))
> {
> + /* Problem: We have a separate working copy in place where
> + we would like to add a new node.
> +
> + Any change to this node would change the sub-working copy
> + instead of our own working copy!!!
> +
> + So, the only safe thing to do is to return with an error. A
> + future update will resolve this problem, because the
> + parent directory will be marked incomplete.
> + */
> +
> /* ### In 1.6 we provided a bit more information on
> what kind of working copy was found */
> err = svn_error_createf(
> @@ -2170,21 +2193,7 @@ add_directory(const char *path,
> _("Failed to add directory '%s': a separate "
> "working copy with the same name already exists"),
> svn_dirent_local_style(db->local_abspath, pool));
> - }
> -
> - if (!err && switched && !eb->switch_relpath)
> - {
> - err = svn_error_createf(
> - SVN_ERR_WC_OBSTRUCTED_UPDATE, NULL,
> - _("Switched directory '%s' does not match "
> - "expected URL '%s'"),
> - svn_dirent_local_style(db->local_abspath, pool),
> - svn_path_url_add_component2(eb->repos_root,
> - db->new_relpath, pool));
> - }
>
> - if (err != NULL)
> - {
> db->already_notified = TRUE;
> do_notification(eb, db->local_abspath, svn_node_dir,
> svn_wc_notify_update_obstruction, pool);
> @@ -2330,7 +2339,7 @@ add_directory(const char *path,
> svn_wc_notify_action_t action;
>
> if (db->shadowed)
> - action = svn_wc_notify_update_add_deleted;
> + action = svn_wc_notify_update_shadowed_add;
> else if (db->obstruction_found)
> action = svn_wc_notify_exists;
> else
> @@ -2784,7 +2793,7 @@ close_directory(void *dir_baton,
> svn_wc_notify_action_t action;
>
> if (db->shadowed)
> - action = svn_wc_notify_update_update_deleted;
> + action = svn_wc_notify_update_shadowed_update;
> else if (db->obstruction_found || db->add_existed)
> action = svn_wc_notify_exists;
> else
> @@ -3030,8 +3039,11 @@ add_file(const char *path,
> return SVN_NO_ERROR;
> }
>
> -
> - if (versioned_locally_and_present)
> + if (fb->shadowed)
> + {
> + /* Nothing to check; does not and will not exist in working copy */
> + }
> + else if (versioned_locally_and_present)
> {
> /* What to do with a versioned or schedule-add file:
>
> @@ -3968,7 +3980,7 @@ close_file(void *file_baton,
> * locally there already is a file scheduled for addition, or vice versa.
> * It sees incoming symlinks as simple files and may wrongly try to offer
> * a text conflict. So flag a tree conflict here. */
> - if (fb->adding_file && fb->add_existed)
> + if (!fb->shadowed && fb->adding_file && fb->add_existed)
> {
> svn_boolean_t local_is_link = FALSE;
> svn_boolean_t incoming_is_link = FALSE;
> @@ -4114,7 +4126,8 @@ close_file(void *file_baton,
> /* Now that all the state has settled, should we update the readonly
> status of the working file? The LOCK_STATE will signal what we should
> do for this node. */
> - if (fb->new_text_base_sha1_checksum == NULL
> + if (!fb->shadowed
> + && fb->new_text_base_sha1_checksum == NULL
> && lock_state == svn_wc_notify_lock_state_unlocked)
> {
> /* If a lock was removed and we didn't update the text contents, we
> @@ -4264,7 +4277,9 @@ close_file(void *file_baton,
> svn_wc_notify_action_t action = svn_wc_notify_update_update;
>
> if (fb->shadowed)
> - action = svn_wc_notify_update_add_deleted;
> + action = fb->adding_file
> + ? svn_wc_notify_update_shadowed_add
> + : svn_wc_notify_update_shadowed_update;
> else if (fb->obstruction_found || fb->add_existed)
> {
> if (content_state != svn_wc_notify_state_conflicted)
>
> Modified: subversion/trunk/subversion/svn/notify.c
> URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/svn/notify.c?rev=1089779&r1=1089778&r2=1089779&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/svn/notify.c (original)
> +++ subversion/trunk/subversion/svn/notify.c Thu Apr 7 08:41:44 2011
> @@ -150,13 +150,6 @@ notify(void *baton, const svn_wc_notify_
> }
> break;
>
> - case svn_wc_notify_update_add_deleted:
> - case svn_wc_notify_update_update_deleted:
> - /* ### Before 1.7.0 these notifications were suppressed in the wc
> - ### library.. how should we notify these?
> -
> - ### Fall through in deleted notification. */
> -
> case svn_wc_notify_update_delete:
> case svn_wc_notify_update_external_removed:
> nb->received_some_change = TRUE;
> @@ -857,6 +850,24 @@ notify(void *baton, const svn_wc_notify_
> goto print_error;
> break;
>
> + case svn_wc_notify_update_shadowed_add:
> + nb->received_some_change = TRUE;
> + if ((err = svn_cmdline_printf(pool, " A %s\n", path_local)))
> + goto print_error;
> + break;
> +
> + case svn_wc_notify_update_shadowed_update:
> + nb->received_some_change = TRUE;
> + if ((err = svn_cmdline_printf(pool, " U %s\n", path_local)))
> + goto print_error;
> + break;
> +
> + case svn_wc_notify_update_shadowed_delete:
> + nb->received_some_change = TRUE;
> + if ((err = svn_cmdline_printf(pool, " D %s\n", path_local)))
> + goto print_error;
> + break;
Hi Bert,
The help text for 'svn merge' and 'svn update' need to be updated to
reflect these potential new values in the 4th (tree-conflict) column.
I'd happily do so myself, but I don't quite have my head around what
you're doing here.
--
Paul T. Burba
CollabNet, Inc. -- www.collab.net -- Enterprise Cloud Development
Skype: ptburba