Checkout Tools
  • last updated 4 hours ago
Constraints
Constraints: committers
 
Constraints: files
Constraints: dates
Fix issue #4700 for property changes.

Coincidentally, this commit also fixes issue #4623 for FSFS.

If rep-sharing is disabled, switching from svn_fs_props_different()

to svn_fs_props_changed() fixes issue #4700 for properties, similar

to how r1813794 fixed it for file content.

However, if rep-sharing is enabled, svn_fs_props_changed() does not work

as advertised because properties do not carry a SHA1 checksum with a

"uniquifier" which identifies the transaction they were created in.

The uniquifier is used by svn_fs_props_changed() to tell apart property

representations which share content but were created in different revisions.

To fix that problem, make FSFS write SHA1 checksums along with uniquifiers

for file properties, just as it is already done for file content.

A source code comment indicates that SHA1 checksums for property reps

were not written due to concerns over disk space. In hindsight, this was

a bad trade-off because it affected correctness of svn_fs_props_changed().

* subversion/libsvn_fs_fs/transaction.c

(svn_fs_fs__set_proplist, write_final_rev): Create uniquifiers on prop reps.

* subversion/libsvn_repos/reporter.c

(update_entry): Use svn_fs_props_changed() instead of using

svn_fs_props_different(). The reasoning is the same as for the

file content fix committed in r1813794.

* basic_tests.py

(null_prop_update_last_changed_revision): This test now passes for FSFS.

It still fails for BDB, though.

* subversion/tests/cmdline/svnadmin_tests.py

(verify_non_utf8_paths): Update test expectations. This test messes about

with revision file data and thus needs an update to keep passing.

(dump_no_op_prop_change): This test now passes as well.

  1. … 3 more files in changeset.
Start fixing issue #4700: Null updates break last-changed-revision.

Patch by: stsp

me

* subversion/libsvn_repos/reporter.c

(update_entry): Use an API that considers not only the two endpoints

but also the intervening history.

* subversion/tests/cmdline/basic_tests.py

(null_update_last_changed_revision): Expect to pass.

  1. … 1 more file in changeset.
Fix a spurious 'incoming edit' tree conflict with an unmodified file.

If a file is added and then merged between branches but never actually

modified otherwise, the server would report two versions of this file as

changed, even though the only actual difference is a filesystem copy ID.

This resulted in open_file() and apply_textdelta() calls, with an empty

text delta, being sent to the client during a merge.

