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 741DA10DE7 for ; Tue, 21 Jan 2014 03:06:33 +0000 (UTC) Received: (qmail 88329 invoked by uid 500); 21 Jan 2014 03:06:33 -0000 Delivered-To: apmail-subversion-commits-archive@subversion.apache.org Received: (qmail 88220 invoked by uid 500); 21 Jan 2014 03:06:31 -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 88206 invoked by uid 99); 21 Jan 2014 03:06:28 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 21 Jan 2014 03:06:28 +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; Tue, 21 Jan 2014 03:06:23 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 459262388993; Tue, 21 Jan 2014 03:06:01 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1559912 - in /subversion/trunk/subversion: include/ libsvn_fs_fs/ libsvn_fs_util/ libsvn_repos/ Date: Tue, 21 Jan 2014 03:06:00 -0000 To: commits@subversion.apache.org From: stefan2@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20140121030601.459262388993@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: stefan2 Date: Tue Jan 21 03:06:00 2014 New Revision: 1559912 URL: http://svn.apache.org/r1559912 Log: Speed up 'svn log -g' to almost the same speed as 'svn log'. Also, provide a basis for speeding up other mergeinfo detection based code. The problem is that svn_fs_path_change2_t used to report mergeinfo changes as simple prop changes. Since most files are being created with default props attached to them, this creates a lot of unnecessary property read and comparison operations. The idea is to a derive a mergeinfo-mod flag from the FS propset function and store that in FSFS f7+ repositories (FSX will follow later). An extended svn_fs_path_change2_t makes the information visible to the user. * subversion/include/svn_fs.h (svn_fs_path_change2_t): Add mergeinfo-mod as a tristate since we don't have that information in old repositories. * subversion/libsvn_fs_util/fs-util.c (svn_fs__path_change_create_internal): Make sure the new member is always initialized properly. * subversion/libsvn_repos/log.c (fs_mergeinfo_changed): Use the new information to skip unnecessary node prop processing. * subversion/libsvn_fs_fs/structure (): Extend documentation to cover the new flag as well. * subversion/libsvn_fs_fs/fs.h (SVN_FS_FS__MIN_MERGEINFO_IN_CHANGES_FORMAT): New format capability flag. * subversion/libsvn_fs_fs/low_level.c (read_change): Detect the presense of the mergeinfo-mod flag and parse it if found. (write_change_entry): Write the mergeinfo-mod flag dependent on whether its value is known and the new INCLUDE_MERGEINFO_MODS parameter has been set. (svn_fs_fs__write_changes): Include mergeinfo-mod only if supported by the current FS format. * subversion/libsvn_fs_fs/transaction.h (svn_fs_fs__add_change): Add mergeinfo-mod parameter. * subversion/libsvn_fs_fs/transaction.c (replace_change): Copy mergeinfo-mod info as well. (fold_change): Combine mergeinfo-mod info as well. (svn_fs_fs__add_change): Store mergeinfo-mod info as well. * subversion/libsvn_fs_fs/tree.c (add_change): Add mergeinfo-mod pass-through parameter. (fs_change_node_prop): Determine whether merge info was touched. (fs_make_dir, fs_delete_node, copy_helper, fs_make_file, apply_textdelta, apply_text): These never modify mergeinfo. Modified: subversion/trunk/subversion/include/svn_fs.h subversion/trunk/subversion/libsvn_fs_fs/fs.h subversion/trunk/subversion/libsvn_fs_fs/low_level.c subversion/trunk/subversion/libsvn_fs_fs/structure subversion/trunk/subversion/libsvn_fs_fs/transaction.c subversion/trunk/subversion/libsvn_fs_fs/transaction.h subversion/trunk/subversion/libsvn_fs_fs/tree.c subversion/trunk/subversion/libsvn_fs_util/fs-util.c subversion/trunk/subversion/libsvn_repos/log.c Modified: subversion/trunk/subversion/include/svn_fs.h URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_fs.h?rev=1559912&r1=1559911&r2=1559912&view=diff ============================================================================== --- subversion/trunk/subversion/include/svn_fs.h (original) +++ subversion/trunk/subversion/include/svn_fs.h Tue Jan 21 03:06:00 2014 @@ -1378,6 +1378,9 @@ typedef struct svn_fs_path_change2_t svn_revnum_t copyfrom_rev; const char *copyfrom_path; + /** were there mergeinfo mods? + * (Note: Pre-1.9 repositories will report #svn_tristate_unknown.) */ + svn_tristate_t mergeinfo_mod; /* NOTE! Please update svn_fs_path_change2_create() when adding new fields here. */ } svn_fs_path_change2_t; Modified: subversion/trunk/subversion/libsvn_fs_fs/fs.h URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/fs.h?rev=1559912&r1=1559911&r2=1559912&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_fs_fs/fs.h (original) +++ subversion/trunk/subversion/libsvn_fs_fs/fs.h Tue Jan 21 03:06:00 2014 @@ -170,6 +170,9 @@ extern "C" { /* The minimum format number that supports packed revprops. */ #define SVN_FS_FS__MIN_LOG_ADDRESSING_FORMAT 7 +/* Minimum format number that stores mergeinfo-mode flag in changed paths */ +#define SVN_FS_FS__MIN_MERGEINFO_IN_CHANGES_FORMAT 7 + /* Minimum format number that will record moves */ #define SVN_FS_FS__MIN_MOVE_SUPPORT_FORMAT 7 Modified: subversion/trunk/subversion/libsvn_fs_fs/low_level.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/low_level.c?rev=1559912&r1=1559911&r2=1559912&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_fs_fs/low_level.c (original) +++ subversion/trunk/subversion/libsvn_fs_fs/low_level.c Tue Jan 21 03:06:00 2014 @@ -297,6 +297,30 @@ read_change(change_t **change_p, _("Invalid prop-mod flag in rev-file")); } + /* Get the mergeinfo-mod flag if given. Otherwise, the next thing + is the path starting with a slash. */ + if (*last_str != '/') + { + str = svn_cstring_tokenize(" ", &last_str); + if (str == NULL) + return svn_error_create(SVN_ERR_FS_CORRUPT, NULL, + _("Invalid changes line in rev-file")); + + if (strcmp(str, FLAG_TRUE) == 0) + { + info->mergeinfo_mod = svn_tristate_true; + } + else if (strcmp(str, FLAG_FALSE) == 0) + { + info->mergeinfo_mod = svn_tristate_false; + } + else + { + return svn_error_create(SVN_ERR_FS_CORRUPT, NULL, + _("Invalid mergeinfo-mod flag in rev-file")); + } + } + /* Get the changed path. */ change->path.len = strlen(last_str); change->path.data = apr_pstrmemdup(pool, last_str, change->path.len); @@ -353,18 +377,21 @@ svn_fs_fs__read_changes(apr_array_header /* Write a single change entry, path PATH, change CHANGE, and copyfrom string COPYFROM, into the file specified by FILE. Only include the - node kind field if INCLUDE_NODE_KIND is true. All temporary + node kind field if INCLUDE_NODE_KIND is true. Only include the + mergeinfo-mod field if INCLUDE_MERGEINFO_MODS is true. All temporary allocations are in POOL. */ static svn_error_t * write_change_entry(svn_stream_t *stream, const char *path, svn_fs_path_change2_t *change, svn_boolean_t include_node_kind, + svn_boolean_t include_mergeinfo_mods, apr_pool_t *pool) { const char *idstr; const char *change_string = NULL; const char *kind_string = ""; + const char *mergeinfo_string = ""; svn_stringbuf_t *buf; apr_size_t len; @@ -411,10 +438,18 @@ write_change_entry(svn_stream_t *stream, ? SVN_FS_FS__KIND_DIR : SVN_FS_FS__KIND_FILE); } - buf = svn_stringbuf_createf(pool, "%s %s%s %s %s %s\n", + + if (include_mergeinfo_mods && change->mergeinfo_mod != svn_tristate_unknown) + mergeinfo_string = apr_psprintf(pool, " %s", + change->mergeinfo_mod == svn_tristate_true + ? FLAG_TRUE + : FLAG_FALSE); + + buf = svn_stringbuf_createf(pool, "%s %s%s %s %s%s %s\n", idstr, change_string, kind_string, change->text_mod ? FLAG_TRUE : FLAG_FALSE, change->prop_mod ? FLAG_TRUE : FLAG_FALSE, + mergeinfo_string, path); if (SVN_IS_VALID_REVNUM(change->copyfrom_rev)) @@ -442,6 +477,8 @@ svn_fs_fs__write_changes(svn_stream_t *s fs_fs_data_t *ffd = fs->fsap_data; svn_boolean_t include_node_kinds = ffd->format >= SVN_FS_FS__MIN_KIND_IN_CHANGED_FORMAT; + svn_boolean_t include_mergeinfo_mods = + ffd->format >= SVN_FS_FS__MIN_MERGEINFO_IN_CHANGES_FORMAT; apr_array_header_t *sorted_changed_paths; int i; @@ -464,7 +501,7 @@ svn_fs_fs__write_changes(svn_stream_t *s /* Write out the new entry into the final rev-file. */ SVN_ERR(write_change_entry(stream, path, change, include_node_kinds, - iterpool)); + include_mergeinfo_mods, iterpool)); } if (terminate_list) Modified: subversion/trunk/subversion/libsvn_fs_fs/structure URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/structure?rev=1559912&r1=1559911&r2=1559912&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_fs_fs/structure (original) +++ subversion/trunk/subversion/libsvn_fs_fs/structure Tue Jan 21 03:06:00 2014 @@ -180,6 +180,7 @@ Mergeinfo metadata: Revision changed paths list: Format 1-3: Does not contain the node's kind. Format 4+: Contains the node's kind. + Format 7+: Contains the mergeinfo-mod flag. Shard packing: Format 4: Applied to revision data only. @@ -574,20 +575,23 @@ its location is not yet known. The changed-path data is represented as a series of changed-path items, each consisting of two lines. The first line has the format -" \n", where is the -node-rev ID of the new node-rev, is "add", "delete", -"replace", or "modify", and are "true" or -"false" indicating whether the text and/or properties changed, and - is the changed pathname. For deletes, is the node-rev ID -of the deleted node-rev, and and are always -"false". The second line has the format " \n" containing -the node-rev's copyfrom information if it has any; if it does not, the -second line is blank. +" \n", +where is the node-rev ID of the new node-rev, is "add", +"delete", "replace", or "modify", , , and + are "true" or "false" indicating whether the text, +properties and/or mergeinfo changed, and is the changed pathname. +For deletes, is the node-rev ID of the deleted node-rev, and + and are always "false". The second line has the +format " \n" containing the node-rev's copyfrom information +if it has any; if it does not, the second line is blank. Starting with FS format 4, may contain the kind ("file" or "dir") of the node, after a hyphen; for example, an added directory may be represented as "add-dir". +Before with FS format 7, flag is not available. It may +also be missing in revisions upgraded from pre-f7 formats. + In physical addressing mode, at the very end of a rev file is a pair of lines containing "\n \n", where is the offset of the root directory node revision and is the Modified: subversion/trunk/subversion/libsvn_fs_fs/transaction.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/transaction.c?rev=1559912&r1=1559911&r2=1559912&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_fs_fs/transaction.c (original) +++ subversion/trunk/subversion/libsvn_fs_fs/transaction.c Tue Jan 21 03:06:00 2014 @@ -621,6 +621,7 @@ replace_change(svn_fs_path_change2_t *ol pool); old_change->text_mod = new_change->text_mod; old_change->prop_mod = new_change->prop_mod; + old_change->mergeinfo_mod = new_change->mergeinfo_mod; if (new_change->copyfrom_rev == SVN_INVALID_REVNUM) { old_change->copyfrom_rev = SVN_INVALID_REVNUM; @@ -716,6 +717,7 @@ fold_change(apr_hash_t *changes, old_change->change_kind = svn_fs_path_change_delete; old_change->text_mod = info->text_mod; old_change->prop_mod = info->prop_mod; + old_change->mergeinfo_mod = info->mergeinfo_mod; old_change->copyfrom_rev = SVN_INVALID_REVNUM; old_change->copyfrom_path = NULL; } @@ -743,6 +745,8 @@ fold_change(apr_hash_t *changes, old_change->text_mod = TRUE; if (info->prop_mod) old_change->prop_mod = TRUE; + if (info->mergeinfo_mod == svn_tristate_true) + old_change->mergeinfo_mod = svn_tristate_true; break; } @@ -1570,6 +1574,7 @@ svn_fs_fs__add_change(svn_fs_t *fs, svn_fs_path_change_kind_t change_kind, svn_boolean_t text_mod, svn_boolean_t prop_mod, + svn_boolean_t mergeinfo_mod, svn_node_kind_t node_kind, svn_revnum_t copyfrom_rev, const char *copyfrom_path, @@ -1587,6 +1592,9 @@ svn_fs_fs__add_change(svn_fs_t *fs, change = svn_fs__path_change_create_internal(id, change_kind, pool); change->text_mod = text_mod; change->prop_mod = prop_mod; + change->mergeinfo_mod = mergeinfo_mod + ? svn_tristate_true + : svn_tristate_false; change->node_kind = node_kind; change->copyfrom_rev = copyfrom_rev; change->copyfrom_path = apr_pstrdup(pool, copyfrom_path); Modified: subversion/trunk/subversion/libsvn_fs_fs/transaction.h URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/transaction.h?rev=1559912&r1=1559911&r2=1559912&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_fs_fs/transaction.h (original) +++ subversion/trunk/subversion/libsvn_fs_fs/transaction.h Tue Jan 21 03:06:00 2014 @@ -138,12 +138,12 @@ svn_fs_fs__set_entry(svn_fs_t *fs, /* Add a change to the changes record for filesystem FS in transaction TXN_ID. Mark path PATH, having node-id ID, as changed according to - the type in CHANGE_KIND. If the text representation was changed - set TEXT_MOD to TRUE, and likewise for PROP_MOD. If this change - was the result of a copy, set COPYFROM_REV and COPYFROM_PATH to the - revision and path of the copy source, otherwise they should be set - to SVN_INVALID_REVNUM and NULL. Perform any temporary allocations - from POOL. */ + the type in CHANGE_KIND. If the text representation was changed set + TEXT_MOD to TRUE, and likewise for PROP_MOD as well as MERGEINFO_MOD. + If this change was the result of a copy, set COPYFROM_REV and + COPYFROM_PATH to the revision and path of the copy source, otherwise + they should be set to SVN_INVALID_REVNUM and NULL. Perform any + temporary allocations from POOL. */ svn_error_t * svn_fs_fs__add_change(svn_fs_t *fs, const svn_fs_fs__id_part_t *txn_id, @@ -152,6 +152,7 @@ svn_fs_fs__add_change(svn_fs_t *fs, svn_fs_path_change_kind_t change_kind, svn_boolean_t text_mod, svn_boolean_t prop_mod, + svn_boolean_t mergeinfo_mod, svn_node_kind_t node_kind, svn_revnum_t copyfrom_rev, const char *copyfrom_path, Modified: subversion/trunk/subversion/libsvn_fs_fs/tree.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_fs/tree.c?rev=1559912&r1=1559911&r2=1559912&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_fs_fs/tree.c (original) +++ subversion/trunk/subversion/libsvn_fs_fs/tree.c Tue Jan 21 03:06:00 2014 @@ -1275,11 +1275,11 @@ get_dag(dag_node_t **dag_node_p, /* Add a change to the changes table in FS, keyed on transaction id TXN_ID, and indicated that a change of kind CHANGE_KIND occurred on PATH (whose node revision id is--or was, in the case of a - deletion--NODEREV_ID), and optionally that TEXT_MODs or PROP_MODs - occurred. If the change resulted from a copy, COPYFROM_REV and - COPYFROM_PATH specify under which revision and path the node was - copied from. If this was not part of a copy, COPYFROM_REV should - be SVN_INVALID_REVNUM. Do all this as part of POOL. */ + deletion--NODEREV_ID), and optionally that TEXT_MODs, PROP_MODs or + MERGEINFO_MODs occurred. If the change resulted from a copy, + COPYFROM_REV and COPYFROM_PATH specify under which revision and path + the node was copied from. If this was not part of a copy, COPYFROM_REV + should be SVN_INVALID_REVNUM. Do all this as part of POOL. */ static svn_error_t * add_change(svn_fs_t *fs, const svn_fs_fs__id_part_t *txn_id, @@ -1288,6 +1288,7 @@ add_change(svn_fs_t *fs, svn_fs_path_change_kind_t change_kind, svn_boolean_t text_mod, svn_boolean_t prop_mod, + svn_boolean_t mergeinfo_mod, svn_node_kind_t node_kind, svn_revnum_t copyfrom_rev, const char *copyfrom_path, @@ -1295,7 +1296,8 @@ add_change(svn_fs_t *fs, { return svn_fs_fs__add_change(fs, txn_id, svn_fs__canonicalize_abspath(path, pool), - noderev_id, change_kind, text_mod, prop_mod, + noderev_id, change_kind, + text_mod, prop_mod, mergeinfo_mod, node_kind, copyfrom_rev, copyfrom_path, pool); } @@ -1542,6 +1544,7 @@ fs_change_node_prop(svn_fs_root_t *root, parent_path_t *parent_path; apr_hash_t *proplist; const svn_fs_fs__id_part_t *txn_id; + svn_boolean_t modeinfo_mod = FALSE; if (! root->is_txn_root) return SVN_FS__NOT_TXN(root); @@ -1585,6 +1588,8 @@ fs_change_node_prop(svn_fs_root_t *root, SVN_ERR(svn_fs_fs__dag_set_has_mergeinfo(parent_path->node, (value != NULL), pool)); } + + modeinfo_mod = TRUE; } /* Set the property. */ @@ -1597,7 +1602,7 @@ fs_change_node_prop(svn_fs_root_t *root, /* Make a record of this modification in the changes table. */ return add_change(root->fs, txn_id, path, svn_fs_fs__dag_get_id(parent_path->node), - svn_fs_path_change_modify, FALSE, TRUE, + svn_fs_path_change_modify, FALSE, TRUE, modeinfo_mod, svn_fs_fs__dag_node_kind(parent_path->node), SVN_INVALID_REVNUM, NULL, pool); } @@ -2441,8 +2446,8 @@ fs_make_dir(svn_fs_root_t *root, /* Make a record of this modification in the changes table. */ return add_change(root->fs, txn_id, path, svn_fs_fs__dag_get_id(sub_dir), - svn_fs_path_change_add, FALSE, FALSE, svn_node_dir, - SVN_INVALID_REVNUM, NULL, pool); + svn_fs_path_change_add, FALSE, FALSE, FALSE, + svn_node_dir, SVN_INVALID_REVNUM, NULL, pool); } @@ -2499,7 +2504,7 @@ fs_delete_node(svn_fs_root_t *root, /* Make a record of this modification in the changes table. */ return add_change(root->fs, txn_id, path, svn_fs_fs__dag_get_id(parent_path->node), - svn_fs_path_change_delete, FALSE, FALSE, kind, + svn_fs_path_change_delete, FALSE, FALSE, FALSE, kind, SVN_INVALID_REVNUM, NULL, pool); } @@ -2748,8 +2753,8 @@ copy_helper(svn_fs_root_t *from_root, /* Make a record of this modification in the changes table. */ SVN_ERR(get_dag(&new_node, to_root, to_path, TRUE, pool)); SVN_ERR(add_change(to_root->fs, txn_id, to_path, - svn_fs_fs__dag_get_id(new_node), kind, FALSE, FALSE, - svn_fs_fs__dag_node_kind(from_node), + svn_fs_fs__dag_get_id(new_node), kind, FALSE, + FALSE, FALSE, svn_fs_fs__dag_node_kind(from_node), from_root->rev, from_canonpath, pool)); } else @@ -2904,8 +2909,8 @@ fs_make_file(svn_fs_root_t *root, /* Make a record of this modification in the changes table. */ return add_change(root->fs, txn_id, path, svn_fs_fs__dag_get_id(child), - svn_fs_path_change_add, TRUE, FALSE, svn_node_file, - SVN_INVALID_REVNUM, NULL, pool); + svn_fs_path_change_add, TRUE, FALSE, FALSE, + svn_node_file, SVN_INVALID_REVNUM, NULL, pool); } @@ -3163,8 +3168,8 @@ apply_textdelta(void *baton, apr_pool_t /* Make a record of this modification in the changes table. */ return add_change(tb->root->fs, txn_id, tb->path, svn_fs_fs__dag_get_id(tb->node), - svn_fs_path_change_modify, TRUE, FALSE, svn_node_file, - SVN_INVALID_REVNUM, NULL, pool); + svn_fs_path_change_modify, TRUE, FALSE, FALSE, + svn_node_file, SVN_INVALID_REVNUM, NULL, pool); } @@ -3298,8 +3303,8 @@ apply_text(void *baton, apr_pool_t *pool /* Make a record of this modification in the changes table. */ return add_change(tb->root->fs, txn_id, tb->path, svn_fs_fs__dag_get_id(tb->node), - svn_fs_path_change_modify, TRUE, FALSE, svn_node_file, - SVN_INVALID_REVNUM, NULL, pool); + svn_fs_path_change_modify, TRUE, FALSE, FALSE, + svn_node_file, SVN_INVALID_REVNUM, NULL, pool); } Modified: subversion/trunk/subversion/libsvn_fs_util/fs-util.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_fs_util/fs-util.c?rev=1559912&r1=1559911&r2=1559912&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_fs_util/fs-util.c (original) +++ subversion/trunk/subversion/libsvn_fs_util/fs-util.c Tue Jan 21 03:06:00 2014 @@ -198,6 +198,7 @@ svn_fs__path_change_create_internal(cons change = apr_pcalloc(pool, sizeof(*change)); change->node_rev_id = node_rev_id; change->change_kind = change_kind; + change->mergeinfo_mod = svn_tristate_unknown; return change; } Modified: subversion/trunk/subversion/libsvn_repos/log.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/log.c?rev=1559912&r1=1559911&r2=1559912&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_repos/log.c (original) +++ subversion/trunk/subversion/libsvn_repos/log.c Tue Jan 21 03:06:00 2014 @@ -788,6 +788,10 @@ fs_mergeinfo_changed(svn_mergeinfo_catal changed_path = key; change = val; + /* If there was no mergeinfo change on this item, ignore it. */ + if (change->mergeinfo_mod == svn_tristate_false) + continue; + /* If there was no property change on this item, ignore it. */ if (! change->prop_mod) continue;