> 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