Checkout Tools
  • last updated 3 hours ago
Constraints
Constraints: committers
 
Constraints: files
Constraints: dates

Changeset 1574988 is being indexed.

Make the C tests work with the --enable-optimize configure option.

Because the main() function used to be defined in libsvn_test,

the -flto option (which performs rather aggressive link-time

optimizations) would cause the linker to remove all "unreferenced"

static functions ... which includes all the actual tests.

Which this change, main() is now defined in each test driver.

* subversion/tests/svn_test.h

(test_funcs, svn_test_max_threads): Remove external declarations.

(svn_test_main): New prototype for the (existing-but-renamed) test driver.

(SVN_TEST_MAIN): Bolierplate macro that generates a main() implementation.

* subversion/tests/svn_test_main.c

(svn_test_main): Renamed from 'main', and takes two extra parameters,

'max_threads' and 'test_funcs'. Propagates test_funcs to get_array_size,

do_test_num and do_tests_concurrently.

(get_array_size, do_test_num,

test_params_t, test_thread, do_tests_concurrently): Require a test_funcs

parameter. All uses updated.

* subversion/tests/libsvn_client/client-test.c,

subversion/tests/libsvn_client/mtcc-test.c,

subversion/tests/libsvn_delta/random-test.c,

subversion/tests/libsvn_delta/window-test.c,

subversion/tests/libsvn_diff/diff-diff3-test.c,

subversion/tests/libsvn_diff/parse-diff-test.c,

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

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

subversion/tests/libsvn_fs_base/

subversion/tests/libsvn_fs_base/changes-test.c,

subversion/tests/libsvn_fs_base/fs-base-test.c,

subversion/tests/libsvn_fs_base/strings-reps-test.c,

subversion/tests/libsvn_fs_fs/fs-fs-pack-test.c,

subversion/tests/libsvn_fs_x/fs-x-pack-test.c,

subversion/tests/libsvn_fs_x/string-table-test.c,

subversion/tests/libsvn_ra/ra-test.c,

subversion/tests/libsvn_ra_local/ra-local-test.c,

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

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

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

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

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

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

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

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

subversion/tests/libsvn_subr/error-code-test.c,

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

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

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

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

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

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

subversion/tests/libsvn_subr/packed-data-test.c,

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

subversion/tests/libsvn_subr/prefix-string-test.c,

subversion/tests/libsvn_subr/priority-queue-test.c,

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

subversion/tests/libsvn_subr/root-pools-test.c,

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

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

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

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

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

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

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

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

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

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

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

subversion/tests/libsvn_wc/entries-compat.c,

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

subversion/tests/libsvn_wc/pristine-store-test.c,

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

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

(max_threads): Renamed from svn_test_max_threads and made static.

(test_funcs): Made static.

(SVN_TEST_MAIN): Expanded boilerplate main() function.

  1. … 54 more files in changeset.
Add "--parallel" option to our C tests.

Besides shaving off a few seconds off our total test execution time,

parallel execution also stresses our code and the tests themselves

harder. It uncovers things like improperly separated working sets

that make post-failure analysis harder.

Parallel mode is only available with APR 1.3+ and threads enabled.

The option will simply be ignored in other configurations. Further

limitations are cleanups being delayed to after all tests completed

and segfaults not being intercepted.

Some tests can't be executed in parallel. Therefore, we introduce

svn_test_max_threads a simple upper limit to the number of threads

supported that each test must define alongside the test_funcs array.

This patch sets it to "1" in many cases because the tests are so

small that multi-threaded execution is simply not worth it.

* build/run_tests.py

(TestHarness._run_c_test): Pass --parallel option to the individual

test applications.

* subversion/tests/svn_test.h

(svn_test_max_threads): Declare new external setting to be set by

every test application.

* subversion/tests/svn_test_main.c

(parallel): New command line option presence flag.

(parallel_opt,

cl_options): Declare the new "--parallel" option.

(svn_test_add_dir_cleanup): Synchronize shared pool access since

this might be called from multiple

threads at the same time.

(log_results): Result logger function factored out from do_test_num

to be shared between serialized and parallel test

execution code.

(do_test_num): Use that new function.

(test_params_t,

test_thread,

do_tests_concurrently): Threads, their parameter and the thread

starter for thread-pooled test execution.

(main): Handle the new option.

Call concurrent execution when in PARALLEL mode.

* subversion/tests/libsvn_delta/random-test.c

subversion/tests/libsvn_subr/named_atomic-test.c

(svn_test_max_threads): These tests don't support concurrent execution.

* subversion/tests/libsvn_delta/random-test.c

subversion/tests/libsvn_delta/window-test.c

subversion/tests/libsvn_diff/parse-diff-test.c

subversion/tests/libsvn_ra_local/ra-local-test.c

subversion/tests/libsvn_ra/ra-test.c

subversion/tests/libsvn_subr/auth-test.c

subversion/tests/libsvn_subr/cache-test.c

subversion/tests/libsvn_subr/checksum-test.c

subversion/tests/libsvn_subr/compat-test.c

subversion/tests/libsvn_subr/config-test.c

subversion/tests/libsvn_subr/crypto-test.c

