> Author: philip

> Date: Wed Mar 13 12:03:41 2013
> New Revision: 1455898
> 
> URL: http://svn.apache.org/r1455898
> Log:
> Detect unmodified files being updated during move-update.
> 
> * subversion/libsvn_client/resolved.c
>   (svn_client_resolve): Add sleep for timestamps.
> 
> * subversion/libsvn_wc/wc_db_update_move.c
>   (update_working_file): Detect unmodified local file and install
>    pristine rather than merging.
[...]

> Modified: subversion/trunk/subversion/libsvn_wc/wc_db_update_move.c
> +          /*
> +           * Run a 3-way merge to update the file, using the pre-update
> +           * pristine text as the merge base, the post-update pristine
> +           * text as the merge-left version, and the current content of the
> +           * moved-here working file as the merge-right version.
> +           */
> +          SVN_ERR(svn_wc__db_pristine_get_path(&old_pristine_abspath,
> +                                               db, wcroot->abspath,
> +                                               old_version->checksum,
> +                                               scratch_pool, scratch_pool));
> +          SVN_ERR(svn_wc__db_pristine_get_path(&new_pristine_abspath,
> +                                               db, wcroot->abspath,
> +                                               new_version->checksum,
> +                                               scratch_pool, scratch_pool));
> +          SVN_ERR(svn_wc__internal_merge(&work_item, &conflict_skel,
> +                                         &merge_outcome, db,
> +                                         old_pristine_abspath,
> +                                         new_pristine_abspath,
> +                                         local_abspath,
> +                                         local_abspath,
> +                                         NULL, NULL, NULL, /* diff labels */
> +                                         actual_props,
> +                                         FALSE, /* dry-run */
> +                                         NULL, /* diff3-cmd */
> +                                         NULL, /* merge options */
> +                                         propchanges,
> +                                         NULL, NULL, /* cancel_func + baton 
> */
> +                                         scratch_pool, scratch_pool));
> +
> +          work_items = svn_wc__wq_merge(work_items, work_item, scratch_pool);
> +
> +          if (merge_outcome == svn_wc_merge_conflict)
> +            {
> +              content_state = svn_wc_notify_state_conflicted;
> +            }
> +           else
> +            {

> +              SVN_ERR(svn_wc__internal_file_modified_p(&is_locally_modified,
> +                                                       db, local_abspath,
> +                                                       FALSE /* 
> exact_comparison */,
> +                                                       scratch_pool));
> +              if (is_locally_modified)
> +                content_state = svn_wc_notify_state_merged;
> +              else
> +                content_state = svn_wc_notify_state_changed;
> +            }

I don't understand that last 'else' block.

We're asking 'Is it 
locally modified?' but I don't think we have a consistent notion of what
 'it' is, since the above svn_wc__internal_merge() might or might not 
have updated the WC file at local_abspath -- it might instead have created a 
temp file and set up 
some work items which will install that file later [1].

Do
 we actually want to ask here, 'Was the file locally modified before we 
started merging?'  If so, this whole block should be replaced with just 
"content_state = svn_wc_notify_state_merged;".

>          }
>      }
>    else

[1] Actually in 
r1432216 I edited the doc string of svn_wc__internal_merge() to say it 
does not update the WC file.  It looks like I was over-zealous there and should 
change it as follows:

[[[
Index: subversion/libsvn_wc/wc.h
===================================================================
--- subversion/libsvn_wc/wc.h    (revision 1456105)
+++ subversion/libsvn_wc/wc.h    (working copy)
@@ -391,6 +391,7 @@
 /* Prepare to merge a file content change into the working copy.  This
    does not merge properties; see svn_wc__merge_props() for that.  This
-   does not change the working file on disk; it returns work items that
-   will replace the working file on disk when they are run.
+   does not necessarily change the file TARGET_ABSPATH on disk; it may
+   instead return work items that will replace the file on disk when
+   they are run.
 
    Merge the difference between LEFT_ABSPATH and RIGHT_ABSPATH into
]]]

- Julian

Reply via email to