If the file was not present in the merge target working copy (i.e. deleted

in the target branch's history), the client would raise a spurious

'local missing vs incoming edit' tree conflict.

This conflict is spurious because the file was not actually edited.

The client assumes that an open_file() call by the server implies an edit

and uses this as a hint during tree conflict detection. So having the server

send no-op changes during a merge will result in unnecessary tree conflicts.

See the test case added in this commit for a reproduction recipe.

We can fix this problem by extending a check for 'relatedness' already

present in the server-side reporter: If two related files do not differ

in terms of properties or content, don't report a change to the client.

Previously, this logic only triggered for two files which represent

the exact same filesystem node ID (including the copy ID).

Note that this is a server-side fix. A client-side fix is probably harder

to implement in this case, but I'd be happy to be shown wrong on this.

* subversion/libsvn_repos/reporter.c

(update_entry): Do not report related files as changed if they don't

actually differ in terms of property or content changes.

* subversion/tests/cmdline/merge_tree_conflict_tests.py

(spurios_tree_conflict_with_added_file, test_list): New test.

  1. … 1 more file in changeset.
Inline private function used in one place and just calls existing FS API

function.

* subversion/libsvn_repos/delta.c

* subversion/libsvn_repos/repos.h

(svn_repos__compare_files): Remove.

* subversion/libsvn_repos/reporter.c

(delta_files): Just use svn_fs_contents_different().

  1. … 2 more files in changeset.
* subversion/libsvn_repos/reporter.c

(delta_files): Tighten scope of local variable. No functional changes.

* subversion/libsvn_repos/reporter.c

(delta_proplists): Reduce scope of several local variables.

* subversion/libsvn_repos/reporter.c

(delta_proplists): Reduce scope of local variable. No functional changes.

Following up on r1709388, undo the behavior change of the calling sites of

svn_fs_contents_different() and svn_fs_props_different() that is not required

nor justified in the context of fixing issue #4598, "No-op changes no longer

dumped by 'svnadmin dump' in 1.9".

This commit also restores the hack required for blame -g for old clients

(see r1686478, r1686888) in rev_hunt.c:send_path_revision(). Perhaps there

is a better replacement for it, since we now have the original behavior of

svn_fs_contents_changed() available, but this can be handled separately.

* subversion/libsvn_fs_fs/dag.c

(svn_fs_fs__dag_things_different): Tweak the related comment within this

function.

* subversion/libsvn_fs_fs/tree.c

(merge): Compare the property lists based on their contents.

* subversion/libsvn_repos/delta.c

(delta_proplists): Use svn_fs_props_different() when comparing property

lists.

(svn_repos__compare_files): Call svn_fs_contents_different() instead of

reimplementing the content comparison in this function.

(delta_files): Call svn_fs_contents_different(), as we were doing prior

to r1709388.

* subversion/libsvn_repos/reporter.c

(delta_proplists): Use svn_fs_props_different() when comparing property

lists.

* subversion/libsvn_repos/rev_hunt.c

(send_path_revision): Call svn_fs_contents_different(). Restore the

blame -g compatibility hack.

* subversion/include/svn_ra.h

(svn_ra_get_file_revs2): Restore the original @note in the docstring.

* subversion/include/svn_repos.h

(svn_repos_get_file_revs2): Restore the original @note in the docstring.

  1. … 6 more files in changeset.
Restore the 1.8 behavior of svn_fs_contents_changed() and _props_changed()

API. Switch all calling sites of the new API, svn_fs_contents_different()

and _props_different(), back to using the old functions.

There are no user-visible problems associated with the old code. The new

API doesn't improve any real use cases in the current code, but is causing

problems:

- We had a problem with misbehaving svn blame -g

(http://svn.haxx.se/dev/archive-2015-06/0069.shtml, "Blame behaviour

change in 1.9").

- We have an issue with repositories behaving differently in client-side

operations like 'svn log' after dump/load

(http://svn.haxx.se/dev/archive-2015-09/0269.shtml, "No-op changes no

longer dumped by 'svnadmin dump' in 1.9"; also see issue #4598 in

https://issues.apache.org/jira/browse/SVN-4598).

- We could experience same problems originating from other callers of the

new API, because the low level behavior change associated with switching

to it propagates up to higher levels like svn_repos or svn_ra and alters

the behavior of many different callers like svn_ra_get_file_revs2() or

the update reporter. Third-party API callers could not be ready for it

as well, because public API functions like svn_ra_get_file_revs2() didn't

receive an erratum or a bump.

See the discussion in http://svn.haxx.se/dev/archive-2015-10/0022.shtml

("Re: No-op changes no longer dumped by 'svnadmin dump' in 1.9").

* subversion/libsvn_fs_base/dag.c

(svn_fs_base__things_different): Compare the uniquifiers, as we did in 1.8.

* subversion/libsvn_fs_base/fs.h

(node_revision_t.data_key_uniquifier): Remove the comment about not using

this field.

* subversion/libsvn_fs_fs/fs_fs.c

(svn_fs_fs__noderev_same_rep_key): Reintroduce this helper function.

(svn_fs_fs__file_text_rep_equal, svn_fs_fs__prop_rep_equal): Always

assume the strict mode in these helpers.

* subversion/libsvn_fs_fs/fs_fs.h

(svn_fs_fs__noderev_same_rep_key): Declare this re-added helper.

(svn_fs_fs__file_text_rep_equal, svn_fs_fs__prop_rep_equal): Update the

docstrings for these helper functions.

* subversion/libsvn_fs_fs/dag.c

(svn_fs_fs__dag_things_different): Preserve the current comparison behavior

in strict mode. Restore the 1.8 way of comparing the representation keys

in non-strict mode.

* subversion/libsvn_fs_fs/tree.c

(merge): Restore the 1.8 way of comparing property lists.

* subversion/libsvn_fs_fs/fs.h

(representation_t.uniquifier): Remove the comment about not using this

field.

* subversion/libsvn_repos/delta.c

(delta_proplists): Switch back to using svn_fs_props_changed().

(svn_repos__compare_files): Restore this function to its 1.8 state.

(delta_files): Restore the 1.8 way of comparing files.

* subversion/libsvn_repos/dump.c

(dump_node): Switch back to using svn_fs_contents_changed() and

svn_fs_props_changed().

* subversion/libsvn_repos/reporter.c

(delta_proplists): Switch back to using svn_fs_props_changed().

* subversion/libsvn_repos/rev_hunt.c

(send_path_revision): Switch back to using svn_fs_contents_changed().

Remove the no longer necessary hack for svn blame -g with older clients.

* subversion/include/svn_ra.h

(svn_ra_get_file_revs2): Update @note in the docstring.

* subversion/include/svn_repos.h

(svn_repos_get_file_revs2): Update @note in the docstring.

* subversion/tests/cmdline/svnadmin_tests.py

(dump_no_op_change): No longer fails with fsfs and bdb.

  1. … 13 more files in changeset.
Follow-up to r1707994: Did not really change the behavior ...

* subversion/libsvn_repos/reporter.c

(get_revision_info): Actually disable the refresh.

Speed up revprop access in svn_repos_finish_report(), i.e. the generic

lib_repos reporter, using the latest FS API.

* subversion/libsvn_repos/reporter.c

(get_revision_info): Read revprops from the FS cache if we can.

(svn_repos_finish_report): Refresh the revprops only once, at the start

of the operation. This is the only public

function that, indirectly, calls the above.

Therefore, we still fulfill the visibility

guarantees for revprop changes.

FS API change:

The new svn_fs_dir_optimal_order shall follow the two pool paradigm.

* subversion/include/svn_fs.h

(svn_fs_dir_optimal_order): Switch to the appropriate new paradigm.

* subversion/libsvn_fs/fs-loader.c

(svn_fs_dir_optimal_order): Update API implementation.

* subversion/libsvn_fs/fs-loader.h

(root_vtable_t): Update v-table.

* subversion/libsvn_fs_base/tree.c

(base_dir_optimal_order): Update BDB implementation.

* subversion/libsvn_fs_fs/tree.c

(fs_dir_optimal_order): Update FSFS vtable implementation.

* subversion/libsvn_fs_fs/pack.h

(svn_fs_fs__order_dir_entries): Update internal function signature.

* subversion/libsvn_fs_fs/pack.c

(svn_fs_fs__order_dir_entries): Update "actual" FSFS implmenentation.

* subversion/libsvn_fs_x/tree.c

(x_dir_optimal_order): Update FSX vtable implementation.

* subversion/libsvn_fs_x/pack.h

(svn_fs_x__order_dir_entries): Update internal function signature.

* subversion/libsvn_fs_x/pack.c

(svn_fs_x__order_dir_entries): Update "actual" FSX implmenentation.

* subversion/libsvn_repos/reporter.c

(delta_dirs): Update caller to provide a scratch pool as well.

* subversion/tests/libsvn_fs/fs-test.c

(test_dir_optimal_order): Same.

  1. … 11 more files in changeset.
Make svn_string_dup() more comfortable to use. Allow the input string

to be NULL and return NULL for the copy in that case.

Right now, it will segfault for NULL pointers and virtually all callers

check for NULL before calling and emulate the improved logic.

So, this change will not break any legal API user code but save us lots

of duplicated logic.

* subversion/include/svn_string.h

(svn_string_dup): Update docstring.

* subversion/libsvn_subr/string.c

(svn_string_dup): Return NULL as copy for NULL inputs.

* subversion/libsvn_client/mtcc.c

(mtcc_prop_getter): Simplify caller.

* subversion/libsvn_client/repos_diff.c

(change_file_prop,

change_dir_prop): Same.

* subversion/libsvn_fs_base/tree.c

(base_node_prop): Same.

* subversion/libsvn_ra_serf/commit.c

(change_dir_prop,

change_file_prop): Same.

* subversion/libsvn_repos/reporter.c

(get_revision_info): Same.

* subversion/libsvn_wc/diff_editor.c

(change_file_prop,

change_dir_prop): Same.

* subversion/libsvn_wc/externals.c

(change_file_prop): Same.

* subversion/libsvn_wc/props.c

(svn_wc__merge_props): Same.

* subversion/libsvn_wc/update_editor.c

(change_dir_prop,

change_file_prop): Same.

* subversion/svnrdump/load_editor.c

(set_node_property): Same.

  1. … 11 more files in changeset.
Following the availability of apr_hash_this_key() etc. in APR v1.5, use

these in Subversion code instead of svn__apr_hash_index_key() etc. Provide

substitutes only when APR is too old to provide them.

* subversion/include/svn_types.h,

subversion/libsvn_subr/iter.c

(svn__apr_hash_index_key,

svn__apr_hash_index_klen,

svn__apr_hash_index_val):

Rename to apr_hash_this_key, apr_hash_this_key_len, apr_hash_this_val.

Declare and define them only if APR is older than 1.5.

Everywhere else: track the renames.

  1. … 102 more files in changeset.
Revert r1508225, which moved the include of svn_private_config.h before all

includes of our public headers. Public headers shouldn't depend on private

headers and all changes that required this are long reverted on trunk.

This patch excludes all conflicting cases.

* subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c

* subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c

* subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c

* subversion/libsvn_auth_gnome_keyring/gnome_keyring.c

* subversion/libsvn_client/add.c

* subversion/libsvn_client/cat.c

* subversion/libsvn_client/changelist.c

* subversion/libsvn_client/cleanup.c

* subversion/libsvn_client/commit.c

* subversion/libsvn_client/commit_util.c

* subversion/libsvn_client/copy.c

* subversion/libsvn_client/copy_foreign.c

* subversion/libsvn_client/ctx.c

* subversion/libsvn_client/delete.c

* subversion/libsvn_client/deprecated.c

* subversion/libsvn_client/diff.c

* subversion/libsvn_client/diff_local.c

* subversion/libsvn_client/diff_summarize.c

* subversion/libsvn_client/export.c

* subversion/libsvn_client/externals.c

* subversion/libsvn_client/import.c

* subversion/libsvn_client/info.c

* subversion/libsvn_client/iprops.c

* subversion/libsvn_client/list.c

* subversion/libsvn_client/locking_commands.c

* subversion/libsvn_client/log.c

* subversion/libsvn_client/merge.c

* subversion/libsvn_client/mergeinfo.c

* subversion/libsvn_client/patch.c

* subversion/libsvn_client/prop_commands.c

* subversion/libsvn_client/ra.c

* subversion/libsvn_client/repos_diff.c

* subversion/libsvn_client/resolved.c

* subversion/libsvn_client/revert.c

* subversion/libsvn_client/switch.c

* subversion/libsvn_client/update.c

* subversion/libsvn_client/util.c

* subversion/libsvn_delta/compat.c

* subversion/libsvn_delta/xdelta.c

* subversion/libsvn_diff/parse-diff.c

* subversion/libsvn_diff/util.c

* subversion/libsvn_fs/access.c

* subversion/libsvn_fs_base/bdb/changes-table.c

* subversion/libsvn_fs_base/bdb/env.c

* subversion/libsvn_fs_base/dag.c

* subversion/libsvn_fs_base/fs.c

* subversion/libsvn_fs_base/lock.c

* subversion/libsvn_fs_base/revs-txns.c

* subversion/libsvn_fs_base/tree.c

* subversion/libsvn_fs_fs/caching.c

* subversion/libsvn_fs_fs/lock.c

* subversion/libsvn_fs_fs/temp_serializer.c

* subversion/libsvn_fs_fs/tree.c

* subversion/libsvn_ra/compat.c

* subversion/libsvn_ra/deprecated.c

* subversion/libsvn_ra/ra_loader.c

* subversion/libsvn_ra_local/ra_plugin.c

* subversion/libsvn_ra_serf/blame.c

* subversion/libsvn_ra_serf/blncache.c

* subversion/libsvn_ra_serf/commit.c

* subversion/libsvn_ra_serf/getlocations.c

* subversion/libsvn_ra_serf/getlocationsegments.c

* subversion/libsvn_ra_serf/getlocks.c

* subversion/libsvn_ra_serf/inherited_props.c

* subversion/libsvn_ra_serf/log.c

* subversion/libsvn_ra_serf/merge.c

* subversion/libsvn_ra_serf/mergeinfo.c

* subversion/libsvn_ra_serf/options.c

* subversion/libsvn_ra_serf/property.c

* subversion/libsvn_ra_serf/replay.c

* subversion/libsvn_ra_serf/serf.c

* subversion/libsvn_ra_serf/update.c

* subversion/libsvn_ra_serf/util.c

* subversion/libsvn_ra_serf/xml.c

* subversion/libsvn_ra_svn/client.c

* subversion/libsvn_ra_svn/editorp.c

* subversion/libsvn_ra_svn/marshal.c

* subversion/libsvn_repos/authz.c

* subversion/libsvn_repos/commit.c

* subversion/libsvn_repos/delta.c

* subversion/libsvn_repos/deprecated.c

* subversion/libsvn_repos/fs-wrap.c

* subversion/libsvn_repos/hooks.c

* subversion/libsvn_repos/log.c

* subversion/libsvn_repos/replay.c

* subversion/libsvn_repos/reporter.c

* subversion/libsvn_repos/repos.c

* subversion/libsvn_repos/rev_hunt.c

* subversion/libsvn_subr/auth.c

* subversion/libsvn_subr/cmdline.c

* subversion/libsvn_subr/compat.c

* subversion/libsvn_subr/config.c

* subversion/libsvn_subr/config_auth.c

* subversion/libsvn_subr/deprecated.c

* subversion/libsvn_subr/dso.c

* subversion/libsvn_subr/hash.c

* subversion/libsvn_subr/io.c

* subversion/libsvn_subr/mergeinfo.c

* subversion/libsvn_subr/opt.c

* subversion/libsvn_subr/properties.c

* subversion/libsvn_subr/simple_providers.c

* subversion/libsvn_subr/sorts.c

* subversion/libsvn_subr/ssl_client_cert_providers.c

* subversion/libsvn_subr/ssl_client_cert_pw_providers.c

* subversion/libsvn_subr/ssl_server_trust_providers.c

* subversion/libsvn_subr/subst.c

* subversion/libsvn_subr/types.c

* subversion/libsvn_subr/username_providers.c

* subversion/libsvn_subr/utf.c

* subversion/libsvn_subr/win32_crypto.c

* subversion/libsvn_wc/adm_crawler.c

* subversion/libsvn_wc/adm_files.c

* subversion/libsvn_wc/conflicts.c

* subversion/libsvn_wc/copy.c

* subversion/libsvn_wc/deprecated.c

* subversion/libsvn_wc/diff_editor.c

* subversion/libsvn_wc/diff_local.c

* subversion/libsvn_wc/entries.c

* subversion/libsvn_wc/externals.c

* subversion/libsvn_wc/info.c

* subversion/libsvn_wc/lock.c

* subversion/libsvn_wc/node.c

* subversion/libsvn_wc/old-and-busted.c

* subversion/libsvn_wc/props.c

* subversion/libsvn_wc/revert.c

* subversion/libsvn_wc/status.c

* subversion/libsvn_wc/update_editor.c

* subversion/libsvn_wc/upgrade.c

* subversion/libsvn_wc/wc_db_update_move.c

* subversion/libsvn_wc/wc_db_wcroot.c

* subversion/mod_dav_svn/repos.c

* subversion/mod_dav_svn/version.c

* subversion/svn/cl-conflicts.c

* subversion/svn/commit-cmd.c

* subversion/svn/conflict-callbacks.c

* subversion/svn/diff-cmd.c

* subversion/svn/help-cmd.c

* subversion/svn/notify.c

* subversion/svn/propedit-cmd.c

* subversion/svn/propget-cmd.c

* subversion/svn/props.c

* subversion/svn/status-cmd.c

* subversion/svn/status.c

* subversion/svn/svn.c

* subversion/svn/util.c

* subversion/svnadmin/svnadmin.c

* subversion/svnlook/svnlook.c

* subversion/svnrdump/dump_editor.c

* subversion/svnrdump/svnrdump.c

* subversion/svnrdump/util.c

* subversion/svnserve/serve.c

* subversion/svnsync/svnsync.c

* subversion/svnsync/sync.c

* subversion/tests/libsvn_fs/fs-test.c

* subversion/tests/libsvn_repos/repos-test.c

* subversion/tests/libsvn_subr/hashdump-test.c

* subversion/tests/libsvn_subr/mergeinfo-test.c

* subversion/tests/libsvn_subr/subst_translate-test.c

* subversion/tests/libsvn_wc/conflict-data-test.c

* subversion/tests/libsvn_wc/op-depth-test.c

* subversion/tests/libsvn_wc/wc-test.c

* subversion/tests/svn_test_fs.c

* tools/server-side/fsfs-stats.c

Move the svn_string_private.h include back to the original location.

  1. … 162 more files in changeset.
In libsvn_repos, simplify hash iteration code a little by using key and

value accessor functions rather than apr_hash_this(), as we already do in

many other places.

Though I lament the length of those svn__apr_hash_index_* identifiers (which

I created), at least it's a step closer to readable. We can shorten them

later to apr_hash_this_* by adding configury, now that APR 1.5 has those.

* subversion/libsvn_repos/delta.c

(delta_dirs): As above.

* subversion/libsvn_repos/fs-wrap.c

(svn_repos_fs_commit_txn): As above.

* subversion/libsvn_repos/hooks.c

(lock_token_content): As above.

* subversion/libsvn_repos/load-fs-vtable.c

(prefix_mergeinfo_paths,

renumber_mergeinfo_revs,

remove_node_props): As above.

* subversion/libsvn_repos/log.c

(svn_repos_check_revision_access,

turn_moves_into_copies,

turn_unique_copies_into_moves,

detect_changed,

fs_mergeinfo_changed,

get_combined_mergeinfo_changes,

send_log,

combine_mergeinfo_path_lists): As above.

* subversion/libsvn_repos/replay.c

(add_subdir,

svn_repos_replay2,

svn_repos__replay_ev2): As above.

* subversion/libsvn_repos/reporter.c

(delta_proplists): As above.

* subversion/libsvn_repos/rev_hunt.c

(find_merged_revisions): As above.

  1. … 7 more files in changeset.
Follow-up to r1572363: Instead of using a "STRICT" parameter, split the

contents comparison functions into the old approximate ones and a new

exact ones.

There seems to be no point in having the boolean option as other code

would always set it to TRUE. Even svn_*_get_file_revs2 will now always

operate in "strict" mode because there is little point in not doing so.

(Adding a "strict" flag svn_*_get_file_revs2 would cause major code churn

just to have the only client-side user, blame(), set it fixed to TRUE).

* subversion/include/svn_fs.h

(svn_fs_props_changed2): Rename to ...

(svn_fs_props_different): ... this and drop the STRICT parameter.

(svn_fs_props_changed): De-deprecate.

(svn_fs_contents_changed2): Rename to ...

(svn_fs_contents_different): ... this and drop the STRICT parameter.

(svn_fs_contents_changed): De-deprecate.

* subversion/include/svn_ra.h

(svn_ra_get_file_revs2): Document that we won't send random empty

deltas anymore.

* subversion/include/svn_repos.h

(svn_ra_get_file_revs2): Ditto.

* subversion/libsvn_fs/fs-loader.c

(svn_fs_props_changed2,

svn_fs_props_different,

svn_fs_contents_changed2,

svn_fs_contents_different): Reflect to API change.

* subversion/libsvn_repos/delta.c

(delta_proplists,

svn_repos__compare_files,

delta_files): Use the newly renamed strict API functions.

* subversion/libsvn_repos/dump.c

(dump_node): Same.

* subversion/libsvn_repos/reporter.c

(delta_proplists): Same.

* subversion/libsvn_repos/rev_hunt.c

(send_path_revision): Same. This enables the new, predictable / strict

behavior of svn_*_get_file_revs2.

  1. … 7 more files in changeset.
Expose the recent change detection improvements in the FS API by adding

a STRICT option to rev'ed svn_fs_props_changed and svn_fs_content_changed

functions.

Update all backends and API users. Most API users want strict behavior

as they would otherwise to calc the diff on their own. The only exception

is the svn_repos_get_file_revs2 API which passes the data on to a callback.

* subversion/include/svn_fs.h

(svn_fs_props_changed2,

svn_fs_contents_changed2): Revved versions of the respective APIs.

(svn_fs_props_changed,

svn_fs_contents_changed): Deprecate.

* subversion/libsvn_fs/fs-loader.c

(svn_fs_props_changed2,

svn_fs_contents_changed2): Implement.

(svn_fs_props_changed,

svn_fs_contents_changed): Update vtable call.

* subversion/libsvn_fs/fs-loader.h

(root_vtable_t): Update vtable entries for revved API functions.

* subversion/libsvn_fs_base/tree.c

(base_props_changed,

base_contents_changed): Accept new STRICT parameter and pass it on.

* subversion/libsvn_fs_fs/tree.c

(fs_props_changed,

fs_contents_changed): Ditto.

* subversion/libsvn_fs_x/tree.c

(x_props_changed,

x_contents_changed): Ditto.

* subversion/libsvn_repos/delta.c

(delta_proplists): Update API call.

(svn_repos__compare_files,

delta_files): Use the revved API and greatly simplify the code since

the FS API changed indications are now reliable.

* subversion/libsvn_repos/dump.c

(dump_node): Update API call.

* subversion/libsvn_repos/reporter.c

(delta_proplists): Ditto.

* subversion/libsvn_repos/rev_hunt.c

(send_path_revision): Update API call but allow false positives for now.

  1. … 9 more files in changeset.
* subversion/libsvn_repos/reporter.c

(delta_dirs): Destroy a sub-pool as soon as it is no longer needed.

Followup to r1564215: Minor tweaks to variable scope and pool parentage.

* subversion/libsvn_repos/reporter.c

(delta_dirs): Move iterpool into the if scope since it's not used outside it.

Make iterpool a child of subpool and avoid an extra svn_pool_destroy()

call on iterpool.

Tighten pool usage in our standard reporter.

For not so obvious reasons, the pool passed to delta_dirs can take

a long time to get clean up eventually. As a result, I got dynamic

peaks in memory usage of a whopping 20GB when running extreme tests

like 'svn-bench null-export' on the full kde.org repository.

With this fix, the peak is reduced to 100MB which is reaonably

"streamy" and will be reduced further by following commits.

* subversion/libsvn_repos/reporter.c

(delta_dirs): Rename the existing subpool to iterpool.

Create a subpool for all other allocations in this

function and clean that up asap.

Introduce a null-pointer constant that we can use as a termination sentinel

in variable argument lists. This avoids the ugliness of writing

"(char *) NULL" all over the place.

* subversion/include/svn_types.h (SVN_VA_NULL): New symbol.

* subversion/include/svn_dirent_uri.h (svn_dirent_join_many),

subversion/include/svn_path.h (svn_path_join_many),

subversion/include/svn_xml.h (svn_xml_make_open_tag):

Update docstrings, mentioning SVN_VA_NULL as the argument list terminator.

[Lots of implementation files]: Replace typecast-NULL with SVN_VA_NULL in

function calls with variable argument lists.

  1. … 89 more files in changeset.
Merged branches/fsfs-improvements into /trunk (clean merge).

Removed BRANCH-README.

  1. … 47 more files in changeset.
* subversion/libsvn_repos/reporter.c

(get_revision_info): Use sizeof() of passed value, not other local

variable of the same type.

Fix the #include order such that svn_private_config.h is always

included first before any other svn header - if we also include

svn_hash.h.

* subversion/bindings/javahl/native/org_apache_subversion_javahl_ConfigImpl_Category.cpp,

subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c,

subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c,

subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c,

subversion/libsvn_auth_gnome_keyring/gnome_keyring.c,

subversion/libsvn_client/add.c,

subversion/libsvn_client/cat.c,

subversion/libsvn_client/changelist.c,

subversion/libsvn_client/cleanup.c,

subversion/libsvn_client/commit.c,

subversion/libsvn_client/commit_util.c,

subversion/libsvn_client/copy.c,

subversion/libsvn_client/copy_foreign.c,

subversion/libsvn_client/ctx.c,

subversion/libsvn_client/delete.c,

subversion/libsvn_client/deprecated.c,

subversion/libsvn_client/diff.c,

subversion/libsvn_client/diff_local.c,

subversion/libsvn_client/diff_summarize.c,

subversion/libsvn_client/export.c,

subversion/libsvn_client/externals.c,

subversion/libsvn_client/import.c,

subversion/libsvn_client/info.c,

subversion/libsvn_client/iprops.c,

subversion/libsvn_client/list.c,

subversion/libsvn_client/locking_commands.c,

subversion/libsvn_client/log.c,

subversion/libsvn_client/merge.c,

subversion/libsvn_client/mergeinfo.c,

subversion/libsvn_client/patch.c,

subversion/libsvn_client/prop_commands.c,

subversion/libsvn_client/ra.c,

subversion/libsvn_client/repos_diff.c,

subversion/libsvn_client/resolved.c,

subversion/libsvn_client/revert.c,

subversion/libsvn_client/status.c,

subversion/libsvn_client/switch.c,

subversion/libsvn_client/update.c,

subversion/libsvn_client/util.c,

subversion/libsvn_delta/compat.c,

subversion/libsvn_delta/xdelta.c,

subversion/libsvn_diff/parse-diff.c,

subversion/libsvn_diff/util.c,

subversion/libsvn_fs/access.c,

subversion/libsvn_fs_base/bdb/changes-table.c,

subversion/libsvn_fs_base/bdb/env.c,

subversion/libsvn_fs_base/dag.c,

subversion/libsvn_fs_base/fs.c,

subversion/libsvn_fs_base/lock.c,

subversion/libsvn_fs_base/revs-txns.c,

subversion/libsvn_fs_base/tree.c,

subversion/libsvn_fs_fs/caching.c,

subversion/libsvn_fs_fs/fs_fs.c,

subversion/libsvn_fs/fs-loader.c,

subversion/libsvn_fs_fs/lock.c,

subversion/libsvn_fs_fs/temp_serializer.c,

subversion/libsvn_fs_fs/tree.c,

subversion/libsvn_fs_util/fs-util.c,

subversion/libsvn_ra/compat.c,

subversion/libsvn_ra/deprecated.c,

subversion/libsvn_ra_local/ra_plugin.c,

subversion/libsvn_ra/ra_loader.c,

subversion/libsvn_ra_serf/blame.c,

subversion/libsvn_ra_serf/blncache.c,

subversion/libsvn_ra_serf/commit.c,

subversion/libsvn_ra_serf/getlocations.c,

subversion/libsvn_ra_serf/getlocationsegments.c,

subversion/libsvn_ra_serf/getlocks.c,

subversion/libsvn_ra_serf/inherited_props.c,

subversion/libsvn_ra_serf/log.c,

subversion/libsvn_ra_serf/merge.c,

subversion/libsvn_ra_serf/mergeinfo.c,

subversion/libsvn_ra_serf/options.c,

subversion/libsvn_ra_serf/property.c,

subversion/libsvn_ra_serf/replay.c,

subversion/libsvn_ra_serf/serf.c,

subversion/libsvn_ra_serf/update.c,

subversion/libsvn_ra_serf/util.c,

subversion/libsvn_ra_serf/xml.c,

subversion/libsvn_ra_svn/client.c,

subversion/libsvn_ra_svn/editorp.c,

subversion/libsvn_ra_svn/marshal.c,

subversion/libsvn_repos/authz.c,

subversion/libsvn_repos/commit.c,

subversion/libsvn_repos/delta.c,

subversion/libsvn_repos/deprecated.c,

subversion/libsvn_repos/fs-wrap.c,

subversion/libsvn_repos/hooks.c,

subversion/libsvn_repos/log.c,

subversion/libsvn_repos/replay.c,

subversion/libsvn_repos/reporter.c,

subversion/libsvn_repos/repos.c,

subversion/libsvn_repos/rev_hunt.c,

subversion/libsvn_subr/auth.c,

subversion/libsvn_subr/cmdline.c,

subversion/libsvn_subr/compat.c,

subversion/libsvn_subr/config_auth.c,

subversion/libsvn_subr/config.c,

subversion/libsvn_subr/deprecated.c,

subversion/libsvn_subr/dso.c,

subversion/libsvn_subr/hash.c,

subversion/libsvn_subr/io.c,

subversion/libsvn_subr/mergeinfo.c,

subversion/libsvn_subr/opt.c,

subversion/libsvn_subr/properties.c,

subversion/libsvn_subr/simple_providers.c,

subversion/libsvn_subr/sorts.c,

subversion/libsvn_subr/ssl_client_cert_providers.c,

subversion/libsvn_subr/ssl_client_cert_pw_providers.c,

subversion/libsvn_subr/ssl_server_trust_providers.c,

subversion/libsvn_subr/subst.c,

subversion/libsvn_subr/types.c,

subversion/libsvn_subr/username_providers.c,

subversion/libsvn_subr/utf.c,

subversion/libsvn_subr/win32_crypto.c,

subversion/libsvn_wc/adm_crawler.c,

subversion/libsvn_wc/adm_files.c,

subversion/libsvn_wc/adm_ops.c,

subversion/libsvn_wc/conflicts.c,

subversion/libsvn_wc/copy.c,

subversion/libsvn_wc/deprecated.c,

subversion/libsvn_wc/diff_editor.c,

subversion/libsvn_wc/diff_local.c,

subversion/libsvn_wc/entries.c,

subversion/libsvn_wc/externals.c,

subversion/libsvn_wc/info.c,

subversion/libsvn_wc/lock.c,

subversion/libsvn_wc/node.c,

subversion/libsvn_wc/old-and-busted.c,

subversion/libsvn_wc/props.c,

subversion/libsvn_wc/revert.c,

subversion/libsvn_wc/status.c,

subversion/libsvn_wc/translate.c,

subversion/libsvn_wc/update_editor.c,

subversion/libsvn_wc/upgrade.c,

subversion/libsvn_wc/wc_db.c,

subversion/libsvn_wc/wc_db_update_move.c,

subversion/libsvn_wc/wc_db_wcroot.c,

subversion/libsvn_wc/workqueue.c,

subversion/mod_dav_svn/activity.c,

subversion/mod_dav_svn/deadprops.c,

subversion/mod_dav_svn/lock.c,

subversion/mod_dav_svn/merge.c,

subversion/mod_dav_svn/mod_dav_svn.c,

subversion/mod_dav_svn/reports/update.c,

subversion/mod_dav_svn/repos.c,

subversion/mod_dav_svn/version.c,

subversion/svnadmin/svnadmin.c,

subversion/svnauth/svnauth.c,

subversion/svn/cl-conflicts.c,

subversion/svn/commit-cmd.c,

subversion/svn/conflict-callbacks.c,

subversion/svn/diff-cmd.c,

subversion/svn/help-cmd.c,

subversion/svnlook/svnlook.c,

subversion/svnmucc/svnmucc.c,

subversion/svn/notify.c,

subversion/svn/propedit-cmd.c,

subversion/svn/propget-cmd.c,

subversion/svn/props.c,

subversion/svnrdump/dump_editor.c,

subversion/svnrdump/svnrdump.c,

subversion/svnrdump/util.c,

subversion/svnserve/serve.c,

subversion/svn/status.c,

subversion/svn/status-cmd.c,

subversion/svn/svn.c,

subversion/svnsync/svnsync.c,

subversion/svnsync/sync.c,

subversion/svn/util.c,

subversion/tests/libsvn_fs/fs-test.c,

subversion/tests/libsvn_repos/repos-test.c,

subversion/tests/libsvn_subr/hashdump-test.c,

subversion/tests/libsvn_subr/mergeinfo-test.c,

subversion/tests/libsvn_subr/subst_translate-test.c,

subversion/tests/libsvn_wc/conflict-data-test.c,

subversion/tests/libsvn_wc/op-depth-test.c,

subversion/tests/libsvn_wc/wc-test.c,

subversion/tests/svn_test_fs.c,

tools/dev/fsfs-reorg.c,

tools/server-side/fsfs-stats.c): #include svn_private_config.h first

  1. … 180 more files in changeset.
* subversion/libsvn_repos/reporter.c

(delta_dirs): Rewrite a hard-to-read expression by replacing seven

negations with just one, and re-ordering it to match the comment.

* subversion/libsvn_repos/reporter.c

(delta_dirs): Move variables into tighter scope, declaring them separately

in each scope where they are used instead of sharing them.

Revert the "just-for-symmetry" changes made in r1483532 and keep only

those used for log and merge info in tight loops.

* subversion/libsvn_client/add.c

(svn_client__get_all_auto_props): switch back to svn_hash_[g|s]ets

* subversion/libsvn_client/commit_util.c

(svn_client__ensure_revprop_table): same

* subversion/libsvn_client/copy.c

(repos_to_wc_copy_single): same

* subversion/libsvn_client/list.c

(svn_client__ra_stat_compatible): same

* subversion/libsvn_client/log.c

(pre_15_receiver): same

* subversion/libsvn_client/merge.c

(prepare_merge_props_changed, merge_file_added, merge_dir_added,

merge_dir_deleted): same

* subversion/libsvn_client/mergeinfo.c

(svn_client__get_wc_or_repos_mergeinfo_catalogue): same

* subversion/libsvn_fs_base/tree.c

(txn_body_get_mergeinfo_data_and_entries,

txn_body_get_mergeinfo_for_path): same

* subversion/libsvn_fs_fs/fs_fs.c

(write_revision_zero): same

* subversion/libsvn_fs_fs/tree.c

(get_mergeinfo_for_path_internal): same

* subversion/libsvn_ra/deprecated.c

(svn_ra_get_commit_editor2): same

* subversion/libsvn_ra_local/ra_plugin.c

(svn_ra_local__get_commit_editor, svn_ra_local__get_commit_ev2): same

* subversion/libsvn_ra_svn/client.c

(ra_svn_commit): same

* subversion/libsvn_repos/commit.c

(svn_repos__get_commit_ev2): same

* subversion/libsvn_repos/delta.c

(delta_proplists): same

* subversion/libsvn_repos/deprecated.c

(svn_repos_get_commit_editor4): same

* subversion/libsvn_repos/dump.c

(dump_node, write_revision_record): same

* subversion/libsvn_repos/fs-wrap.c

(svn_repos_fs_begin_txn_for_commit2, svn_repos_fs_begin_txn_for_commit,

svn_repos_fs_revision_proplist): same

* subversion/libsvn_repos/reporter.c

(get_revision_info): same

* subversion/libsvn_wc/status.c

(collect_ignore_patterns): same

* subversion/mod_dav_svn/activity.c

(dav_svn__create_txn): same

* subversion/mod_dav_svn/lock.c

(append_locks): same

* subversion/svndumpfilter/svndumpfilter.c

(output_revision): same

* subversion/svnmucc/svnmucc.c

(execute, sanitize_log_sources): same

* subversion/svnrdump/load_editor.c

(new_node_record): same

* subversion/svnserve/serve.c

(commit): same

* subversion/svnsync/svnsync.c

(replay_rev_started): same

  1. … 26 more files in changeset.
We frequently use property name constants in conjunction with hash containers.

Provide new wrappers around apr_hash_get and apr_hash_set that accept such

string constants and statically determine their size. That minimizes the

hash access costs.

Mass change hash get and set calls for SVN_PROP_* constants.

* subversion/include/svn_hash.h

(svn_hash_gets,

svn_hash_sets): Doxygen-ize the docstring

(svn_hash_gets_fixed_key,

svn_hash_sets_fixed_key): define new apr_hash_* wrapper

* subversion/libsvn_client/add.c

(svn_client__get_all_auto_props): use faster hash wrappers with SVN_PROP_*

* subversion/libsvn_client/commit_util.c

(svn_client__ensure_revprop_table): ditto

* subversion/libsvn_client/copy.c

(repos_to_wc_copy_single): ditto

* subversion/libsvn_client/list.c

(svn_client__ra_stat_compatible): ditto

* subversion/libsvn_client/log.c

(pre_15_receiver): ditto

* subversion/libsvn_client/merge.c

(prepare_merge_props_changed, merge_file_added, merge_dir_added,

merge_dir_deleted): ditto

* subversion/libsvn_client/mergeinfo.c

(svn_client__get_wc_or_repos_mergeinfo_catalog): ditto

* subversion/libsvn_fs_base/tree.c

(txn_body_get_mergeinfo_data_and_entries,

txn_body_get_mergeinfo_for_path): same

* subversion/libsvn_fs_fs/fs_fs.c

(write_revision_zero): same

* subversion/libsvn_fs_fs/tree.c

(crawl_directory_dag_for_mergeinfo, get_mergeinfo_for_path_internal): same

* subversion/libsvn_ra/deprecated.c

(svn_ra_get_commit_editor2): same

* subversion/libsvn_ra_local/ra_plugin.c

(svn_ra_local__get_commit_editor, svn_ra_local__get_commit_ev2): same

* subversion/libsvn_ra_svn/client.c

(ra_svn_commit, ra_svn_log): same

* subversion/libsvn_repos/commit.c

(svn_repos__get_commit_ev2): same

* subversion/libsvn_repos/delta.c

(delta_proplists): same

* subversion/libsvn_repos/deprecated.c

(svn_repos_get_commit_editor4): same

* subversion/libsvn_repos/dump.c

(dump_node, write_revision_record):

* subversion/libsvn_repos/fs-wrap.c

(svn_repos_fs_begin_txn_for_commit2, svn_repos_fs_begin_txn_for_commit,

svn_repos_fs_revision_proplist): same

* subversion/libsvn_repos/log.c

(fill_log_entry): same

* subversion/libsvn_repos/reporter.c

(get_revision_info): same

* subversion/libsvn_repos/rev_hunt.c

(svn_repos_get_committed_info): same

* subversion/libsvn_subr/compat.c

(svn_compat_log_revprops_clear, svn_compat_log_revprops_out): same

* subversion/libsvn_wc/status.c

(collect_ignore_patterns): same

* subversion/mod_dav_svn/activity.c

(dav_svn__create_txn): same

* subversion/mod_dav_svn/lock.c

(append_locks): same

* subversion/svndumpfilter/svndumpfilter.c

(output_revision): same

* subversion/svnmucc/svnmucc.c

(execute, sanitize_log_sources): same

* subversion/svnrdump/load_editor.c

(new_node_record): same

* subversion/svnserve/serve.c

(commit): same

* subversion/svnsync/svnsync.c

(replay_rev_started): same

[Most of this got reverted in r1483610]

[Remainder reverted in r1484181]

  1. … 30 more files in changeset.
Use svn_hash_gets and svn_hash_sets.

* subversion/libsvn_repos/authz.c

* subversion/libsvn_repos/commit.c

* subversion/libsvn_repos/delta.c

* subversion/libsvn_repos/deprecated.c

* subversion/libsvn_repos/dump.c

* subversion/libsvn_repos/fs-wrap.c

* subversion/libsvn_repos/hooks.c

* subversion/libsvn_repos/load-fs-vtable.c

* subversion/libsvn_repos/load.c

* subversion/libsvn_repos/log.c

* subversion/libsvn_repos/replay.c

* subversion/libsvn_repos/reporter.c

* subversion/libsvn_repos/repos.c

* subversion/libsvn_repos/rev_hunt.c

  1. … 13 more files in changeset.