Anyone up for discussing the two '###'-comments in this patch's log message? I think this patch is necessary, but feel free to discuss it to smithereens. I'd say +1 for both '###'-comments, for consistency with dir externals.
Omit pegged file externals (that have a specific rev) from recursive commit. Explicit targets are not skipped.
Raison: file externals with a specific revision number are supposed to stay at that revision. When they are locally modified, they will usually just abort the entire commit with out-of-date-ness. Even if the peg revision is currently up-to-date, a commit to it causes the file external to be bumped to HEAD in the WC, and subsequent updates complain about the file external's state: [[[ svn: warning: W155035: The specified path has an unexpected status [...] svn: E205011: Failure occurred processing one or more externals definitions ]]] ### It is debatable if even explicit targets should be skipped. ### It is also debatable if we should also skip *un*pegged file externals from recursion, just like we do with dir externals. * subversion/libsvn_client/commit_util.c (harvest_committables): New parameter IS_EXPLICIT_TARGET. Omit pegged file externals from commit. Recursions pass IS_EXPLICIT_TARGET as FALSE. (svn_client__harvest_committables, harvest_copy_committables): Pass IS_EXPLICIT_TARGET as TRUE. Index: subversion/libsvn_client/commit_util.c =================================================================== --- subversion/libsvn_client/commit_util.c (revision 1162797) +++ subversion/libsvn_client/commit_util.c (working copy) @@ -410,6 +410,9 @@ bail_on_tree_conflicted_ancestor(svn_wc_ when harvesting committables; that is, don't add a path to COMMITTABLES unless it's a member of one of those changelists. + IS_EXPLICIT_TARGET should always be passed as TRUE (except when + harvest_committables() calls itself in recursion). + If CANCEL_FUNC is non-null, call it with CANCEL_BATON to see if the user has cancelled the operation. @@ -428,6 +431,7 @@ harvest_committables(svn_wc_context_t *w apr_hash_t *changelists, svn_boolean_t skip_files, svn_boolean_t skip_dirs, + svn_boolean_t is_explicit_target, svn_client__check_url_kind_t check_url_func, void *check_url_baton, svn_cancel_func_t cancel_func, @@ -543,12 +547,34 @@ harvest_committables(svn_wc_context_t *w svn_dirent_local_style(local_abspath, scratch_pool)); } - /* ### in need of comment */ - if (copy_mode - && is_update_root + /* Handle file externals. + * (IS_UPDATE_ROOT is more generally defined, but at the moment this + * condition matches only file externals.) */ + if (is_update_root && db_kind == svn_node_file) { - return SVN_NO_ERROR; + + /* Don't copy files that svn:externals brought into the WC. */ + if (copy_mode) + return SVN_NO_ERROR; + + /* Check if it's a *pegged* file external, and skip it if so. + * They usually cause an out-of-date error and abort the entire + * commit. But, never skip an explicit target. */ + if (! is_explicit_target) + { + svn_node_kind_t xkind; + svn_revnum_t xrev; + + SVN_ERR(svn_wc__read_external_info(&xkind, NULL, NULL, NULL, + &xrev, + wc_ctx, NULL, + local_abspath, + TRUE, + scratch_pool, scratch_pool)); + if (xkind == svn_node_file && xrev != SVN_INVALID_REVNUM) + return SVN_NO_ERROR; + } } /* If NODE is in our changelist, then examine it for conflicts. We @@ -841,6 +867,7 @@ harvest_committables(svn_wc_context_t *w changelists, (depth < svn_depth_files), (depth < svn_depth_immediates), + FALSE, /* is_explicit_target */ check_url_func, check_url_baton, cancel_func, cancel_baton, notify_func, notify_baton, @@ -1125,6 +1152,7 @@ svn_client__harvest_committables(svn_cli FALSE /* COPY_MODE_ROOT */, depth, just_locked, changelist_hash, FALSE, FALSE, + TRUE /* IS_EXPLICIT_TARGET */, check_url_func, check_url_baton, ctx->cancel_func, ctx->cancel_baton, ctx->notify_func2, ctx->notify_baton2, @@ -1218,6 +1246,7 @@ harvest_copy_committables(void *baton, v FALSE, /* JUST_LOCKED */ NULL, FALSE, FALSE, /* skip files, dirs */ + TRUE, /* IS_EXPLICIT_TARGET (don't care) */ btn->check_url_func, btn->check_url_baton, btn->ctx->cancel_func,
signature.asc
Description: OpenPGP digital signature