subversion/tests/libsvn_subr/dirent_uri-test.c

subversion/tests/libsvn_subr/error-code-test.c

subversion/tests/libsvn_subr/error-test.c

subversion/tests/libsvn_subr/hashdump-test.c

subversion/tests/libsvn_subr/mergeinfo-test.c

subversion/tests/libsvn_subr/named_atomic-test.c

subversion/tests/libsvn_subr/opt-test.c

subversion/tests/libsvn_subr/packed-data-test.c

subversion/tests/libsvn_subr/path-test.c

subversion/tests/libsvn_subr/prefix-string-test.c

subversion/tests/libsvn_subr/priority-queue-test.c

subversion/tests/libsvn_subr/revision-test.c

subversion/tests/libsvn_subr/root-pools-test.c

subversion/tests/libsvn_subr/skel-test.c

subversion/tests/libsvn_subr/spillbuf-test.c

subversion/tests/libsvn_subr/sqlite-test.c

subversion/tests/libsvn_subr/stream-test.c

subversion/tests/libsvn_subr/string-test.c

subversion/tests/libsvn_subr/subst_translate-test.c

subversion/tests/libsvn_subr/time-test.c

subversion/tests/libsvn_subr/utf-test.c

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

subversion/tests/libsvn_wc/wc-queries-test.c:

(svn_test_max_threads): These are too small to benefit from multi-threading.

* subversion/tests/libsvn_client/client-test.c

subversion/tests/libsvn_diff/diff-diff3-test.c

subversion/tests/libsvn_fs_base/changes-test.c

subversion/tests/libsvn_fs_base/fs-base-test.c

subversion/tests/libsvn_fs_base/strings-reps-test.c

subversion/tests/libsvn_fs_fs/fs-fs-pack-test.c

subversion/tests/libsvn_fs/fs-test.c

subversion/tests/libsvn_fs/locks-test.c

subversion/tests/libsvn_fs_x/fs-x-pack-test.c

subversion/tests/libsvn_fs_x/string-table-test.c

subversion/tests/libsvn_repos/repos-test.c

subversion/tests/libsvn_subr/io-test.c

subversion/tests/libsvn_subr/translate-test.c

subversion/tests/libsvn_wc/db-test.c

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

subversion/tests/libsvn_wc/wc-test.c

(svn_test_max_threads): Set concurrency limit to whatever various test

runs suggested as the most efficient value.

* subversion/tests/libsvn_wc/entries-compat.c

subversion/tests/libsvn_wc/pristine-store-test.c

(svn_test_max_threads): Set concurrency limit to "unbounded".

  1. … 54 more files in changeset.
Eliminate shared global variables (not constants) in our C tests by

simply declaring them locally in each tests that needs them.

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

(a, b, c): drop these global variables

(test1,

test2,

test3,

test4,

test5,

test6,

test7,

test8,

test9,

test_find_char_backward,

test13,

test14,

test15,

test16,

test17,

test_first_non_whitespace,

test21,

test_stringbuf_unequal,

test_stringbuf_insert,

test_stringbuf_remove,

test_stringbuf_replace): declare variables locally

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

(info1, info2): drop these global variables

(test_parse_combine_rangeinfo,

test_parse_broken_mergeinfo,,

test_mergeinfo_intersect,

test_merge_mergeinfo,

test_rangelist_to_string,

test_mergeinfo_to_string): declare variables locally

  1. … 1 more file in changeset.
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.
Use svn_hash_gets/svn_hash_sets, part 1: #include "svn_hash.h" everywhere

that <apr_hash.h> is included. I assume most of those use APR_HASH_KEY_STRING.

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

* subversion/libsvn_client/commit.c

* subversion/libsvn_client/diff_local.c

* subversion/libsvn_client/import.c

* subversion/libsvn_delta/xdelta.c

* subversion/libsvn_fs/access.c

* subversion/libsvn_fs/fs-loader.c

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

* subversion/libsvn_fs_base/bdb/env.c

* subversion/libsvn_fs_fs/tree.c

* subversion/libsvn_ra/ra_loader.c

* subversion/libsvn_repos/delta.c

* subversion/libsvn_subr/dso.c

* subversion/libsvn_subr/properties.c

* subversion/libsvn_subr/sorts.c

* subversion/libsvn_wc/adm_crawler.c

* subversion/libsvn_wc/conflicts.c

* subversion/mod_dav_svn/deadprops.c

* subversion/mod_dav_svn/merge.c

* subversion/mod_dav_svn/mod_dav_svn.c

* subversion/mod_dav_svn/repos.c

* subversion/svn/props.c

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

(svn_hash.h): Add #include.

  1. … 22 more files in changeset.
Consistify a few remaining redundant or odd expressions involving boolean

constants, such as "foo == FALSE" to "!foo" and "number ? TRUE : FALSE" to

"number != 0". A follow-up to r1431017 and r1431040.

* subversion/include/svn_types.h

(svn_depth_from_word): Simplify "boolean ? TRUE : FALSE".

* subversion/libsvn_subr/named_atomic.c

(svn_named_atomic__is_supported): Same.

* subversion/libsvn_subr/stream.c

(svn_stream_supports_mark): Similar.

