Return-Path: X-Original-To: apmail-subversion-commits-archive@minotaur.apache.org Delivered-To: apmail-subversion-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 7FDF1E852 for ; Thu, 31 Jan 2013 22:32:47 +0000 (UTC) Received: (qmail 89989 invoked by uid 500); 31 Jan 2013 22:32:47 -0000 Delivered-To: apmail-subversion-commits-archive@subversion.apache.org Received: (qmail 89971 invoked by uid 500); 31 Jan 2013 22:32:47 -0000 Mailing-List: contact commits-help@subversion.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@subversion.apache.org Delivered-To: mailing list commits@subversion.apache.org Received: (qmail 89963 invoked by uid 99); 31 Jan 2013 22:32:47 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 31 Jan 2013 22:32:47 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 31 Jan 2013 22:32:46 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 469372388980; Thu, 31 Jan 2013 22:32:27 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1441232 - /subversion/trunk/subversion/libsvn_client/merge.c Date: Thu, 31 Jan 2013 22:32:27 -0000 To: commits@subversion.apache.org From: rhuijben@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20130131223227.469372388980@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: rhuijben Date: Thu Jan 31 22:32:26 2013 New Revision: 1441232 URL: http://svn.apache.org/viewvc?rev=1441232&view=rev Log: Following up on r1441186, reinstate the old header per merge-child behavior for ancestrical merges. * subversion/libsvn_client/merge.c (mark_dir_edited, mark_file_edited): Call notify_merge_begin before producing skip. (find_nearest_ancestor): Go through the list backwards to allow directly returning when we have the best match. (notify_merge_begin): Don't set the notified_merge_begin variable in the case when we detect different targets based on the mergeinfo children. Reverse some variables to implement a quick exit without allocating when we don't have a new start. Modified: subversion/trunk/subversion/libsvn_client/merge.c Modified: subversion/trunk/subversion/libsvn_client/merge.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/merge.c?rev=1441232&r1=1441231&r2=1441232&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_client/merge.c (original) +++ subversion/trunk/subversion/libsvn_client/merge.c Thu Jan 31 22:32:26 2013 @@ -1750,6 +1750,9 @@ mark_dir_edited(merge_cmd_baton_t *merge { svn_wc_notify_t *notify; + SVN_ERR(notify_merge_begin(merge_b, local_abspath, FALSE, + scratch_pool)); + notify = svn_wc_create_notify( local_abspath, (db->tree_conflict_reason == CONFLICT_REASON_SKIP) @@ -1798,9 +1801,7 @@ mark_dir_edited(merge_cmd_baton_t *merge tree conflict on the obstructing op-root. If only a descendant is moved away, we call the node itself - deleted. - */ - + deleted. */ db->tree_conflict_reason = svn_wc_conflict_reason_moved_away; moved_away_abspath = local_abspath; } @@ -1856,6 +1857,9 @@ mark_file_edited(merge_cmd_baton_t *merg { svn_wc_notify_t *notify; + SVN_ERR(notify_merge_begin(merge_b, local_abspath, FALSE, + scratch_pool)); + notify = svn_wc_create_notify(local_abspath, svn_wc_notify_skip, scratch_pool); notify->kind = svn_node_file; @@ -1890,9 +1894,7 @@ mark_file_edited(merge_cmd_baton_t *merg tree conflict on the obstructing op-root. If only a descendant is moved away, we call the node itself - deleted. - */ - + deleted. */ fb->tree_conflict_reason = svn_wc_conflict_reason_moved_away; moved_away_abspath = local_abspath; } @@ -3266,16 +3268,17 @@ find_nearest_ancestor(const apr_array_he SVN_ERR_ASSERT_NO_RETURN(children_with_mergeinfo != NULL); - for (i = 0; i < children_with_mergeinfo->nelts; i++) + for (i = children_with_mergeinfo->nelts - 1; i >= 0 ; i--) { svn_client__merge_path_t *child = APR_ARRAY_IDX(children_with_mergeinfo, i, svn_client__merge_path_t *); + if (svn_dirent_is_ancestor(child->abspath, local_abspath) && (path_is_own_ancestor || strcmp(child->abspath, local_abspath) != 0)) - ancestor = child; + return child; } - return ancestor; + return NULL; } /* Notify that we're starting to record mergeinfo for the merge of the @@ -3332,9 +3335,7 @@ notify_merge_completed(const char *targe || notify->action == svn_wc_notify_tree_conflict) -/* Notify that we're starting to record the merge of the - * revision range RANGE into TARGET_ABSPATH. RANGE should be null if the - * merge sources are not from the same URL. +/* Notify that we're starting a merge * * This calls the client's notification receiver (as found in the client * context), with a WC abspath. @@ -3346,20 +3347,14 @@ notify_merge_begin(merge_cmd_baton_t *me apr_pool_t *scratch_pool) { svn_wc_notify_t *notify; + svn_merge_range_t *n_range = NULL; + const char *notify_abspath; - if (merge_b->notified_merge_begin) + if (merge_b->notified_merge_begin + || ! merge_b->ctx->notify_func2) return SVN_NO_ERROR; - merge_b->notified_merge_begin = TRUE; - - if (! merge_b->ctx->notify_func2) - return SVN_NO_ERROR; - - notify = svn_wc_create_notify(merge_b->target->abspath, - merge_b->same_repos - ? svn_wc_notify_merge_begin - : svn_wc_notify_foreign_merge_begin, - scratch_pool); + notify_abspath = merge_b->target->abspath; /* If our merge sources are ancestors of one another... */ /* single file merge updates current_range */ @@ -3387,23 +3382,38 @@ notify_merge_begin(merge_cmd_baton_t *me ! delete_action, local_abspath); - if (merge_b->cur_ancestor_abspath == NULL - || strcmp(child->abspath, merge_b->cur_ancestor_abspath) != 0) + if (merge_b->cur_ancestor_abspath != NULL + && strcmp(child->abspath, merge_b->cur_ancestor_abspath)) { - merge_b->cur_ancestor_abspath = child->abspath; - if (!child->absent && child->remaining_ranges->nelts > 0) - { - notify->path = child->abspath; - notify->merge_range = svn_merge_range_dup( - APR_ARRAY_IDX(child->remaining_ranges, - 0, svn_merge_range_t *), - scratch_pool); - } + /* Don't notify the same merge again */ + return SVN_NO_ERROR; + } + + merge_b->cur_ancestor_abspath = child->abspath; + + if (child->absent || child->remaining_ranges->nelts == 0) + { + /* No valid information for an header */ + return SVN_NO_ERROR; } + + notify_abspath = child->abspath; + n_range = APR_ARRAY_IDX(child->remaining_ranges, 0, svn_merge_range_t *); } - else if (merge_b->current_range && merge_b->merge_source.ancestral) - notify->merge_range = svn_merge_range_dup(merge_b->current_range, - scratch_pool); + else if (merge_b->merge_source.ancestral) + { + merge_b->notified_merge_begin = TRUE; + + if (merge_b->current_range) + n_range = svn_merge_range_dup(merge_b->current_range, scratch_pool); + } + + notify = svn_wc_create_notify(notify_abspath, + merge_b->same_repos + ? svn_wc_notify_merge_begin + : svn_wc_notify_foreign_merge_begin, + scratch_pool); + notify->merge_range = n_range; (*merge_b->ctx->notify_func2)(merge_b->ctx->notify_baton2, notify, scratch_pool);