Return-Path: X-Original-To: apmail-subversion-dev-archive@minotaur.apache.org Delivered-To: apmail-subversion-dev-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 1556518D1C for ; Mon, 15 Feb 2016 22:45:31 +0000 (UTC) Received: (qmail 22888 invoked by uid 500); 15 Feb 2016 22:45:30 -0000 Delivered-To: apmail-subversion-dev-archive@subversion.apache.org Received: (qmail 22826 invoked by uid 500); 15 Feb 2016 22:45:30 -0000 Mailing-List: contact dev-help@subversion.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Delivered-To: mailing list dev@subversion.apache.org Received: (qmail 22816 invoked by uid 99); 15 Feb 2016 22:45:30 -0000 Received: from Unknown (HELO spamd4-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 15 Feb 2016 22:45:30 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd4-us-west.apache.org (ASF Mail Server at spamd4-us-west.apache.org) with ESMTP id 2DA6AC0D1B for ; Mon, 15 Feb 2016 22:45:30 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd4-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: 1.179 X-Spam-Level: * X-Spam-Status: No, score=1.179 tagged_above=-999 required=6.31 tests=[DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HTML_MESSAGE=2, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_PASS=-0.001] autolearn=disabled Authentication-Results: spamd4-us-west.apache.org (amavisd-new); dkim=pass (1024-bit key) header.d=qqmail.nl Received: from mx2-lw-us.apache.org ([10.40.0.8]) by localhost (spamd4-us-west.apache.org [10.40.0.11]) (amavisd-new, port 10024) with ESMTP id Dy2GXAACdoam for ; Mon, 15 Feb 2016 22:45:27 +0000 (UTC) Received: from mail-wm0-f51.google.com (mail-wm0-f51.google.com [74.125.82.51]) by mx2-lw-us.apache.org (ASF Mail Server at mx2-lw-us.apache.org) with ESMTPS id D0AC45FAF9 for ; Mon, 15 Feb 2016 22:45:26 +0000 (UTC) Received: by mail-wm0-f51.google.com with SMTP id b205so85852416wmb.1 for ; Mon, 15 Feb 2016 14:45:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qqmail.nl; s=google; h=message-id:mime-version:to:from:subject:date:importance:in-reply-to :references:content-type; bh=/r2sjLBLVJg9ecb2MLvt3eM3S8aJEI+gkFQ7usbwY6c=; b=ZwUpJuu9sDWit26dBw4HhwRD/8CEj2ZTlQ6rhoxBCM+jXxY9nRSngAoZqY/geYIMo2 j5C1iQ7Ty44EPmAbcb3ifI/WSexGinABMn2cxe+qtXSbxpQVGLF6m3V0hFHb9Fxxur+L 1LODEouRJlrYO6yOVCM3C70awQcDM0zKIDfso= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:message-id:mime-version:to:from:subject:date :importance:in-reply-to:references:content-type; bh=/r2sjLBLVJg9ecb2MLvt3eM3S8aJEI+gkFQ7usbwY6c=; b=PHnOae1XftUxA4ngx211ubCa/pL/4YMWZm5QUg3aTJBfRW58BNxBqc3d+BPlQk14Pn yG41Ppdkjg218+Gmfh0SYybGGvxECRGjNAxfHQK4M1y/OvIZeh3XrdJN+dGN5JH9dyn0 c8wlFZ3EvuTLnxY9+YkUtUsoy83qhGj8O1k4dLCeWqoF6Y/V+8bLDp5x/pQTv5hukEAg azFte8gS84xa3kvuCRA5nRH78IOnxtDLbs4hIzfm7hDOv6MNRCO4r7YRSDyCSXvl/5A1 TeiYsdm7mkgKWFPD2R8qvG39/5ho20LfUALKLuUfKr/Z5XfTYGOLHrTFnumlWoEpgwkp ++Wg== X-Gm-Message-State: AG10YOTlBzkP4rpCU20FtIEh9qyMh5p7gi3tthqAyl0zKYm+sc6+wIdfazp9tOb2HkUgVA== X-Received: by 10.194.60.20 with SMTP id d20mr21205811wjr.109.1455576325455; Mon, 15 Feb 2016 14:45:25 -0800 (PST) Received: from ?IPv6:2001:610:66e:0:c233:5eff:fe29:3cff? ([2001:610:66e:0:c233:5eff:fe29:3cff]) by smtp.gmail.com with ESMTPSA id v22sm17671877wmv.12.2016.02.15.14.45.23 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 15 Feb 2016 14:45:24 -0800 (PST) Message-ID: <56c25504.162f1c0a.fb12d.2cc3@mx.google.com> MIME-Version: 1.0 To: "stefan2@apache.org" , "dev@subversion.apache.org" From: Bert Huijben Subject: RE: svn commit: r1730617 -/subversion/trunk/subversion/libsvn_repos/log.c Date: Mon, 15 Feb 2016 23:45:24 +0100 Importance: normal X-Priority: 3 In-Reply-To: <20160215214700.9EC693A07CD@svn01-us-west.apache.org> References: <20160215214700.9EC693A07CD@svn01-us-west.apache.org> Content-Type: multipart/alternative; boundary="_9FEC00D9-9D0D-40E5-B3E9-56BBD9CF13FD_" --_9FEC00D9-9D0D-40E5-B3E9-56BBD9CF13FD_ Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Are you sure the pool arguments are in the right order here? The usual order is result_pool, scratch_pool while most of the calls here a= ppear to use the opposite order. Bert Sent from Mail for Windows 10 From: stefan2@apache.org Sent: maandag 15 februari 2016 22:47 To: commits@subversion.apache.org Subject: svn commit: r1730617 -/subversion/trunk/subversion/libsvn_repos/lo= g.c Author: stefan2 Date: Mon Feb 15 21:47:00 2016 New Revision: 1730617 URL: http://svn.apache.org/viewvc?rev=3D1730617&view=3Drev Log: Continue work on the svn_repos_get_logs4 to svn_repos_get_logs5 migration: Switch the last svn_fs_paths_changed2 call to svn_fs_paths_changed3. * subversion/libsvn_repos/log.c (fs_mergeinfo_changed): No longer fetch the whole changes list. However, we need to iterate twice for best total performan= ce and we need to minimize FS iterator lifetimes. Modified: subversion/trunk/subversion/libsvn_repos/log.c Modified: subversion/trunk/subversion/libsvn_repos/log.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/= log.c?rev=3D1730617&r1=3D1730616&r2=3D1730617&view=3Ddiff =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D --- subversion/trunk/subversion/libsvn_repos/log.c (original) +++ subversion/trunk/subversion/libsvn_repos/log.c Mon Feb 15 21:47:00 2016 @@ -631,11 +631,11 @@ fs_mergeinfo_changed(svn_mergeinfo_catal apr_pool_t *scratch_pool) { svn_fs_root_t *root; - apr_pool_t *iterpool; - apr_hash_index_t *hi; + apr_pool_t *iterpool, *iterator_pool; + svn_fs_path_change_iterator_t *iterator; + svn_fs_path_change3_t *change; svn_boolean_t any_mergeinfo =3D FALSE; svn_boolean_t any_copy =3D FALSE; - apr_hash_t *changes; =20 /* Initialize return variables. */ *deleted_mergeinfo_catalog =3D svn_hash__make(result_pool); @@ -645,55 +645,69 @@ fs_mergeinfo_changed(svn_mergeinfo_catal if (rev =3D=3D 0) return SVN_NO_ERROR; =20 + /* FS iterators are potentially heavy objects. + * Hold them in a separate pool to clean them up asap. */ + iterator_pool =3D svn_pool_create(scratch_pool); + /* We're going to use the changed-paths information for REV to narrow down our search. */ SVN_ERR(svn_fs_revision_root(&root, fs, rev, scratch_pool)); - SVN_ERR(svn_fs_paths_changed2(&changes, root, scratch_pool)); + SVN_ERR(svn_fs_paths_changed3(&iterator, root, iterator_pool, + scratch_pool)); + SVN_ERR(svn_fs_path_change_get(&change, iterator)); =20 /* Look for copies and (potential) mergeinfo changes. - We will use both flags to take shortcuts further down the road. */ - for (hi =3D apr_hash_first(scratch_pool, changes); - hi; - hi =3D apr_hash_next(hi)) - { - svn_fs_path_change2_t *change =3D apr_hash_this_val(hi); + We will use both flags to take shortcuts further down the road. =20 + The critical information here is whether there are any copies + because that greatly influences the costs for log processing. + So, it is faster to iterate over the changes twice - in the worst + case b/c most times there is no m/i at all and we exit out early + without any overhead.=20 + */ + while (change && (!any_mergeinfo || !any_copy)) + { /* If there was a prop change and we are not positive that _no_ mergeinfo change happened, we must assume that it might have. */ if (change->mergeinfo_mod !=3D svn_tristate_false && change->prop_mo= d) any_mergeinfo =3D TRUE; =20 - switch (change->change_kind) - { - case svn_fs_path_change_add: - case svn_fs_path_change_replace: - any_copy =3D TRUE; - break; + if ( (change->change_kind =3D=3D svn_fs_path_change_add) + || (change->change_kind =3D=3D svn_fs_path_change_replace)) + any_copy =3D TRUE; =20 - default: - break; - } + SVN_ERR(svn_fs_path_change_get(&change, iterator)); } =20 /* No potential mergeinfo changes? We're done. */ if (! any_mergeinfo) - return SVN_NO_ERROR; + { + svn_pool_destroy(iterator_pool); + return SVN_NO_ERROR; + } + + /* There is or may be some m/i change. Look closely now. */ + svn_pool_clear(iterator_pool); + SVN_ERR(svn_fs_paths_changed3(&iterator, root, iterator_pool, + scratch_pool)); =20 /* Loop over changes, looking for anything that might carry an svn:mergeinfo change and is one of our paths of interest, or a child or [grand]parent directory thereof. */ iterpool =3D svn_pool_create(scratch_pool); - for (hi =3D apr_hash_first(scratch_pool, changes); - hi; - hi =3D apr_hash_next(hi)) + while (TRUE) { const char *changed_path; - svn_fs_path_change2_t *change =3D apr_hash_this_val(hi); const char *base_path =3D NULL; svn_revnum_t base_rev =3D SVN_INVALID_REVNUM; svn_fs_root_t *base_root =3D NULL; svn_string_t *prev_mergeinfo_value =3D NULL, *mergeinfo_value; =20 + /* Next change. */ + SVN_ERR(svn_fs_path_change_get(&change, iterator)); + if (!change) + break; + /* Cheap pre-checks that don't require memory allocation etc. */ =20 /* No mergeinfo change? -> nothing to do here. */ @@ -705,7 +719,7 @@ fs_mergeinfo_changed(svn_mergeinfo_catal continue; =20 /* Begin actual processing */ - changed_path =3D apr_hash_this_key(hi); + changed_path =3D change->path.data; svn_pool_clear(iterpool); =20 switch (change->change_kind) @@ -863,6 +877,8 @@ fs_mergeinfo_changed(svn_mergeinfo_catal } =20 svn_pool_destroy(iterpool); + svn_pool_destroy(iterator_pool); + return SVN_NO_ERROR; } =20 --_9FEC00D9-9D0D-40E5-B3E9-56BBD9CF13FD_ Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset="utf-8"

Are you sure the po= ol arguments are in the right order here?

 

The usual order is result_pool, scratch_pool while mos= t of the calls here appear to use the opposite order.

=

 

Bert

 

Sent from Mail for Windows 10

 

=

From: stefan2@apache.org
Sent: maand= ag 15 februari 2016 22:47
To: commits@subversion.apache.org
Subject: svn comm= it: r1730617 -/subversion/trunk/subversion/libsvn_repos/log.c

 

Author: stefan2=

Date: Mon Feb 15 21:47:00 2016

New Revision: 1730617

 

URL: http://svn.apache.org/viewvc?rev=3D1730617&view= =3Drev

Log:

Continue work o= n the svn_repos_get_logs4 to svn_repos_get_logs5 migration:

Switch the last svn_fs_paths_changed2 call to svn_fs_paths_changed= 3.

 

* subv= ersion/libsvn_repos/log.c

=C2=A0 (fs_mergeinfo_chan= ged): No longer fetch the whole changes list.=C2=A0 However,

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 we need to iterate twice for best total performance

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 and we need to minimize FS iterator lifetimes.

 

Modified:

=C2=A0=C2=A0=C2=A0 subversion/trunk/subversion/libsvn_repos/l= og.c

 

Modi= fied: subversion/trunk/subversion/libsvn_repos/log.c

URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repo= s/log.c?rev=3D1730617&r1=3D1730616&r2=3D1730617&view=3Ddiff

=

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

--- subversion/trunk= /subversion/libsvn_repos/log.c (original)

+++ subve= rsion/trunk/subversion/libsvn_repos/log.c Mon Feb 15 21:47:00 2016

@@ -631,11 +631,11 @@ fs_mergeinfo_changed(svn_mergeinfo_ca= tal

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 apr_pool_t *scratch_pool)

{

=C2=A0=C2=A0 svn_fs_root_t *root;

-=C2=A0 = apr_pool_t *iterpool;

-=C2=A0 apr_hash_index_t *hi;=

+=C2=A0 apr_pool_t *iterpool, *iterator_pool;

<= p class=3DMsoNormal>+=C2=A0 svn_fs_path_change_iterator_t *iterator;

+=C2=A0 svn_fs_path_change3_t *change;

=C2=A0=C2=A0 svn_boolean_t any_mergeinfo =3D FALSE;

=C2=A0=C2=A0 svn_boolean_t any_copy =3D FALSE;

-=C2=A0 apr_hash_t *changes;

=C2=A0=C2=A0=C2=A0/* Initialize return variables. */

=C2=A0=C2=A0 *deleted_mergeinfo_catalog =3D svn_hash__make(result_= pool);

@@ -645,55 +645,69 @@ fs_mergeinfo_changed(s= vn_mergeinfo_catal

=C2=A0=C2=A0 if (rev =3D=3D 0)

=C2=A0=C2=A0=C2=A0=C2=A0 return SVN_NO_ERROR;

+=C2=A0 /* FS iterators are pot= entially heavy objects.

+=C2=A0=C2=A0 * Hold them i= n a separate pool to clean them up asap. */

+=C2=A0= iterator_pool =3D svn_pool_create(scratch_pool);

+=

=C2=A0=C2=A0 /* We're going to use the changed-pat= hs information for REV to

=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 narrow down our search. */

=C2=A0=C2=A0 SVN_= ERR(svn_fs_revision_root(&root, fs, rev, scratch_pool));

-=C2=A0 SVN_ERR(svn_fs_paths_changed2(&changes, root, scratch= _pool));

+=C2=A0 SVN_ERR(svn_fs_paths_changed3(&= ;iterator, root, iterator_pool,

+=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 scratch_pool));

+=C2=A0 SVN_ERR(= svn_fs_path_change_get(&change, iterator));

=C2=A0=C2=A0=C2=A0/* Look for copies and (potential)= mergeinfo changes.

-=C2=A0=C2=A0=C2=A0=C2=A0 We wi= ll use both flags to take shortcuts further down the road. */

-=C2=A0 for (hi =3D apr_hash_first(scratch_pool, changes);

=

-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 hi;

-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 hi =3D apr_hash_next(hi)= )

-=C2=A0=C2=A0=C2=A0 {

-= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 svn_fs_path_change2_t *change =3D apr_hash_t= his_val(hi);

+=C2=A0=C2=A0=C2=A0=C2=A0 We will use = both flags to take shortcuts further down the road.

+=C2=A0=C2=A0=C2=A0=C2=A0 The critical informati= on here is whether there are any copies

+=C2=A0=C2= =A0=C2=A0=C2=A0 because that greatly influences the costs for log processin= g.

+=C2=A0=C2=A0=C2=A0=C2=A0 So, it is faster to it= erate over the changes twice - in the worst

+=C2=A0= =C2=A0=C2=A0=C2=A0 case b/c most times there is no m/i at all and we exit o= ut early

+=C2=A0=C2=A0=C2=A0=C2=A0 without any over= head.

+=C2=A0=C2=A0 */

+= =C2=A0 while (change && (!any_mergeinfo || !any_copy))

+=C2=A0=C2=A0=C2=A0 {

=C2=A0=C2=A0=C2= =A0=C2=A0 =C2=A0=C2=A0/* If there was a prop change and we are not positive= that _no_

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0 mergeinfo change happened, we must assume that it might hav= e. */

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (chan= ge->mergeinfo_mod !=3D svn_tristate_false && change->prop_mod= )

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 = any_mergeinfo =3D TRUE;

-= =C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0switch (change->change_kind)

-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 {

-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 case svn_fs_path_change= _add:

-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 c= ase svn_fs_path_change_replace:

-=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 any_copy =3D TRUE;

-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 break;

+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if (=C2=A0=C2=A0 (change-&= gt;change_kind =3D=3D svn_fs_path_change_add)

+=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 || (change->change_k= ind =3D=3D svn_fs_path_change_replace))

+=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 any_copy =3D TRUE;

-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 def= ault:

-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 break;

-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 }

+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 SVN_= ERR(svn_fs_path_change_get(&change, iterator));

=C2=A0=C2=A0=C2=A0=C2=A0 }

=C2=A0=C2=A0=C2=A0/* No potential mergeinfo changes?=C2=A0 We're done. *= /

=C2=A0=C2=A0 if (! any_mergeinfo)

-=C2=A0=C2=A0=C2=A0 return SVN_NO_ERROR;

+= =C2=A0=C2=A0=C2=A0 {

+=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 svn_pool_destroy(iterator_pool);

+=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 return SVN_NO_ERROR;

+=C2=A0=C2= =A0=C2=A0 }

+

+=C2=A0 /* Th= ere is or may be some m/i change. Look closely now. */

+=C2=A0 svn_pool_clear(iterator_pool);

+=C2=A0 = SVN_ERR(svn_fs_paths_changed3(&iterator, root, iterator_pool,

+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 scratch_pool));

<= p class=3DMsoNormal>

=C2=A0=C2=A0=C2=A0/* Loop ove= r changes, looking for anything that might carry an

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 svn:mergeinfo change and is one of our path= s of interest, or a

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 = child or [grand]parent directory thereof. */

=C2=A0= =C2=A0 iterpool =3D svn_pool_create(scratch_pool);

= -=C2=A0 for (hi =3D apr_hash_first(scratch_pool, changes);

-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 hi;

-= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 hi =3D apr_hash_next(hi))

+=C2=A0 while (TRUE)

=C2=A0=C2=A0=C2= =A0=C2=A0 {

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 co= nst char *changed_path;

-=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 svn_fs_path_change2_t *change =3D apr_hash_this_val(hi);

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 const char *base_path =3D= NULL;

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 svn_rev= num_t base_rev =3D SVN_INVALID_REVNUM;

=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 svn_fs_root_t *base_root =3D NULL;

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 svn_string_t *prev_mergeinfo_= value =3D NULL, *mergeinfo_value;

+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 /* Next change. */

+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 SVN_ERR(svn_fs_path_change_get(&am= p;change, iterator));

+=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0 if (!change)

+=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 break;

+

=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 /* Cheap pre-checks that don't require memor= y allocation etc. */

=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* No mergeinfo change? -> nothin= g to do here. */

@@ -705,7 +719,7 @@ fs_mergeinfo_c= hanged(svn_mergeinfo_catal

=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 continue;

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Begin actual process= ing */

-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 changed_path= =3D apr_hash_this_key(hi);

+=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 changed_path =3D change->path.data;

= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 svn_pool_clear(iterpool);

=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0switch (change->change_kind)

@@ -863,6 +87= 7,8 @@ fs_mergeinfo_changed(svn_mergeinfo_catal

=C2= =A0=C2=A0=C2=A0=C2=A0 }

= =C2=A0=C2=A0=C2=A0svn_pool_destroy(iterpool);

+=C2= =A0 svn_pool_destroy(iterator_pool);

+

=C2=A0=C2=A0 return SVN_NO_ERROR;

}

 

 

 =

= --_9FEC00D9-9D0D-40E5-B3E9-56BBD9CF13FD_--