* subversion/libsvn_client/copy.c

(try_copy): Simplify "x == TRUE" and similar.

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

(test_rangelist_to_string, test_mergeinfo_to_string): Same.

* subversion/libsvn_ra_serf/commit.c

(open_root): Change "pointer ? TRUE : FALSE" to "pointer != NULL".

* subversion/svnadmin/svnadmin.c

(subcommand_load): Same.

* subversion/mod_dav_svn/reports/replay.c

(dav_svn__replay_report): Change "number ? TRUE : FALSE" to "number != 0".

  1. … 7 more files in changeset.
Fulfill a promise of a deprecated rangelist api by refactoring some code.

Document that we don't promise this behavior in the newer api, and point users

of an internal api towards an internal api that might help users fulfill this

promise.

* subversion/include/private/svn_mergeinfo_private.h

(svn_rangelist__parse): Add pointer.

(svn_rangelist__combine_adjecent_ranges): Add function.

* subversion/include/svn_mergeinfo.h

(svn_rangelist_merge2): Document real behavior.

(svn_rangelist_merge): Document the old promise as difference.

* subversion/libsvn_subr/deprecated.c

(includes): Add svn_mergeinfo_private.h.

(svn_rangelist_merge): Call svn_rangelist__combine_adjecent_ranges on the

to be returned rangelist to fulfill promise.

* subversion/libsvn_subr/mergeinfo.c

(svn_rangelist__combine_adjecent_ranges): New function. Extracted from

parse_revision_line.

(parse_revision_line): Call svn_rangelist__combine_adjecent_ranges.

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

(test_funcs): Expect 'test_rangelist_merge' to pass, because it uses

svn_rangelist_merge.

  1. … 4 more files in changeset.
Add an 'svn_rangelist_t' typedef for use with the existing 'svn_rangelist_*'

APIs, instead of using 'apr_array_header_t' directly.

The immediate reason is to improve the debugging experience: I can make

GDB display 'svn_rangelist_t' values in a simple human-readable form, whereas

the best it can do with 'apr_array_header_t', not knowing the type of the

elements, is print something like 'array of 2 items'.

Beyond that, it makes sense from a coding abstraction point of view, filling

a gap in this hierarchy:

svn_mergeinfo_catalog_t is a collection of

svn_mergeinfo_t is a collection of

svn_rangelist_t is a collection of

svn_merge_range_t

This type has public visibility. Because it is just a typedef, the C API

will be backward-compatible and the ABI won't change. Therefore all uses,

even in deprecated functions, are being changed.

Using such a typedef doesn't provide any additional static type-checking.

Unlike svn_mergeinfo_t and svn_mergeinfo_catalog_t, svn_rangelist_t is not a

pointer type.

* subversion/include/svn_mergeinfo.h

(svn_rangelist_t): New typedef.

(...everywhere...): Use it.

* subversion/include/private/svn_mergeinfo_private.h

(...everywhere...): Use it.

* subversion/include/svn_client.h

(svn_client_mergeinfo_get_merged): Update doc string to refer to this.

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

subversion/bindings/javahl/native/CreateJ.h,

subversion/bindings/javahl/native/SVNClient.cpp,

subversion/bindings/swig/core.i,

subversion/bindings/swig/include/svn_containers.swg,

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

(...everywhere...): Update the bindings.

subversion/libsvn_client/diff.c,

subversion/libsvn_client/merge.c,

subversion/libsvn_client/mergeinfo.c,

subversion/libsvn_client/mergeinfo.h,

subversion/libsvn_client/ra.c,

subversion/libsvn_fs_util/fs-util.c,

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

subversion/libsvn_repos/log.c,

subversion/libsvn_repos/rev_hunt.c,

subversion/libsvn_subr/deprecated.c,

subversion/libsvn_subr/mergeinfo.c,

subversion/svndumpfilter/main.c,

subversion/svnrdump/load_editor.c,

subversion/tests/libsvn_subr/mergeinfo-test.c

(...everywhere...): Use it.

  1. … 22 more files in changeset.
Silence conversion warnings by adding explicitly casts

* libsvn_client/patch.c

(readline, seek_to_line): always use svn_linenum_t to compare line nos

* libsvn_diff/diff_memory.c

(datasource_get_next_token): explicitly cast to unsigned as counts are >= 0

* libsvn_subr/adler32.c

(svn__adler32): cast len to 32 bits or whatever zlib supports; we only

call it for buffers < 1MB anyways.

* libsvn_subr/io.c

(stringbuf_from_aprfile): cast to unsigned as file sizes are never negative

* libsvn_subr/spillbuf.c

(read_data): same here for spillbuf sizes

* tests/libsvn_subr/mergeinfo-test.c

(test_merge_mergeinfo): cast count to int to match our internal structs

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

(base_dir_insert_remove): cast up to size_t since we are working with sizes

  1. … 6 more files in changeset.
Expose svn_rangelist__parse() as a private API and use it to simplify some

rangelist tests. This exposes a bug in svn_rangelist_merge() so mark the

test for that as XFAIL.

The bug is that svn_rangelist_merge() doesn't always ensure its output is

minimal, contrary to its doc string. The test was previously parsing the

input data with svn_mergeinfo_parse() instead of svn_rangelist__parse(), and

svn_mergeinfo_parse() condenses the ranges so svn_rangelist_merge() was not

getting the intended non-canonical input.

* subversion/include/private/svn_mergeinfo_private.h,

subversion/libsvn_subr/mergeinfo.c

(svn_rangelist__parse): New function.

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

(test_rangelist_reverse, test_rangelist_intersect, test_remove_rangelist,

test_rangelist_merge, test_rangelist_diff): Use svn_rangelist__parse()

instead of svn_mergeinfo_parse() and so remove "path: " prefixes from

the test data.

(test_funcs): Mark 'test_rangelist_merge' as XFAIL.

  1. … 2 more files in changeset.
* subversion/tests/libsvn_subr/mergeinfo-test.c

(test_merge_mergeinfo): Simplify, and eliminate some bugs in the error

messages, by using an existing function to check the results.

For issue 4032, make the server be graceful on non-canonical paths

in svn:mergeinfo.

* subversion/libsvn_subr/mergeinfo.c

(parse_pathname): Change parameter type, canonicalize the returned path.

(parse_revision_line): Change variable type.

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

(NBR_MERGEINFO_VALS, mergeinfo_vals, mergeinfo_paths,

mergeinfo_ranges): New test cases.

  1. … 1 more file in changeset.
The *rest* of r1181090!

* subversion/libsvn_subr/sorts.c

(svn_sort__array_delete): Don't assume we are only removing one element;

since r1181090 we may remove many.

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

(test_rangelist_merge): Add a test that exercises the above modified block.

  1. … 1 more file in changeset.
Tweak the svn_rangelist_merge2 API so it allocates new svn_merge_range_t

elements only when absolutely necessary.

This addresses a serious inefficiency in memory usage when

svn_mergeinfo_catalog_merge, svn_mergeinfo_merge2, or svn_rangelist_merge2

are called in a loop. Prior to this change svn_rangelist_merge2 could

potentially reallocate *every* range in both rangelists.

For example, the peak working set memory for the reintegrate merge described

here http://svn.haxx.se/dev/archive-2011-09/0254.shtml was 1,324,664 KB

with trunk@1179545. With this commit that drops to 26,880 KB.

* subversion/include/svn_sorts.h

(svn_sort__array_delete): New.

* subversion/libsvn_subr/sorts.c

(svn_sort__array_delete): New, moved here from

subversion/libsvn_client/merge.c:remove_element_from_array.

* subversion/libsvn_client/merge.c

(remove_element_from_array): Remove -- replacing it with

svn_sort__array_delete.

(remove_absent_children,

remove_children_with_deleted_mergeinfo): Replace remove_element_from_array

with svn_sort__array_delete.

* subversion/libsvn_subr/mergeinfo.c

(adjust_remaining_ranges): New.

(svn_rangelist_merge2): We are not creating a new rangelist, so modify

the output rangelist in-place as much as possible. Previously we used

combine_with_lastrange, which happily reallocated most of the ranges

in both rangelists. This is fine for the other callers (i.e.

svn_rangelist_intersect, svn_rangelist_remove, and

svn_mergeinfo__filter_mergeinfo_by_ranges) which are allocating a new

output argument, but not for svn_rangelist_merge2 which is *not*

allocating a new rangelist.

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

(test_rangelist_merge): Add some new test cases to exercise all the code

paths in svn_rangelist_merge2 and adjust_remaining_ranges.

  1. … 4 more files in changeset.
Remove deprecation warnings in various tests. We explicitly allow tests

to use deprecated APIs as a way of spot-testing the backward compat wrappers.

* subversion/tests/libsvn_subr/target-test.c,

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

subversion/tests/libsvn_ra_local/ra-local-test.c,

subversion/tests/libsvn_repos/dir-delta-editor.c,

subversion/tests/cmdline/entries-dump.c:

Define SVN_DEPRECATED before including any Subversion headers.

  1. … 4 more files in changeset.
Just padding my stats.

(Actually, doing my regular trailing whitespace removal, similar to r875968.)

* everywhere:

for extsn in c h cpp java py pl rb; do

sed -i -e 's/[ \t]*$//' `find . -name "*.$extsn" | xargs grep '[ \t]$' -l`

done

  1. … 166 more files in changeset.
Rework svn_mergeinfo__remove_prefix_from_catalog() so that its output

is more consistent with Subversion path handling/passing semantics.

* subversion/include/private/svn_mergeinfo_private.h

(svn_mergeinfo__remove_prefix_from_catalog): Update docstring to

indicate new stricter (and more useful!) semantics.

* subversion/libsvn_subr/mergeinfo.c

(svn_mergeinfo__remove_prefix_from_catalog): Rename 'prefix' to

'prefix_path', and rework this function's logic to always return

paths relative to the prefix path. (That is, suitable for

path_join'ing back to that prefix path to get the originals.)

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

(struct catalog_bits): New test data structure.

(remove_prefix_helper, test_remove_prefix_from_catalog): New functions.

(test_funcs): Add reference to test_remove_prefix_from_catalog().

  1. … 2 more files in changeset.
Tighten merge-range validation to not allow "change number r0" aka "revision

range -1:Y".

* subversion/libsvn_client/mergeinfo.c

(filter_log_entry_with_rangelist): Ignore revision 0 because that doesn't

represent a mergeable change.

* subversion/libsvn_subr/mergeinfo.c

(IS_VALID_FORWARD_RANGE): New macro.

(get_type_of_intersection): Use IS_VALID_FORWARD_RANGE() for tighter

validation of arguments than before: it previously accepted "change 0".

(range_intersect, range_contains): Validate arguments. Add doc strings.

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

(randomly_fill_rev_array, rev_array_to_rangelist): Expand doc strings.

(test_rangelist_remove_randomly, test_rangelist_intersect_randomly): Don't

ever include change number r0 in a merge range.

  1. … 2 more files in changeset.
Fix a bug where the ordering of arguments to svn_rangelist_intersect can

produce different results.

* subversion/include/svn_mergeinfo.h

(svn_mergeinfo_intersect2):

(svn_rangelist_intersect):

Correct/improve doc strings to reflect long standing behaviors regarding

rangelist intersection and range inheritance.

* subversion/libsvn_subr/mergeinfo.c

(rangelist_intersect_or_remove): Fix bug where the order of arguments

could effect the result when finding an intersection. Address an old

### FIXME by adjusting argument names and comments to apply to either

an intersection or removal (i.e. make them generic).

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

(test_rangelist_intersect): Test that order of rangelists passed to

svn_rangelist_intersect() don't effect the result. Test that the

intersection of two ranges is non-inheritable only when both ranges

are non-inheritable. Lastly, test that ranges of differing inheritance

do not intersect when considering inheritance.

  1. … 2 more files in changeset.
Add "const" to all "apr_array_header_t *" input parameters in public and

private APIs.

(Note that we are allowed to add "const" to a pointer parameter of a public

API, and have done so before, because that is a backward-compatible API

change and doesn't change the ABI at all.)

The public functions whose prototypes are changed are listed individually

below; the private functions are not.

* subversion/include/svn_auth.h

(svn_auth_open)

* subversion/include/svn_client.h

(svn_client_get_commit_log_t,

svn_client_copy5,

svn_client_copy4,

svn_client_move5,

svn_client_patch)

* subversion/include/svn_delta.h

(svn_delta_path_driver,

svn_file_rev_handler_t,

svn_file_rev_handler_old_t)

* subversion/include/svn_fs.h

(svn_fs_change_txn_props)

* subversion/include/svn_mergeinfo.h

(svn_rangelist_diff,

svn_rangelist_merge,

svn_rangelist_remove,

svn_rangelist_intersect,

svn_rangelist_inheritable2,

svn_rangelist_inheritable,

svn_rangelist_dup)

* subversion/include/svn_opt.h

(svn_opt_args_to_target_array3,

svn_opt_args_to_target_array2,

svn_opt_args_to_target_array,

svn_opt_eat_peg_revisions)

* subversion/include/svn_ra.h

(svn_ra_file_rev_handler_t,

svn_ra_get_locations,

svn_ra_plugin_t.get_locations)

* subversion/include/svn_ra_svn.h

(svn_ra_svn_command_handler,

svn_ra_svn_set_capabilities,

svn_ra_svn_parse_tuple,

svn_ra_svn_parse_proplist)

* subversion/include/svn_repos.h

(svn_repos_file_rev_handler_t,

svn_repos_trace_node_locations,

svn_repos_fs_get_mergeinfo,

svn_repos_fs_change_txn_props,

svn_repos_remember_client_capabilities)

* subversion/include/svn_sorts.h

(svn_sort__bsearch_lower_bound)

* subversion/include/svn_string.h

(svn_cstring_match_glob_list)

* subversion/include/svn_wc.h

(svn_wc_get_status_editor3,

svn_wc_get_update_editor4,

svn_wc_get_update_editor3,

svn_wc_get_switch_editor4,

svn_wc_get_switch_editor3,

svn_wc_match_ignore_list)

* subversion/include/private/svn_cmdline_private.h

* subversion/include/private/svn_opt_private.h

* subversion/libsvn_client/blame.c

* subversion/libsvn_client/client.h

* subversion/libsvn_client/commit.c

* subversion/libsvn_client/commit_util.c

* subversion/libsvn_client/copy.c

* subversion/libsvn_client/deprecated.c

* subversion/libsvn_client/merge.c

* subversion/libsvn_client/mergeinfo.c

* subversion/libsvn_client/mergeinfo.h

* subversion/libsvn_client/patch.c

* subversion/libsvn_client/ra.c

* subversion/libsvn_delta/compat.c

* subversion/libsvn_delta/path_driver.c

* subversion/libsvn_fs_base/reps-strings.c

* subversion/libsvn_fs_base/revs-txns.c

* subversion/libsvn_fs_base/revs-txns.h

* subversion/libsvn_fs_fs/fs_fs.c

* subversion/libsvn_fs_fs/fs_fs.h

* subversion/libsvn_fs/fs-loader.c

* subversion/libsvn_fs/fs-loader.h

* subversion/libsvn_ra/compat.c

* subversion/libsvn_ra/ra_loader.c

* subversion/libsvn_ra/ra_loader.h

* subversion/libsvn_ra/wrapper_template.h

* subversion/libsvn_ra_local/ra_plugin.c

* subversion/libsvn_ra_neon/get_locations.c

* subversion/libsvn_ra_neon/props.c

* subversion/libsvn_ra_neon/ra_neon.h

* subversion/libsvn_ra_serf/getlocations.c

* subversion/libsvn_ra_serf/ra_serf.h

* subversion/libsvn_ra_svn/client.c

* subversion/libsvn_ra_svn/cyrus_auth.c

* subversion/libsvn_ra_svn/editorp.c

* subversion/libsvn_ra_svn/internal_auth.c

* subversion/libsvn_ra_svn/marshal.c

* subversion/libsvn_ra_svn/ra_svn.h

* subversion/libsvn_repos/fs-wrap.c

* subversion/libsvn_repos/log.c

* subversion/libsvn_repos/repos.c

* subversion/libsvn_repos/repos.h

* subversion/libsvn_repos/rev_hunt.c

* subversion/libsvn_subr/auth.c

* subversion/libsvn_subr/cmdline.c

* subversion/libsvn_subr/deprecated.c

* subversion/libsvn_subr/mergeinfo.c

* subversion/libsvn_subr/opt.c

* subversion/libsvn_subr/sorts.c

* subversion/libsvn_subr/svn_string.c

* subversion/libsvn_wc/adm_ops.c

* subversion/libsvn_wc/deprecated.c

* subversion/libsvn_wc/diff.c

* subversion/libsvn_wc/status.c

* subversion/libsvn_wc/update_editor.c

* subversion/libsvn_wc/util.c

* subversion/mod_dav_svn/dav_svn.h

* subversion/mod_dav_svn/reports/file-revs.c

* subversion/mod_dav_svn/util.c

* subversion/svn/cl.h

* subversion/svn/props.c

* subversion/svn/switch-cmd.c

* subversion/svn/util.c

* subversion/svndumpfilter/main.c

* subversion/svnserve/serve.c

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

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

  1. … 78 more files in changeset.
Trailing whitespace scrub.

* subversion/libsvn_subr/prompt.c,

subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java,

subversion/bindings/javahl/tests/org/tigris/subversion/javahl/BasicTests.java,

subversion/bindings/javahl/native/CreateJ.cpp,

subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java,

subversion/bindings/javahl/src/org/apache/subversion/javahl/NativeResources.java,

subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNClient.java,

subversion/bindings/javahl/src/org/tigris/subversion/javahl/Info2.java,

subversion/bindings/javahl/src/org/tigris/subversion/javahl/SVNAdmin.java,

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

subversion/bindings/swig/ruby/test/test_wc.rb,

subversion/bindings/swig/ruby/svn/wc.rb,

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

subversion/tests/cmdline/mergeinfo_tests.py,

subversion/tests/cmdline/log_tests.py,

subversion/tests/cmdline/upgrade_tests.py,

subversion/tests/cmdline/lock_tests.py,

subversion/tests/cmdline/switch_tests.py,

subversion/tests/cmdline/merge_authz_tests.py,

subversion/tests/cmdline/update_tests.py,

subversion/tests/cmdline/svntest/actions.py,

subversion/tests/cmdline/patch_tests.py,

subversion/tests/cmdline/merge_tests.py,

subversion/tests/cmdline/checkout_tests.py,

subversion/tests/libsvn_fs_fs/fs-pack-test.c,

subversion/libsvn_ra_svn/client.c,

subversion/svn/cl.h,

subversion/svn/notify.c,

subversion/include/svn_io.h,

subversion/include/svn_wc.h,

subversion/include/private/svn_wc_private.h,

subversion/libsvn_wc/util.c,

subversion/libsvn_wc/adm_ops.c,

subversion/libsvn_wc/status.c,

subversion/libsvn_wc/update_editor.c,

subversion/libsvn_wc/wc_db.c,

subversion/libsvn_wc/wc_db.h,

subversion/libsvn_wc/upgrade.c,

subversion/libsvn_wc/workqueue.c,

subversion/libsvn_client/switch.c,

subversion/libsvn_client/externals.c,

subversion/libsvn_client/merge.c,

subversion/libsvn_client/patch.c,

subversion/libsvn_client/revert.c,

subversion/libsvn_client/copy.c,

subversion/libsvn_client/mergeinfo.c,

subversion/libsvn_client/update.c,

subversion/libsvn_client/commit_util.c,

subversion/libsvn_client/cleanup.c,

subversion/libsvn_ra_neon/ra_neon.h,

subversion/libsvn_repos/load.c,

subversion/libsvn_fs_fs/fs_fs.c,

subversion/libsvn_fs_fs/fs.h,

build/generator/gen_vcnet_vcproj.py,

build/generator/gen_win.py:

Scrub trailing whitespace.

  1. … 54 more files in changeset.
When producing svn_mergeinfo_t from string representations or vice-versa,

tolerate relative merge source paths, but convert such paths to absolute

paths in the resulting string/mergeinfo.

This addresses the problem we have in our own repository, where issue #3547

converted all the merge source paths in our mergeinfo to relative paths, see

http://mail-archives.apache.org/mod_mbox/subversion-dev/200912.mbox/browser.

* subversion/include/private/svn_mergeinfo_private.h

(svn_mergeinfo__catalog_to_formatted_string,

svn_mergeinfo__to_formatted_string): Document new behavior.

* subversion/include/svn_mergeinfo.h

(svn_mergeinfo_parse,

svn_mergeinfo_to_string): Document new behavior.

(parse_revision_line): If mergeinfo has merge source paths that differ

only by a leading slash, combine them.

* subversion/libsvn_subr/mergeinfo.c

(parse_pathname,

mergeinfo_to_stringbuf): Convert relative paths to absolute.

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

(const mergeinfo_paths): Mergeinfo produced by svn_mergeinfo_parse() now

expects absolute merge source paths, even when the input was relative.

(test_mergeinfo_to_string): Expand test to cover new expected behavior

when converting svn_mergeinfo_t to a string representation.

  1. … 3 more files in changeset.
Test out my new and fancy ASF commit priviledges by changing the copyright

wording in our license headers to reflect ownership by the ASF.

* NOTICE:

Change terminology to ASF, and update a link.

* subversion/libsvn_subr/opt.c

(svn_opt__print_version_info): Note that the product as a whole is

copyrighted by the ASF, and update the project website.

* everywhere:

Change license text to reflect ASF ownership.

  1. … 891 more files in changeset.
Fix bug where svn_[rangelist | mergeinfo]_[merge | intersect | remove | diff]

APIs could modify their *non*-output arguments.

* subversion/libsvn_subr/mergeinfo.c

(combine_ranges): The output variable for the svn_merge_range_t argument

in this function does not need to be a pointer to a pointer, one pointer

is enough since we are not allocating it.

(intersection_type_t): New file local enum.

(get_type_of_intersection): New.

(combine_with_lastrange): Clean sheet reimplementation which fixes bug

where non-output arguments to various svn_mergeinfo_* and svn_rangelist_*

APIs where getting modified. Also does away with the DUP_MRANGE argument

since *every* caller was passing TRUE. Also makes the code (hopefully) a

bit easier to understand.

(svn_rangelist_merge, rangelist_intersect_or_remove): Update calls to

combine_with_lastrange().

* subversion/libsvn_client/merge.c

(fix_deleted_subtree_ranges): If a rangelist describes a reverse merge

then reverse it before passing it to the svn_rangelist_diff() API, which

is, like most svn_rangelist_* APIs, intended to work with forward ranges

only. Through dumb luck our test suite's limited exercising of this

code passed, but the rewrite of combine_with_lastrange() does not (as it

should not).

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

(test_merge_mergeinfo, test_remove_rangelist, test_rangelist_merge): When

testing the svn_mergeinfo_merge, svn_rangelist_remove, and

svn_rangelist_merge APIs, check that the non-output mergeinfo or

rangelist arguments are not modified.

  1. … 2 more files in changeset.
Relicense Subversion under the Apache License, Version 2.0.

* NOTICE: New.

* LICENSE: New.

* COPYING,

subversion/LICENSE: Remove.

* subversion/libsvn_subr/opt.c

(svn_opt__print_version_info): Note that the product as a whole is

copyrighted by the SVN Corp, and that it contains contributions from

many people, as referenced in NOTICE.

* subversion/bindings/swig/python/LICENSE_FOR_PYTHON_BINDINGS:

Relicense the SVN parts under Apache 2.0.

* everywhere:

Change copyright notices in file headers to reflect the Apache 2.0 license.

  1. … 882 more files in changeset.
Replace deprecated test func macros in the C tests. This eliminates the need

to do the following dance in every test function:

*msg = "foo";

if (msg_only)

return SVN_NO_ERROR;

This does not remove the deprecated symbols from svn_test.h; I plan to do it

in a follow up commit.

[ in subversion/tests ]

* libsvn_client/client-test.c,

libsvn_delta/random-test.c,

libsvn_delta/range-index-test.h,

libsvn_delta/window-test.c,

libsvn_diff/diff-diff3-test.c,

libsvn_diff/parse-diff-test.c,

libsvn_fs/fs-test.c,

libsvn_fs/locks-test.c,

libsvn_fs_base/changes-test.c,

libsvn_fs_base/fs-base-test.c,

libsvn_fs_base/key-test.c,

libsvn_fs_base/strings-reps-test.c,

libsvn_fs_fs/fs-pack-test.c,

libsvn_ra_local/ra-local-test.c,

libsvn_repos/repos-test.c,

libsvn_subr/auth-test.c,

libsvn_subr/cache-test.c,

libsvn_subr/checksum-test.c,

libsvn_subr/compat-test.c,

libsvn_subr/config-test.c,

libsvn_subr/dirent_uri-test.c,

libsvn_subr/error-test.c,

libsvn_subr/hashdump-test.c,

libsvn_subr/mergeinfo-test.c,

libsvn_subr/opt-test.c,

libsvn_subr/path-test.c,

libsvn_subr/revision-test.c,

libsvn_subr/skel-test.c,

libsvn_subr/stream-test.c,

libsvn_subr/string-test.c,

libsvn_subr/target-test.c,

libsvn_subr/time-test.c,

libsvn_subr/translate-test.c,

libsvn_subr/utf-test.c,

libsvn_wc/tree-conflict-data-test.c:

Do the above described transformation.

  1. … 34 more files in changeset.
* subversion/tests/libsvn_subr/mergeinfo-test.c

(NBR_MERGEINFO_VALS, mergeinfo_vals, mergeinfo_paths):

Following up on r35466, issue #3302, show that a range completely

inside another range shrinks the largest range to end at the end of the

shorter range. (1-77,12-44 => 1-44).

Found by: me

(While reviewing r35466 for backport)

Replace the expressions "? TRUE : FALSE" and "? FALSE : TRUE", which are ugly

and redundant or almost redundant, with more direct ways to express the

boolean test that is meant, throughout the C code base. No functional change.

The changes are similar to these:

boolean ? TRUE : FALSE => boolean

boolean ? FALSE : TRUE => ! (boolean)

x == y ? FALSE : TRUE => x != y

pointer ? TRUE : FALSE => pointer != NULL

integer ? FALSE : TRUE => integer != 0

etc.

  1. … 36 more files in changeset.
Fix another symptom of issue #3302.

Like unordered rangelists (see r35297 and r35358) it appears that

svnmerge-migrate-history*.py can create svn:mergeinfo properties that are

considered invalid by svn_mergeinfo_parse(). This time the problem is

overlapping ranges: http://svn.haxx.se/users/archive-2009-01/0490.shtml.

I've been unable to replicate the problem with svnmerge-migrate-history*.py

but like with the unordered ranges, it would be nice to save users from

encountering parsing failures for overlapping ranges. This commit allows

svn_mergeinfo_parse() to tolerate overlapping rangelists of the *same*

inheritance type, while still guaranteeing the mergeinfo it creates has

no overlapping rangelists, which is what the rest of our rangelist

manipulating APIs require.

Note that it is still a parsing error if the overlapping ranges have

differing inheritance types, e.g. mergeinfo like '/trunk:3-10,5-15*' is

still invalid and will result in an error.

* subversion/include/svn_mergeinfo.h

(svn_mergeinfo_parse): Tweak doc string to reflect loosened restrictions.

* subversion/libsvn_subr/mergeinfo.c

(parse_revision_line): Parse overlapping ranges of the same

inheritance type, but combine them into a single range.

* subversion/tests/cmdline/prop_tests.py

(inappropriate_props): Adjust two attempts to set invalid mergeinfo,

instead of overlapping ranges of the same inheritance type, which now

succeeds, try overlapping ranges of different inheritance, which should

still fail.

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

(NBR_MERGEINFO_VALS, mergeinfo_vals, mergeinfo_paths): Add some new test

cases for test_parse_single_line_mergeinfo().

(NBR_BROKEN_MERGEINFO_VALS, broken_mergeinfo_vals): Add some new test

cases for test_parse_broken_mergeinfo().

  1. … 3 more files in changeset.
Fix a symptom of issue #3302.

Though I still don't know *how* it can happen, it appears that it is (was?)

possible for svnmerge-migrate-history.py to convert svnmerge-integrated

properties into svn:mergeinfo properties with unordered rangelists. This

breaks any subcommand which encounters this mergeinfo (you know, useful

little things like svn merge and log -g) when svn_mergeinfo_parse()

encounters the unordered rangelists.

Even if we fix svnmerge-migrate-history.py (issue #3302 even if it needs

fixing that is) it would be nice to save users from encountering this

problem. So this commit allows svn_mergeinfo_parse() to tolerate unordered

rangelists while still guaranteeing the mergeinfo it creates has sorted

rangelists -- so there is still no way via the command line to set or

otherwise create unordered mergeinfo in the repository.

* subversion/include/svn_mergeinfo.h

(svn_mergeinfo_parse): Tweak doc string to reflect loosened restrictions.

* subversion/libsvn_subr/mergeinfo.c

(combine_with_adjacent_lastrange): Remove. Among other things this

function enforced the no overlapping revision ranges and no unordered

revision ranges restrictions of svn_mergeinfo_parse().

(parse_revlist): Don't combine adjacent ranges here, just push each one

onto the rangelist.

(parse_revision_line): Sort the rangelist created by parse_revlist(),

then collapse adjacent ranges, and make sure there are no overlapping

ranges.

* subversion/libsvn_wc/props.c

(svn_wc_canonicalize_svn_prop): Ensure that canonical svn:mergeinfo

has sorted rangelists.

* subversion/tests/cmdline/prop_tests.py

(inappropriate_props): Stop expecting a propset of unordered mergeinfo

to fail.

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

(MAX_NBR_RANGES, NBR_MERGEINFO_VALS, mergeinfo_vals, mergeinfo_paths,

mergeinfo_ranges): Add some test data for test_parse_single_line_mergeinfo

which tries to parse mergeinfo with unordered rangelists. Expect these to

succeed, but for the results to be sorted.

(NBR_BROKEN_MERGEINFO_VALS, broken_mergeinfo_vals): Remove some test data

for test_parse_broken_mergeinfo().

  1. … 4 more files in changeset.