aboutsummaryrefslogtreecommitdiffstats
path: root/subversion
diff options
context:
space:
mode:
authorPeter Wemm <peter@FreeBSD.org>2015-10-12 08:54:49 +0000
committerPeter Wemm <peter@FreeBSD.org>2015-10-12 08:54:49 +0000
commitdc5d469d6574e9fb03bdd793658bb371315b306a (patch)
tree013c2e6845398e5a9ca4901dcc077769c7520e1d /subversion
parent58218291fa73a17020ef0447398e9e8a78f9e8c7 (diff)
downloadsrc-dc5d469d6574e9fb03bdd793658bb371315b306a.tar.gz
src-dc5d469d6574e9fb03bdd793658bb371315b306a.zip
Vendor import of subversion-1.9.2vendor/subversion/subversion-1.9.2
Notes
Notes: svn path=/vendor/subversion/dist/; revision=289177 svn path=/vendor/subversion/subversion-1.9.2/; revision=289178; tag=vendor/subversion/subversion-1.9.2
Diffstat (limited to 'subversion')
-rw-r--r--subversion/include/mod_dav_svn.h37
-rw-r--r--subversion/include/private/svn_atomic.h25
-rw-r--r--subversion/include/private/svn_auth_private.h10
-rw-r--r--subversion/include/private/svn_cache.h83
-rw-r--r--subversion/include/private/svn_client_mtcc.h226
-rw-r--r--subversion/include/private/svn_client_private.h84
-rw-r--r--subversion/include/private/svn_cmdline_private.h18
-rw-r--r--subversion/include/private/svn_delta_private.h23
-rw-r--r--subversion/include/private/svn_dep_compat.h88
-rw-r--r--subversion/include/private/svn_diff_private.h6
-rw-r--r--subversion/include/private/svn_diff_tree.h11
-rw-r--r--subversion/include/private/svn_editor.h81
-rw-r--r--subversion/include/private/svn_error_private.h2
-rw-r--r--subversion/include/private/svn_fs_fs_private.h355
-rw-r--r--subversion/include/private/svn_fs_private.h17
-rw-r--r--subversion/include/private/svn_fs_util.h25
-rw-r--r--subversion/include/private/svn_io_private.h99
-rw-r--r--subversion/include/private/svn_log.h4
-rw-r--r--subversion/include/private/svn_magic.h6
-rw-r--r--subversion/include/private/svn_mergeinfo_private.h8
-rw-r--r--subversion/include/private/svn_mutex.h16
-rw-r--r--subversion/include/private/svn_named_atomic.h162
-rw-r--r--subversion/include/private/svn_object_pool.h154
-rw-r--r--subversion/include/private/svn_opt_private.h4
-rw-r--r--subversion/include/private/svn_packed_data.h255
-rw-r--r--subversion/include/private/svn_pseudo_md5.h83
-rw-r--r--subversion/include/private/svn_ra_private.h27
-rw-r--r--subversion/include/private/svn_ra_svn_private.h142
-rw-r--r--subversion/include/private/svn_repos_private.h278
-rw-r--r--subversion/include/private/svn_sorts_private.h227
-rw-r--r--subversion/include/private/svn_sqlite.h25
-rw-r--r--subversion/include/private/svn_string_private.h130
-rw-r--r--subversion/include/private/svn_subr_private.h389
-rw-r--r--subversion/include/private/svn_temp_serializer.h16
-rw-r--r--subversion/include/private/svn_utf_private.h176
-rw-r--r--subversion/include/private/svn_wc_private.h189
-rw-r--r--subversion/include/svn_auth.h40
-rw-r--r--subversion/include/svn_cache_config.h5
-rw-r--r--subversion/include/svn_checksum.h12
-rw-r--r--subversion/include/svn_client.h356
-rw-r--r--subversion/include/svn_cmdline.h47
-rw-r--r--subversion/include/svn_compat.h12
-rw-r--r--subversion/include/svn_config.h85
-rw-r--r--subversion/include/svn_delta.h25
-rw-r--r--subversion/include/svn_diff.h189
-rw-r--r--subversion/include/svn_dirent_uri.h17
-rw-r--r--subversion/include/svn_error.h61
-rw-r--r--subversion/include/svn_error_codes.h208
-rw-r--r--subversion/include/svn_fs.h822
-rw-r--r--subversion/include/svn_hash.h1
-rw-r--r--subversion/include/svn_io.h230
-rw-r--r--subversion/include/svn_iter.h2
-rw-r--r--subversion/include/svn_mergeinfo.h103
-rw-r--r--subversion/include/svn_opt.h10
-rw-r--r--subversion/include/svn_path.h12
-rw-r--r--subversion/include/svn_props.h13
-rw-r--r--subversion/include/svn_ra.h120
-rw-r--r--subversion/include/svn_ra_svn.h36
-rw-r--r--subversion/include/svn_repos.h826
-rw-r--r--subversion/include/svn_sorts.h78
-rw-r--r--subversion/include/svn_string.h91
-rw-r--r--subversion/include/svn_types.h79
-rw-r--r--subversion/include/svn_version.h71
-rw-r--r--subversion/include/svn_wc.h287
-rw-r--r--subversion/include/svn_x509.h201
-rw-r--r--subversion/include/svn_xml.h4
-rw-r--r--subversion/libsvn_auth_gnome_keyring/libsvn_auth_gnome_keyring.pc.in12
-rw-r--r--subversion/libsvn_auth_kwallet/kwallet.cpp65
-rw-r--r--subversion/libsvn_auth_kwallet/libsvn_auth_kwallet.pc.in12
-rw-r--r--subversion/libsvn_client/add.c143
-rw-r--r--subversion/libsvn_client/blame.c307
-rw-r--r--subversion/libsvn_client/cat.c67
-rw-r--r--subversion/libsvn_client/checkout.c81
-rw-r--r--subversion/libsvn_client/cleanup.c228
-rw-r--r--subversion/libsvn_client/client.h210
-rw-r--r--subversion/libsvn_client/cmdline.c15
-rw-r--r--subversion/libsvn_client/commit.c266
-rw-r--r--subversion/libsvn_client/commit_util.c87
-rw-r--r--subversion/libsvn_client/compat_providers.c4
-rw-r--r--subversion/libsvn_client/copy.c1035
-rw-r--r--subversion/libsvn_client/copy_foreign.c20
-rw-r--r--subversion/libsvn_client/ctx.c39
-rw-r--r--subversion/libsvn_client/delete.c21
-rw-r--r--subversion/libsvn_client/deprecated.c135
-rw-r--r--subversion/libsvn_client/diff.c2066
-rw-r--r--subversion/libsvn_client/diff_local.c1077
-rw-r--r--subversion/libsvn_client/diff_summarize.c338
-rw-r--r--subversion/libsvn_client/export.c8
-rw-r--r--subversion/libsvn_client/externals.c138
-rw-r--r--subversion/libsvn_client/import.c191
-rw-r--r--subversion/libsvn_client/info.c120
-rw-r--r--subversion/libsvn_client/iprops.c6
-rw-r--r--subversion/libsvn_client/libsvn_client.pc.in12
-rw-r--r--subversion/libsvn_client/list.c120
-rw-r--r--subversion/libsvn_client/locking_commands.c333
-rw-r--r--subversion/libsvn_client/log.c58
-rw-r--r--subversion/libsvn_client/merge.c554
-rw-r--r--subversion/libsvn_client/mergeinfo.c85
-rw-r--r--subversion/libsvn_client/mergeinfo.h6
-rw-r--r--subversion/libsvn_client/mtcc.c1429
-rw-r--r--subversion/libsvn_client/patch.c287
-rw-r--r--subversion/libsvn_client/prop_commands.c127
-rw-r--r--subversion/libsvn_client/ra.c127
-rw-r--r--subversion/libsvn_client/relocate.c125
-rw-r--r--subversion/libsvn_client/repos_diff.c15
-rw-r--r--subversion/libsvn_client/resolved.c8
-rw-r--r--subversion/libsvn_client/revert.c46
-rw-r--r--subversion/libsvn_client/revisions.c1
-rw-r--r--subversion/libsvn_client/status.c81
-rw-r--r--subversion/libsvn_client/switch.c10
-rw-r--r--subversion/libsvn_client/update.c168
-rw-r--r--subversion/libsvn_client/upgrade.c16
-rw-r--r--subversion/libsvn_client/util.c12
-rw-r--r--subversion/libsvn_delta/compat.c95
-rw-r--r--subversion/libsvn_delta/compose_delta.c48
-rw-r--r--subversion/libsvn_delta/debug_editor.c33
-rw-r--r--subversion/libsvn_delta/debug_editor.h7
-rw-r--r--subversion/libsvn_delta/editor.c77
-rw-r--r--subversion/libsvn_delta/libsvn_delta.pc.in12
-rw-r--r--subversion/libsvn_delta/path_driver.c11
-rw-r--r--subversion/libsvn_delta/svndiff.c375
-rw-r--r--subversion/libsvn_delta/text_delta.c114
-rw-r--r--subversion/libsvn_delta/xdelta.c142
-rw-r--r--subversion/libsvn_diff/binary_diff.c221
-rw-r--r--subversion/libsvn_diff/deprecated.c175
-rw-r--r--subversion/libsvn_diff/diff4.c2
-rw-r--r--subversion/libsvn_diff/diff_file.c198
-rw-r--r--subversion/libsvn_diff/diff_memory.c204
-rw-r--r--subversion/libsvn_diff/lcs.c2
-rw-r--r--subversion/libsvn_diff/libsvn_diff.pc.in12
-rw-r--r--subversion/libsvn_diff/parse-diff.c223
-rw-r--r--subversion/libsvn_diff/util.c43
-rw-r--r--subversion/libsvn_fs/access.c7
-rw-r--r--subversion/libsvn_fs/deprecated.c90
-rw-r--r--subversion/libsvn_fs/editor.c60
-rw-r--r--subversion/libsvn_fs/fs-loader.c735
-rw-r--r--subversion/libsvn_fs/fs-loader.h136
-rw-r--r--subversion/libsvn_fs/libsvn_fs.pc.in12
-rw-r--r--subversion/libsvn_fs_base/bdb/changes-table.c81
-rw-r--r--subversion/libsvn_fs_base/bdb/locks-table.c2
-rw-r--r--subversion/libsvn_fs_base/bdb/strings-table.c4
-rw-r--r--subversion/libsvn_fs_base/dag.c39
-rw-r--r--subversion/libsvn_fs_base/dag.h2
-rw-r--r--subversion/libsvn_fs_base/fs.c149
-rw-r--r--subversion/libsvn_fs_base/fs.h12
-rw-r--r--subversion/libsvn_fs_base/id.c7
-rw-r--r--subversion/libsvn_fs_base/id.h6
-rw-r--r--subversion/libsvn_fs_base/key-gen.c36
-rw-r--r--subversion/libsvn_fs_base/key-gen.h7
-rw-r--r--subversion/libsvn_fs_base/libsvn_fs_base.pc.in12
-rw-r--r--subversion/libsvn_fs_base/lock.c148
-rw-r--r--subversion/libsvn_fs_base/lock.h27
-rw-r--r--subversion/libsvn_fs_base/reps-strings.c5
-rw-r--r--subversion/libsvn_fs_base/revs-txns.c45
-rw-r--r--subversion/libsvn_fs_base/tree.c177
-rw-r--r--subversion/libsvn_fs_fs/cached_data.c3383
-rw-r--r--subversion/libsvn_fs_fs/cached_data.h166
-rw-r--r--subversion/libsvn_fs_fs/caching.c356
-rw-r--r--subversion/libsvn_fs_fs/dag.c175
-rw-r--r--subversion/libsvn_fs_fs/dag.h68
-rw-r--r--subversion/libsvn_fs_fs/dump-index.c90
-rw-r--r--subversion/libsvn_fs_fs/fs.c300
-rw-r--r--subversion/libsvn_fs_fs/fs.h259
-rw-r--r--subversion/libsvn_fs_fs/fs_fs.c11592
-rw-r--r--subversion/libsvn_fs_fs/fs_fs.h507
-rw-r--r--subversion/libsvn_fs_fs/hotcopy.c1097
-rw-r--r--subversion/libsvn_fs_fs/hotcopy.h51
-rw-r--r--subversion/libsvn_fs_fs/id.c620
-rw-r--r--subversion/libsvn_fs_fs/id.h89
-rw-r--r--subversion/libsvn_fs_fs/index.c3470
-rw-r--r--subversion/libsvn_fs_fs/index.h356
-rw-r--r--subversion/libsvn_fs_fs/key-gen.c159
-rw-r--r--subversion/libsvn_fs_fs/key-gen.h91
-rw-r--r--subversion/libsvn_fs_fs/libsvn_fs_fs.pc.in12
-rw-r--r--subversion/libsvn_fs_fs/load-index.c98
-rw-r--r--subversion/libsvn_fs_fs/lock.c944
-rw-r--r--subversion/libsvn_fs_fs/lock.h25
-rw-r--r--subversion/libsvn_fs_fs/low_level.c1196
-rw-r--r--subversion/libsvn_fs_fs/low_level.h230
-rw-r--r--subversion/libsvn_fs_fs/pack.c2039
-rw-r--r--subversion/libsvn_fs_fs/pack.h64
-rw-r--r--subversion/libsvn_fs_fs/recovery.c509
-rw-r--r--subversion/libsvn_fs_fs/recovery.h36
-rw-r--r--subversion/libsvn_fs_fs/rep-cache-db.h10
-rw-r--r--subversion/libsvn_fs_fs/rep-cache-db.sql3
-rw-r--r--subversion/libsvn_fs_fs/rep-cache.c132
-rw-r--r--subversion/libsvn_fs_fs/rep-cache.h22
-rw-r--r--subversion/libsvn_fs_fs/rev_file.c306
-rw-r--r--subversion/libsvn_fs_fs/rev_file.h145
-rw-r--r--subversion/libsvn_fs_fs/revprops.c1381
-rw-r--r--subversion/libsvn_fs_fs/revprops.h159
-rw-r--r--subversion/libsvn_fs_fs/stats.c1255
-rw-r--r--subversion/libsvn_fs_fs/structure235
-rw-r--r--subversion/libsvn_fs_fs/structure-indexes352
-rw-r--r--subversion/libsvn_fs_fs/temp_serializer.c431
-rw-r--r--subversion/libsvn_fs_fs/temp_serializer.h57
-rw-r--r--subversion/libsvn_fs_fs/transaction.c3861
-rw-r--r--subversion/libsvn_fs_fs/transaction.h294
-rw-r--r--subversion/libsvn_fs_fs/tree.c1155
-rw-r--r--subversion/libsvn_fs_fs/tree.h17
-rw-r--r--subversion/libsvn_fs_fs/util.c694
-rw-r--r--subversion/libsvn_fs_fs/util.h408
-rw-r--r--subversion/libsvn_fs_fs/verify.c883
-rw-r--r--subversion/libsvn_fs_fs/verify.h42
-rw-r--r--subversion/libsvn_fs_util/fs-util.c117
-rw-r--r--subversion/libsvn_fs_util/libsvn_fs_util.pc.in12
-rw-r--r--subversion/libsvn_fs_x/TODO270
-rw-r--r--subversion/libsvn_fs_x/cached_data.c3355
-rw-r--r--subversion/libsvn_fs_x/cached_data.h180
-rw-r--r--subversion/libsvn_fs_x/caching.c725
-rw-r--r--subversion/libsvn_fs_x/changes.c536
-rw-r--r--subversion/libsvn_fs_x/changes.h132
-rw-r--r--subversion/libsvn_fs_x/dag.c1368
-rw-r--r--subversion/libsvn_fs_x/dag.h580
-rw-r--r--subversion/libsvn_fs_x/fs.c669
-rw-r--r--subversion/libsvn_fs_x/fs.h574
-rw-r--r--subversion/libsvn_fs_x/fs_id.c319
-rw-r--r--subversion/libsvn_fs_x/fs_id.h62
-rw-r--r--subversion/libsvn_fs_x/fs_x.c1228
-rw-r--r--subversion/libsvn_fs_x/fs_x.h202
-rw-r--r--subversion/libsvn_fs_x/hotcopy.c991
-rw-r--r--subversion/libsvn_fs_x/hotcopy.h53
-rw-r--r--subversion/libsvn_fs_x/id.c198
-rw-r--r--subversion/libsvn_fs_x/id.h135
-rw-r--r--subversion/libsvn_fs_x/index.c3981
-rw-r--r--subversion/libsvn_fs_x/index.h411
-rw-r--r--subversion/libsvn_fs_x/libsvn_fs_x.pc.in12
-rw-r--r--subversion/libsvn_fs_x/lock.c1492
-rw-r--r--subversion/libsvn_fs_x/lock.h116
-rw-r--r--subversion/libsvn_fs_x/low_level.c1123
-rw-r--r--subversion/libsvn_fs_x/low_level.h214
-rw-r--r--subversion/libsvn_fs_x/noderevs.c912
-rw-r--r--subversion/libsvn_fs_x/noderevs.h142
-rw-r--r--subversion/libsvn_fs_x/pack.c2324
-rw-r--r--subversion/libsvn_fs_x/pack.h65
-rw-r--r--subversion/libsvn_fs_x/recovery.c263
-rw-r--r--subversion/libsvn_fs_x/recovery.h37
-rw-r--r--subversion/libsvn_fs_x/rep-cache-db.h92
-rw-r--r--subversion/libsvn_fs_x/rep-cache-db.sql70
-rw-r--r--subversion/libsvn_fs_x/rep-cache.c416
-rw-r--r--subversion/libsvn_fs_x/rep-cache.h105
-rw-r--r--subversion/libsvn_fs_x/reps.c948
-rw-r--r--subversion/libsvn_fs_x/reps.h190
-rw-r--r--subversion/libsvn_fs_x/rev_file.c316
-rw-r--r--subversion/libsvn_fs_x/rev_file.h154
-rw-r--r--subversion/libsvn_fs_x/revprops.c1948
-rw-r--r--subversion/libsvn_fs_x/revprops.h184
-rw-r--r--subversion/libsvn_fs_x/string_table.c904
-rw-r--r--subversion/libsvn_fs_x/string_table.h133
-rw-r--r--subversion/libsvn_fs_x/structure336
-rw-r--r--subversion/libsvn_fs_x/temp_serializer.c1337
-rw-r--r--subversion/libsvn_fs_x/temp_serializer.h301
-rw-r--r--subversion/libsvn_fs_x/transaction.c3782
-rw-r--r--subversion/libsvn_fs_x/transaction.h316
-rw-r--r--subversion/libsvn_fs_x/tree.c4542
-rw-r--r--subversion/libsvn_fs_x/tree.h112
-rw-r--r--subversion/libsvn_fs_x/util.c777
-rw-r--r--subversion/libsvn_fs_x/util.h476
-rw-r--r--subversion/libsvn_fs_x/verify.c850
-rw-r--r--subversion/libsvn_fs_x/verify.h43
-rw-r--r--subversion/libsvn_ra/compat.c26
-rw-r--r--subversion/libsvn_ra/libsvn_ra.pc.in12
-rw-r--r--subversion/libsvn_ra/ra_loader.c418
-rw-r--r--subversion/libsvn_ra/ra_loader.h10
-rw-r--r--subversion/libsvn_ra/wrapper_template.h4
-rw-r--r--subversion/libsvn_ra_local/libsvn_ra_local.pc.in12
-rw-r--r--subversion/libsvn_ra_local/ra_local.h5
-rw-r--r--subversion/libsvn_ra_local/ra_plugin.c420
-rw-r--r--subversion/libsvn_ra_local/split_url.c6
-rw-r--r--subversion/libsvn_ra_serf/README2
-rw-r--r--subversion/libsvn_ra_serf/blame.c50
-rw-r--r--subversion/libsvn_ra_serf/blncache.c6
-rw-r--r--subversion/libsvn_ra_serf/blncache.h4
-rw-r--r--subversion/libsvn_ra_serf/commit.c1243
-rw-r--r--subversion/libsvn_ra_serf/eagain_bucket.c122
-rw-r--r--subversion/libsvn_ra_serf/get_deleted_rev.c18
-rw-r--r--subversion/libsvn_ra_serf/get_file.c425
-rw-r--r--subversion/libsvn_ra_serf/get_lock.c337
-rw-r--r--subversion/libsvn_ra_serf/getdate.c33
-rw-r--r--subversion/libsvn_ra_serf/getlocations.c32
-rw-r--r--subversion/libsvn_ra_serf/getlocationsegments.c36
-rw-r--r--subversion/libsvn_ra_serf/getlocks.c50
-rw-r--r--subversion/libsvn_ra_serf/inherited_props.c195
-rw-r--r--subversion/libsvn_ra_serf/libsvn_ra_serf.pc.in12
-rw-r--r--subversion/libsvn_ra_serf/lock.c679
-rw-r--r--subversion/libsvn_ra_serf/locks.c669
-rw-r--r--subversion/libsvn_ra_serf/log.c83
-rw-r--r--subversion/libsvn_ra_serf/merge.c92
-rw-r--r--subversion/libsvn_ra_serf/mergeinfo.c27
-rw-r--r--subversion/libsvn_ra_serf/multistatus.c752
-rw-r--r--subversion/libsvn_ra_serf/options.c148
-rw-r--r--subversion/libsvn_ra_serf/property.c760
-rw-r--r--subversion/libsvn_ra_serf/ra_serf.h710
-rw-r--r--subversion/libsvn_ra_serf/replay.c954
-rw-r--r--subversion/libsvn_ra_serf/serf.c843
-rw-r--r--subversion/libsvn_ra_serf/stat.c615
-rw-r--r--subversion/libsvn_ra_serf/update.c4038
-rw-r--r--subversion/libsvn_ra_serf/util.c1523
-rw-r--r--subversion/libsvn_ra_serf/util_error.c3
-rw-r--r--subversion/libsvn_ra_serf/xml.c526
-rw-r--r--subversion/libsvn_ra_svn/client.c329
-rw-r--r--subversion/libsvn_ra_svn/cram.c2
-rw-r--r--subversion/libsvn_ra_svn/cyrus_auth.c39
-rw-r--r--subversion/libsvn_ra_svn/deprecated.c49
-rw-r--r--subversion/libsvn_ra_svn/editorp.c120
-rw-r--r--subversion/libsvn_ra_svn/internal_auth.c2
-rw-r--r--subversion/libsvn_ra_svn/libsvn_ra_svn.pc.in12
-rw-r--r--subversion/libsvn_ra_svn/marshal.c900
-rw-r--r--subversion/libsvn_ra_svn/protocol22
-rw-r--r--subversion/libsvn_ra_svn/ra_svn.h29
-rw-r--r--subversion/libsvn_ra_svn/streams.c149
-rw-r--r--subversion/libsvn_repos/authz.c81
-rw-r--r--subversion/libsvn_repos/authz_pool.c226
-rw-r--r--subversion/libsvn_repos/commit.c52
-rw-r--r--subversion/libsvn_repos/config_pool.c531
-rw-r--r--subversion/libsvn_repos/delta.c119
-rw-r--r--subversion/libsvn_repos/deprecated.c109
-rw-r--r--subversion/libsvn_repos/dump.c1617
-rw-r--r--subversion/libsvn_repos/fs-wrap.c369
-rw-r--r--subversion/libsvn_repos/hooks.c55
-rw-r--r--subversion/libsvn_repos/libsvn_repos.pc.in12
-rw-r--r--subversion/libsvn_repos/load-fs-vtable.c290
-rw-r--r--subversion/libsvn_repos/load.c32
-rw-r--r--subversion/libsvn_repos/log.c634
-rw-r--r--subversion/libsvn_repos/replay.c60
-rw-r--r--subversion/libsvn_repos/reporter.c72
-rw-r--r--subversion/libsvn_repos/repos.c765
-rw-r--r--subversion/libsvn_repos/repos.h5
-rw-r--r--subversion/libsvn_repos/rev_hunt.c258
-rw-r--r--subversion/libsvn_subr/adler32.c22
-rw-r--r--subversion/libsvn_subr/auth.c313
-rw-r--r--subversion/libsvn_subr/auth.h124
-rw-r--r--subversion/libsvn_subr/bit_array.c194
-rw-r--r--subversion/libsvn_subr/cache-inprocess.c80
-rw-r--r--subversion/libsvn_subr/cache-membuffer.c1889
-rw-r--r--subversion/libsvn_subr/cache-memcache.c54
-rw-r--r--subversion/libsvn_subr/cache.c68
-rw-r--r--subversion/libsvn_subr/cache.h10
-rw-r--r--subversion/libsvn_subr/cache_config.c11
-rw-r--r--subversion/libsvn_subr/checksum.c411
-rw-r--r--subversion/libsvn_subr/checksum.h (renamed from subversion/libsvn_subr/md5.h)35
-rw-r--r--subversion/libsvn_subr/cmdline.c435
-rw-r--r--subversion/libsvn_subr/compat.c30
-rw-r--r--subversion/libsvn_subr/compress.c257
-rw-r--r--subversion/libsvn_subr/config.c150
-rw-r--r--subversion/libsvn_subr/config_auth.c29
-rw-r--r--subversion/libsvn_subr/config_file.c177
-rw-r--r--subversion/libsvn_subr/config_impl.h14
-rw-r--r--subversion/libsvn_subr/config_keys.inc77
-rw-r--r--subversion/libsvn_subr/config_win.c95
-rw-r--r--subversion/libsvn_subr/ctype.c17
-rw-r--r--subversion/libsvn_subr/debug.c6
-rw-r--r--subversion/libsvn_subr/deprecated.c231
-rw-r--r--subversion/libsvn_subr/dirent_uri.c94
-rw-r--r--subversion/libsvn_subr/dso.c8
-rw-r--r--subversion/libsvn_subr/eol.c8
-rw-r--r--subversion/libsvn_subr/error.c120
-rw-r--r--subversion/libsvn_subr/errorcode.inc271
-rw-r--r--subversion/libsvn_subr/fnv1a.c246
-rw-r--r--subversion/libsvn_subr/fnv1a.h91
-rw-r--r--subversion/libsvn_subr/gpg_agent.c12
-rw-r--r--subversion/libsvn_subr/hash.c291
-rw-r--r--subversion/libsvn_subr/internal_statements.h2
-rw-r--r--subversion/libsvn_subr/io.c907
-rw-r--r--subversion/libsvn_subr/iter.c15
-rw-r--r--subversion/libsvn_subr/libsvn_subr.pc.in12
-rw-r--r--subversion/libsvn_subr/log.c35
-rw-r--r--subversion/libsvn_subr/macos_keychain.c5
-rw-r--r--subversion/libsvn_subr/magic.c24
-rw-r--r--subversion/libsvn_subr/md5.c66
-rw-r--r--subversion/libsvn_subr/mergeinfo.c192
-rw-r--r--subversion/libsvn_subr/mutex.c46
-rw-r--r--subversion/libsvn_subr/named_atomic.c665
-rw-r--r--subversion/libsvn_subr/nls.c79
-rw-r--r--subversion/libsvn_subr/object_pool.c398
-rw-r--r--subversion/libsvn_subr/opt.c13
-rw-r--r--subversion/libsvn_subr/packed_data.c1099
-rw-r--r--subversion/libsvn_subr/path.c12
-rw-r--r--subversion/libsvn_subr/pool.c2
-rw-r--r--subversion/libsvn_subr/prefix_string.c315
-rw-r--r--subversion/libsvn_subr/prompt.c14
-rw-r--r--subversion/libsvn_subr/pseudo_md5.c422
-rw-r--r--subversion/libsvn_subr/root_pools.c110
-rw-r--r--subversion/libsvn_subr/sha1.c82
-rw-r--r--subversion/libsvn_subr/sha1.h70
-rw-r--r--subversion/libsvn_subr/simple_providers.c23
-rw-r--r--subversion/libsvn_subr/sorts.c233
-rw-r--r--subversion/libsvn_subr/spillbuf.c136
-rw-r--r--subversion/libsvn_subr/sqlite.c372
-rw-r--r--subversion/libsvn_subr/sqlite3wrapper.c14
-rw-r--r--subversion/libsvn_subr/ssl_client_cert_providers.c13
-rw-r--r--subversion/libsvn_subr/ssl_client_cert_pw_providers.c16
-rw-r--r--subversion/libsvn_subr/ssl_server_trust_providers.c27
-rw-r--r--subversion/libsvn_subr/stream.c800
-rw-r--r--subversion/libsvn_subr/string.c355
-rw-r--r--subversion/libsvn_subr/subst.c100
-rw-r--r--subversion/libsvn_subr/sysinfo.c264
-rw-r--r--subversion/libsvn_subr/sysinfo.h11
-rw-r--r--subversion/libsvn_subr/temp_serializer.c22
-rw-r--r--subversion/libsvn_subr/time.c22
-rw-r--r--subversion/libsvn_subr/types.c46
-rw-r--r--subversion/libsvn_subr/username_providers.c11
-rw-r--r--subversion/libsvn_subr/utf.c338
-rw-r--r--subversion/libsvn_subr/utf8proc.c530
-rw-r--r--subversion/libsvn_subr/utf8proc/LICENSE64
-rw-r--r--subversion/libsvn_subr/utf8proc/README116
-rw-r--r--subversion/libsvn_subr/utf8proc/utf8proc.c611
-rw-r--r--subversion/libsvn_subr/utf8proc/utf8proc.h447
-rw-r--r--subversion/libsvn_subr/utf8proc/utf8proc_data.c13388
-rw-r--r--subversion/libsvn_subr/utf_validate.c10
-rw-r--r--subversion/libsvn_subr/utf_width.c2
-rw-r--r--subversion/libsvn_subr/version.c8
-rw-r--r--subversion/libsvn_subr/win32_crashrpt.c35
-rw-r--r--subversion/libsvn_subr/win32_crypto.c7
-rw-r--r--subversion/libsvn_subr/win32_xlate.c29
-rw-r--r--subversion/libsvn_subr/win32_xlate.h22
-rw-r--r--subversion/libsvn_subr/x509.h134
-rw-r--r--subversion/libsvn_subr/x509info.c332
-rw-r--r--subversion/libsvn_subr/x509parse.c1200
-rw-r--r--subversion/libsvn_subr/xml.c23
-rw-r--r--subversion/libsvn_wc/adm_crawler.c68
-rw-r--r--subversion/libsvn_wc/adm_files.c47
-rw-r--r--subversion/libsvn_wc/adm_files.h24
-rw-r--r--subversion/libsvn_wc/adm_ops.c461
-rw-r--r--subversion/libsvn_wc/cleanup.c82
-rw-r--r--subversion/libsvn_wc/conflicts.c2022
-rw-r--r--subversion/libsvn_wc/conflicts.h3
-rw-r--r--subversion/libsvn_wc/copy.c182
-rw-r--r--subversion/libsvn_wc/crop.c186
-rw-r--r--subversion/libsvn_wc/delete.c6
-rw-r--r--subversion/libsvn_wc/deprecated.c302
-rw-r--r--subversion/libsvn_wc/diff.h4
-rw-r--r--subversion/libsvn_wc/diff_editor.c163
-rw-r--r--subversion/libsvn_wc/diff_local.c160
-rw-r--r--subversion/libsvn_wc/entries.c536
-rw-r--r--subversion/libsvn_wc/externals.c118
-rw-r--r--subversion/libsvn_wc/info.c163
-rw-r--r--subversion/libsvn_wc/libsvn_wc.pc.in12
-rw-r--r--subversion/libsvn_wc/lock.c12
-rw-r--r--subversion/libsvn_wc/merge.c42
-rw-r--r--subversion/libsvn_wc/node.c473
-rw-r--r--subversion/libsvn_wc/old-and-busted.c4
-rw-r--r--subversion/libsvn_wc/props.c281
-rw-r--r--subversion/libsvn_wc/props.h8
-rw-r--r--subversion/libsvn_wc/questions.c195
-rw-r--r--subversion/libsvn_wc/relocate.c2
-rw-r--r--subversion/libsvn_wc/revert.c385
-rw-r--r--subversion/libsvn_wc/revision_status.c8
-rw-r--r--subversion/libsvn_wc/status.c476
-rw-r--r--subversion/libsvn_wc/token-map.h11
-rw-r--r--subversion/libsvn_wc/translate.c42
-rw-r--r--subversion/libsvn_wc/tree_conflicts.c37
-rw-r--r--subversion/libsvn_wc/update_editor.c1144
-rw-r--r--subversion/libsvn_wc/upgrade.c323
-rw-r--r--subversion/libsvn_wc/util.c212
-rw-r--r--subversion/libsvn_wc/wc-checks.h177
-rw-r--r--subversion/libsvn_wc/wc-checks.sql214
-rw-r--r--subversion/libsvn_wc/wc-metadata.h2
-rw-r--r--subversion/libsvn_wc/wc-metadata.sql14
-rw-r--r--subversion/libsvn_wc/wc-queries.h1960
-rw-r--r--subversion/libsvn_wc/wc-queries.sql461
-rw-r--r--subversion/libsvn_wc/wc.h84
-rw-r--r--subversion/libsvn_wc/wc_db.c4634
-rw-r--r--subversion/libsvn_wc/wc_db.h446
-rw-r--r--subversion/libsvn_wc/wc_db_pristine.c213
-rw-r--r--subversion/libsvn_wc/wc_db_private.h229
-rw-r--r--subversion/libsvn_wc/wc_db_update_move.c2828
-rw-r--r--subversion/libsvn_wc/wc_db_util.c66
-rw-r--r--subversion/libsvn_wc/wc_db_wcroot.c84
-rw-r--r--subversion/libsvn_wc/workqueue.c93
-rw-r--r--subversion/libsvn_wc/workqueue.h22
-rw-r--r--subversion/svn/add-cmd.c2
-rw-r--r--subversion/svn/auth-cmd.c483
-rw-r--r--subversion/svn/blame-cmd.c55
-rw-r--r--subversion/svn/cat-cmd.c7
-rw-r--r--subversion/svn/changelist-cmd.c24
-rw-r--r--subversion/svn/checkout-cmd.c12
-rw-r--r--subversion/svn/cl-conflicts.c84
-rw-r--r--subversion/svn/cl-conflicts.h10
-rw-r--r--subversion/svn/cl-log.h105
-rw-r--r--subversion/svn/cl.h109
-rw-r--r--subversion/svn/cleanup-cmd.c66
-rw-r--r--subversion/svn/client_errors.h97
-rw-r--r--subversion/svn/commit-cmd.c4
-rw-r--r--subversion/svn/conflict-callbacks.c509
-rw-r--r--subversion/svn/copy-cmd.c8
-rw-r--r--subversion/svn/diff-cmd.c29
-rw-r--r--subversion/svn/export-cmd.c10
-rw-r--r--subversion/svn/file-merge.c19
-rw-r--r--subversion/svn/help-cmd.c51
-rw-r--r--subversion/svn/info-cmd.c429
-rw-r--r--subversion/svn/list-cmd.c13
-rw-r--r--subversion/svn/log-cmd.c158
-rw-r--r--subversion/svn/merge-cmd.c4
-rw-r--r--subversion/svn/mergeinfo-cmd.c157
-rw-r--r--subversion/svn/notify.c783
-rw-r--r--subversion/svn/propget-cmd.c69
-rw-r--r--subversion/svn/proplist-cmd.c8
-rw-r--r--subversion/svn/props.c159
-rw-r--r--subversion/svn/resolve-cmd.c2
-rw-r--r--subversion/svn/revert-cmd.c7
-rw-r--r--subversion/svn/similarity.c126
-rw-r--r--subversion/svn/status-cmd.c30
-rw-r--r--subversion/svn/status.c65
-rw-r--r--subversion/svn/svn.c796
-rw-r--r--subversion/svn/util.c62
-rw-r--r--subversion/svn_private_config.h.in41
-rw-r--r--subversion/svn_private_config.hw23
-rw-r--r--subversion/svnadmin/svnadmin.c873
-rw-r--r--subversion/svnbench/cl.h203
-rw-r--r--subversion/svnbench/help-cmd.c90
-rw-r--r--subversion/svnbench/notify.c1045
-rw-r--r--subversion/svnbench/null-blame-cmd.c276
-rw-r--r--subversion/svnbench/null-export-cmd.c346
-rw-r--r--subversion/svnbench/null-info-cmd.c287
-rw-r--r--subversion/svnbench/null-list-cmd.c169
-rw-r--r--subversion/svnbench/null-log-cmd.c243
-rw-r--r--subversion/svnbench/svnbench.c1005
-rw-r--r--subversion/svnbench/util.c92
-rw-r--r--subversion/svndumpfilter/svndumpfilter.c408
-rw-r--r--subversion/svnfsfs/dump-index-cmd.c106
-rw-r--r--subversion/svnfsfs/load-index-cmd.c193
-rw-r--r--subversion/svnfsfs/stats-cmd.c509
-rw-r--r--subversion/svnfsfs/svnfsfs.c541
-rw-r--r--subversion/svnfsfs/svnfsfs.h73
-rw-r--r--subversion/svnlook/svnlook.c237
-rw-r--r--subversion/svnmucc/svnmucc.c1252
-rw-r--r--subversion/svnrdump/dump_editor.c532
-rw-r--r--subversion/svnrdump/load_editor.c309
-rw-r--r--subversion/svnrdump/svnrdump.c403
-rw-r--r--subversion/svnrdump/svnrdump.h1
-rw-r--r--subversion/svnrdump/util.c4
-rw-r--r--subversion/svnserve/cyrus_auth.c47
-rw-r--r--subversion/svnserve/logger.c161
-rw-r--r--subversion/svnserve/logger.h79
-rw-r--r--subversion/svnserve/serve.c1497
-rw-r--r--subversion/svnserve/server.h145
-rw-r--r--subversion/svnserve/svnserve.c711
-rw-r--r--subversion/svnsync/svnsync.c383
-rw-r--r--subversion/svnsync/sync.c4
-rw-r--r--subversion/svnversion/svnversion.c168
541 files changed, 146565 insertions, 45802 deletions
diff --git a/subversion/include/mod_dav_svn.h b/subversion/include/mod_dav_svn.h
index c498c5e974a9..223f2f1c6104 100644
--- a/subversion/include/mod_dav_svn.h
+++ b/subversion/include/mod_dav_svn.h
@@ -40,7 +40,7 @@ extern "C" {
/**
Given an apache request @a r, a @a uri, and a @a root_path to the svn
location block, process @a uri and return many things, allocated in
- @a r->pool:
+ @a pool:
- @a cleaned_uri: The uri with duplicate and trailing slashes removed.
@@ -74,7 +74,25 @@ extern "C" {
- @a relative_path: /!svn/blah/13/A/B/alpha
- @a repos_path: A/B/alpha
- @a trailing_slash: FALSE
+
+ NOTE: The returned dav_error will be also allocated in @a pool, not
+ in @a r->pool.
+
+ @since New in 1.9
*/
+AP_MODULE_DECLARE(dav_error *) dav_svn_split_uri2(request_rec *r,
+ const char *uri_to_split,
+ const char *root_path,
+ const char **cleaned_uri,
+ int *trailing_slash,
+ const char **repos_basename,
+ const char **relative_path,
+ const char **repos_path,
+ apr_pool_t *pool);
+
+/**
+ * Same as dav_svn_split_uri2() but allocates the result in @a r->pool.
+ */
AP_MODULE_DECLARE(dav_error *) dav_svn_split_uri(request_rec *r,
const char *uri,
const char *root_path,
@@ -87,7 +105,22 @@ AP_MODULE_DECLARE(dav_error *) dav_svn_split_uri(request_rec *r,
/**
* Given an apache request @a r and a @a root_path to the svn location
- * block, set @a *repos_path to the path of the repository on disk. */
+ * block, set @a *repos_path to the path of the repository on disk.
+ * Perform all allocations in @a pool.
+ *
+ * NOTE: The returned dav_error will be also allocated in @a pool, not
+ * in @a r->pool.
+ *
+ * @since New in 1.9
+ */
+AP_MODULE_DECLARE(dav_error *) dav_svn_get_repos_path2(request_rec *r,
+ const char *root_path,
+ const char **repos_path,
+ apr_pool_t *pool);
+
+/**
+ * Same as dav_svn_get_repos_path2() but allocates the result in@a r->pool.
+ */
AP_MODULE_DECLARE(dav_error *) dav_svn_get_repos_path(request_rec *r,
const char *root_path,
const char **repos_path);
diff --git a/subversion/include/private/svn_atomic.h b/subversion/include/private/svn_atomic.h
index 187703b05455..6a6b2dca6be1 100644
--- a/subversion/include/private/svn_atomic.h
+++ b/subversion/include/private/svn_atomic.h
@@ -46,39 +46,19 @@ extern "C" {
*/
/** The type used by all the other atomic operations. */
-#if APR_VERSION_AT_LEAST(1, 0, 0)
#define svn_atomic_t apr_uint32_t
-#else
-#define svn_atomic_t apr_atomic_t
-#endif
/** Atomically read an #svn_atomic_t from memory. */
-#if APR_VERSION_AT_LEAST(1, 0, 0)
#define svn_atomic_read(mem) apr_atomic_read32((mem))
-#else
-#define svn_atomic_read(mem) apr_atomic_read((mem))
-#endif
/** Atomically set an #svn_atomic_t in memory. */
-#if APR_VERSION_AT_LEAST(1, 0, 0)
#define svn_atomic_set(mem, val) apr_atomic_set32((mem), (val))
-#else
-#define svn_atomic_set(mem, val) apr_atomic_set((mem), (val))
-#endif
/** Atomically increment an #svn_atomic_t. */
-#if APR_VERSION_AT_LEAST(1, 0, 0)
#define svn_atomic_inc(mem) apr_atomic_inc32(mem)
-#else
-#define svn_atomic_inc(mem) apr_atomic_inc(mem)
-#endif
/** Atomically decrement an #svn_atomic_t. */
-#if APR_VERSION_AT_LEAST(1, 0, 0)
#define svn_atomic_dec(mem) apr_atomic_dec32(mem)
-#else
-#define svn_atomic_dec(mem) apr_atomic_dec(mem)
-#endif
/**
* Atomic compare-and-swap.
@@ -91,13 +71,8 @@ extern "C" {
* that on some platforms, the CAS function is implemented in a
* way that is incompatible with the other atomic operations.
*/
-#if APR_VERSION_AT_LEAST(1, 0, 0)
#define svn_atomic_cas(mem, with, cmp) \
apr_atomic_cas32((mem), (with), (cmp))
-#else
-#define svn_atomic_cas(mem, with, cmp) \
- apr_atomic_cas((mem), (with), (cmp))
-#endif
/** @} */
/**
diff --git a/subversion/include/private/svn_auth_private.h b/subversion/include/private/svn_auth_private.h
index 6c32688a3971..89146b9ae23c 100644
--- a/subversion/include/private/svn_auth_private.h
+++ b/subversion/include/private/svn_auth_private.h
@@ -231,6 +231,16 @@ svn_auth__ssl_client_cert_pw_set(svn_boolean_t *done,
svn_boolean_t non_interactive,
apr_pool_t *pool);
+/* Apply the specified configuration for connecting with SERVER_NAME
+ to the auth baton */
+svn_error_t *
+svn_auth__make_session_auth(svn_auth_baton_t **session_auth_baton,
+ const svn_auth_baton_t *auth_baton,
+ apr_hash_t *config,
+ const char *server_name,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
#if (defined(WIN32) && !defined(__MINGW32__)) || defined(DOXYGEN)
/**
* Set @a *provider to an authentication provider that implements
diff --git a/subversion/include/private/svn_cache.h b/subversion/include/private/svn_cache.h
index 08d2f09cb614..166295d6ce90 100644
--- a/subversion/include/private/svn_cache.h
+++ b/subversion/include/private/svn_cache.h
@@ -173,6 +173,12 @@ typedef struct svn_cache__info_t
* May be 0 if that information is not available.
*/
apr_uint64_t total_entries;
+
+ /** Number of index buckets with the given number of entries.
+ * Bucket sizes larger than the array will saturate into the
+ * highest array index.
+ */
+ apr_uint64_t histogram[32];
} svn_cache__info_t;
/**
@@ -251,7 +257,8 @@ svn_cache__create_memcache(svn_cache__t **cache_p,
* Given @a config, returns an APR memcached interface in @a
* *memcache_p allocated in @a result_pool if @a config contains entries in
* the SVN_CACHE_CONFIG_CATEGORY_MEMCACHED_SERVERS section describing
- * memcached servers; otherwise, sets @a *memcache_p to NULL.
+ * memcached servers; otherwise, sets @a *memcache_p to NULL. Use
+ * @a scratch_pool for temporary allocations.
*
* If Subversion was not built with apr_memcache_support, then raises
* SVN_ERR_NO_APR_MEMCACHE if and only if @a config is configured to
@@ -260,7 +267,8 @@ svn_cache__create_memcache(svn_cache__t **cache_p,
svn_error_t *
svn_cache__make_memcache_from_config(svn_memcache_t **memcache_p,
svn_config_t *config,
- apr_pool_t *result_pool);
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
/**
* Creates a new membuffer cache object in @a *cache. It will contain
@@ -303,6 +311,33 @@ svn_cache__membuffer_cache_create(svn_membuffer_t **cache,
apr_pool_t *result_pool);
/**
+ * @defgroup Standard priority classes for #svn_cache__create_membuffer_cache.
+ * @{
+ */
+
+/**
+ * Data in this priority class should not be removed from the cache unless
+ * absolutely necessary. Use of this should be very restricted.
+ */
+#define SVN_CACHE__MEMBUFFER_HIGH_PRIORITY 10000
+
+/**
+ * Data in this priority class has a good chance to remain in cache unless
+ * there is more data in this class than the cache's capacity. Use of this
+ * as the default for all information that is costly to fetch from disk.
+ */
+#define SVN_CACHE__MEMBUFFER_DEFAULT_PRIORITY 1000
+
+/**
+ * Data in this priority class will be removed as soon as the cache starts
+ * filling up. Use of this for ephemeral data that can easily be acquired
+ * again from other sources.
+ */
+#define SVN_CACHE__MEMBUFFER_LOW_PRIORITY 100
+
+/** @} */
+
+/**
* Creates a new cache in @a *cache_p, storing the data in a potentially
* shared @a membuffer object. The elements in the cache will be indexed
* by keys of length @a klen, which may be APR_HASH_KEY_STRING if they
@@ -310,7 +345,10 @@ svn_cache__membuffer_cache_create(svn_membuffer_t **cache,
* serialize_func and deserialized using @a deserialize_func. Because
* the same memcache object may cache many different kinds of values
* form multiple caches, @a prefix should be specified to differentiate
- * this cache from other caches. @a *cache_p will be allocated in @a result_pool.
+ * this cache from other caches. All entries written through this cache
+ * interface will be assigned into the given @a priority class. @a *cache_p
+ * will be allocated in @a result_pool. @a scratch_pool is used for
+ * temporary allocations.
*
* If @a deserialize_func is NULL, then the data is returned as an
* svn_stringbuf_t; if @a serialize_func is NULL, then the data is
@@ -329,8 +367,10 @@ svn_cache__create_membuffer_cache(svn_cache__t **cache_p,
svn_cache__deserialize_func_t deserialize,
apr_ssize_t klen,
const char *prefix,
+ apr_uint32_t priority,
svn_boolean_t thread_safe,
- apr_pool_t *result_pool);
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
/**
* Sets @a handler to be @a cache's error handling routine. If any
@@ -375,6 +415,18 @@ svn_cache__get(void **value,
apr_pool_t *result_pool);
/**
+ * Looks for an entry indexed by @a key in @a cache, setting @a *found
+ * to TRUE if an entry has been found and FALSE otherwise. @a key may be
+ * NULL in which case @a *found will be FALSE. Temporary allocations will
+ * be made from @a scratch_pool.
+ */
+svn_error_t *
+svn_cache__has_key(svn_boolean_t *found,
+ svn_cache__t *cache,
+ const void *key,
+ apr_pool_t *scratch_pool);
+
+/**
* Stores the value @a value under the key @a key in @a cache. Uses @a
* scratch_pool for temporary allocations. The cache makes copies of
* @a key and @a value if necessary (that is, @a key and @a value may
@@ -465,13 +517,16 @@ svn_cache__get_info(svn_cache__t *cache,
/**
* Return the information given in @a info formatted as a multi-line string.
- * Allocations take place in @a result_pool.
+ * If @a access_only has been set, size and fill-level statistics will be
+ * omitted. Allocations take place in @a result_pool.
*/
svn_string_t *
svn_cache__format_info(const svn_cache__info_t *info,
+ svn_boolean_t access_only,
apr_pool_t *result_pool);
-/* Access the process-global (singleton) membuffer cache. The first call
+/**
+ * Access the process-global (singleton) membuffer cache. The first call
* will automatically allocate the cache using the current cache config.
* NULL will be returned if the desired cache size is 0.
*
@@ -480,6 +535,22 @@ svn_cache__format_info(const svn_cache__info_t *info,
struct svn_membuffer_t *
svn_cache__get_global_membuffer_cache(void);
+/**
+ * Return total access and size stats over all membuffer caches as they
+ * share the underlying data buffer. The result will be allocated in POOL.
+ */
+svn_cache__info_t *
+svn_cache__membuffer_get_global_info(apr_pool_t *pool);
+
+/**
+ * Remove all current contents from CACHE.
+ *
+ * NOTE: In a multi-threaded environment, new contents may have been put
+ * into the cache by the time this function returns.
+ */
+svn_error_t *
+svn_cache__membuffer_clear(svn_membuffer_t *cache);
+
/** @} */
diff --git a/subversion/include/private/svn_client_mtcc.h b/subversion/include/private/svn_client_mtcc.h
new file mode 100644
index 000000000000..fe670b04e530
--- /dev/null
+++ b/subversion/include/private/svn_client_mtcc.h
@@ -0,0 +1,226 @@
+/**
+ * @copyright
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ * @endcopyright
+ *
+ * @file svn_client_mtcc.h
+ * @brief Subversion multicommand client support
+ *
+ * Requires: The working copy library and client library.
+ * Provides: High level multicommand api.
+ * Used By: Client programs, svnmucc.
+ */
+
+#ifndef SVN_CLIENT_MTCC_H
+#define SVN_CLIENT_MTCC_H
+
+#include "svn_client.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/**
+ *
+ * @defgroup clnt_mtcc Multi Command Context related functions
+ *
+ * @{
+ *
+ */
+
+/** This is a structure which stores a list of repository commands
+ * that can be played to a repository as a single operation
+ *
+ * Use svn_client__mtcc_create() to create instances
+ *
+ * @since New in 1.9.
+ */
+typedef struct svn_client__mtcc_t svn_client__mtcc_t;
+
+/** Creates a new multicommand context for an operation on @a anchor_url and
+ * its descendants.
+ *
+ * Allocate the context in @a result_pool and perform temporary allocations in
+ * @a scratch_pool.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_client__mtcc_create(svn_client__mtcc_t **mtcc,
+ const char *anchor_url,
+ svn_revnum_t base_revision,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/** Adds a file add operation of @a relpath to @a mtcc. If @a src_checksum
+ * is not null it will be provided to the repository to verify if the file
+ * was transferred successfully.
+ *
+ * Perform temporary allocations in @a scratch_pool.
+ *
+ * @note The current implementation keeps @a src_stream open until @a mtcc
+ * is committed.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_client__mtcc_add_add_file(const char *relpath,
+ svn_stream_t *src_stream,
+ const svn_checksum_t *src_checksum,
+ svn_client__mtcc_t *mtcc,
+ apr_pool_t *scratch_pool);
+
+/** Adds a copy operation of the node @a src_relpath at revision @a revision
+ * to @a dst_relpath to @a mtcc.
+ *
+ * Perform temporary allocations in @a scratch_pool.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_client__mtcc_add_copy(const char *src_relpath,
+ svn_revnum_t revision,
+ const char *dst_relpath,
+ svn_client__mtcc_t *mtcc,
+ apr_pool_t *scratch_pool);
+
+/** Adds a delete of @a relpath to @a mtcc.
+ *
+ * Perform temporary allocations in @a scratch_pool.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_client__mtcc_add_delete(const char *relpath,
+ svn_client__mtcc_t *mtcc,
+ apr_pool_t *scratch_pool);
+
+/** Adds an mkdir operation of @a relpath to @a mtcc.
+ *
+ * Perform temporary allocations in @a scratch_pool.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_client__mtcc_add_mkdir(const char *relpath,
+ svn_client__mtcc_t *mtcc,
+ apr_pool_t *scratch_pool);
+
+
+/** Adds a move operation of the node @a src_relpath to @a dst_relpath to
+ * @a mtcc.
+ *
+ * Perform temporary allocations in @a scratch_pool.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_client__mtcc_add_move(const char *src_relpath,
+ const char *dst_relpath,
+ svn_client__mtcc_t *mtcc,
+ apr_pool_t *scratch_pool);
+
+/** Adds a propset operation for the property @a propname to @a propval
+ * (which can be NULL for a delete) on @a relpath to @a mtcc.
+ *
+ * If @a skip_checks is not FALSE Subversion defined properties are verified
+ * for correctness like svn_client_propset_remote()
+ *
+ * Perform temporary allocations in @a scratch_pool.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_client__mtcc_add_propset(const char *relpath,
+ const char *propname,
+ const svn_string_t *propval,
+ svn_boolean_t skip_checks,
+ svn_client__mtcc_t *mtcc,
+ apr_pool_t *scratch_pool);
+
+
+/** Adds an update file operation for @a relpath to @a mtcc.
+ *
+ * The final version of the file is provided with @a src_stream. If @a
+ * src_checksum is provided it will be provided to the repository to verify
+ * the final result.
+ *
+ * If @a base_checksum is provided it will be used by the repository to verify
+ * if the base file matches this checksum.
+ *
+ * If @a base_stream is not NULL only the binary diff from @a base_stream to
+ * @a src_stream is written to the repository.
+ *
+ * Perform temporary allocations in @a scratch_pool.
+ *
+ * @note Callers should assume that the mtcc requires @a src_stream and @a
+ * base_stream to be valid until @a mtcc is committed.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_client__mtcc_add_update_file(const char *relpath,
+ svn_stream_t *src_stream,
+ const svn_checksum_t *src_checksum,
+ svn_stream_t *base_stream,
+ const svn_checksum_t *base_checksum,
+ svn_client__mtcc_t *mtcc,
+ apr_pool_t *scratch_pool);
+
+/** Obtains the kind of node at @a relpath in the current state of @a mtcc.
+ * This value might be from the cache (in case of modifications, copies)
+ * or fetched from the repository.
+ *
+ * If @a check_repository is TRUE, verify the node type with the repository at
+ * least once and cache the result for further checks.
+ *
+ * When a node does not exist this functions sets @a *kind to @c svn_node_node.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_client__mtcc_check_path(svn_node_kind_t *kind,
+ const char *relpath,
+ svn_boolean_t check_repository,
+ svn_client__mtcc_t *mtcc,
+ apr_pool_t *scratch_pool);
+
+/** Commits all operations stored in @a mtcc as a new revision and destroys
+ * @a mtcc.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_client__mtcc_commit(apr_hash_t *revprop_table,
+ svn_commit_callback2_t commit_callback,
+ void *commit_baton,
+ svn_client__mtcc_t *mtcc,
+ apr_pool_t *scratch_pool);
+
+
+/** @} end group: Multi Command Context related functions */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* SVN_CLIENT_MTCC_H */
diff --git a/subversion/include/private/svn_client_private.h b/subversion/include/private/svn_client_private.h
index 91ea6476b889..892fc4b0b574 100644
--- a/subversion/include/private/svn_client_private.h
+++ b/subversion/include/private/svn_client_private.h
@@ -33,11 +33,58 @@
#include "svn_client.h"
#include "svn_types.h"
+#include "private/svn_diff_tree.h"
+
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
+/* Set *REVNUM to the revision number identified by REVISION.
+
+ If REVISION->kind is svn_opt_revision_number, just use
+ REVISION->value.number, ignoring LOCAL_ABSPATH and RA_SESSION.
+
+ Else if REVISION->kind is svn_opt_revision_committed,
+ svn_opt_revision_previous, or svn_opt_revision_base, or
+ svn_opt_revision_working, then the revision can be identified
+ purely based on the working copy's administrative information for
+ LOCAL_ABSPATH, so RA_SESSION is ignored. If LOCAL_ABSPATH is not
+ under revision control, return SVN_ERR_UNVERSIONED_RESOURCE, or if
+ LOCAL_ABSPATH is null, return SVN_ERR_CLIENT_VERSIONED_PATH_REQUIRED.
+
+ Else if REVISION->kind is svn_opt_revision_date or
+ svn_opt_revision_head, then RA_SESSION is used to retrieve the
+ revision from the repository (using REVISION->value.date in the
+ former case), and LOCAL_ABSPATH is ignored. If RA_SESSION is null,
+ return SVN_ERR_CLIENT_RA_ACCESS_REQUIRED.
+
+ Else if REVISION->kind is svn_opt_revision_unspecified, set
+ *REVNUM to SVN_INVALID_REVNUM.
+
+ If YOUNGEST_REV is non-NULL, it is an in/out parameter. If
+ *YOUNGEST_REV is valid, use it as the youngest revision in the
+ repository (regardless of reality) -- don't bother to lookup the
+ true value for HEAD, and don't return any value in *REVNUM greater
+ than *YOUNGEST_REV. If *YOUNGEST_REV is not valid, and a HEAD
+ lookup is required to populate *REVNUM, then also populate
+ *YOUNGEST_REV with the result. This is useful for making multiple
+ serialized calls to this function with a basically static view of
+ the repository, avoiding race conditions which could occur between
+ multiple invocations with HEAD lookup requests.
+
+ Else return SVN_ERR_CLIENT_BAD_REVISION.
+
+ Use SCRATCH_POOL for any temporary allocation. */
+svn_error_t *
+svn_client__get_revision_number(svn_revnum_t *revnum,
+ svn_revnum_t *youngest_rev,
+ svn_wc_context_t *wc_ctx,
+ const char *local_abspath,
+ svn_ra_session_t *ra_session,
+ const svn_opt_revision_t *revision,
+ apr_pool_t *scratch_pool);
+
/* Return true if KIND is a revision kind that is dependent on the working
* copy. Otherwise, return false. */
#define SVN_CLIENT__REVKIND_NEEDS_WC(kind) \
@@ -200,29 +247,6 @@ svn_client__create_status(svn_client_status_t **cst,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
-/* Set *ANCESTOR_URL and *ANCESTOR_REVISION to the URL and revision,
- * respectively, of the youngest common ancestor of the two locations
- * PATH_OR_URL1@REV1 and PATH_OR_URL2@REV2. Set *ANCESTOR_RELPATH to
- * NULL and *ANCESTOR_REVISION to SVN_INVALID_REVNUM if they have no
- * common ancestor. This function assumes that PATH_OR_URL1@REV1 and
- * PATH_OR_URL2@REV2 both refer to the same repository.
- *
- * Use the authentication baton cached in CTX to authenticate against
- * the repository.
- *
- * See also svn_client__get_youngest_common_ancestor().
- */
-svn_error_t *
-svn_client__youngest_common_ancestor(const char **ancestor_url,
- svn_revnum_t *ancestor_rev,
- const char *path_or_url1,
- const svn_opt_revision_t *revision1,
- const char *path_or_url2,
- const svn_opt_revision_t *revision2,
- svn_client_ctx_t *ctx,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool);
-
/* Get the repository location of the base node at LOCAL_ABSPATH.
*
* A pathrev_t wrapper around svn_wc__node_get_base().
@@ -257,20 +281,6 @@ svn_client__wc_node_get_origin(svn_client__pathrev_t **origin_p,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
-/* Produce a diff with depth DEPTH between two files or two directories at
- * LOCAL_ABSPATH1 and LOCAL_ABSPATH2, using the provided diff callbacks to
- * show changes in files. The files and directories involved may be part of
- * a working copy or they may be unversioned. For versioned files, show
- * property changes, too. */
-svn_error_t *
-svn_client__arbitrary_nodes_diff(const char *local_abspath1,
- const char *local_abspath2,
- svn_depth_t depth,
- const svn_wc_diff_callbacks4_t *callbacks,
- void *callback_baton,
- svn_client_ctx_t *ctx,
- apr_pool_t *scratch_pool);
-
/* Copy the file or directory on URL in some repository to DST_ABSPATH,
* copying node information and properties. Resolve URL using PEG_REV and
* REVISION.
diff --git a/subversion/include/private/svn_cmdline_private.h b/subversion/include/private/svn_cmdline_private.h
index ad16b66cd6e3..f21a5d2e911b 100644
--- a/subversion/include/private/svn_cmdline_private.h
+++ b/subversion/include/private/svn_cmdline_private.h
@@ -88,11 +88,15 @@ typedef struct svn_cmdline__config_argument_t
* containing svn_cmdline__config_argument_t* elements, allocating the option
* data in @a pool
*
+ * [Since 1.9/1.10:] If the file, section, or option value is not recognized,
+ * warn to @c stderr, using @a prefix as in svn_handle_warning2().
+ *
* @since New in 1.7.
*/
svn_error_t *
svn_cmdline__parse_config_option(apr_array_header_t *config_options,
const char *opt_arg,
+ const char *prefix,
apr_pool_t *pool);
/** Sets the config options in @a config_options, an apr array containing
@@ -220,6 +224,20 @@ svn_boolean_t
svn_cmdline__be_interactive(svn_boolean_t non_interactive,
svn_boolean_t force_interactive);
+/* Parses the argument value of '--trust-server-cert-failures' OPT_ARG into
+ * the expected booleans for passing to svn_cmdline_create_auth_baton2()
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_cmdline__parse_trust_options(
+ svn_boolean_t *trust_server_cert_unknown_ca,
+ svn_boolean_t *trust_server_cert_cn_mismatch,
+ svn_boolean_t *trust_server_cert_expired,
+ svn_boolean_t *trust_server_cert_not_yet_valid,
+ svn_boolean_t *trust_server_cert_other_failure,
+ const char *opt_arg,
+ apr_pool_t *scratch_pool);
#ifdef __cplusplus
}
diff --git a/subversion/include/private/svn_delta_private.h b/subversion/include/private/svn_delta_private.h
index 4de85a94b6c9..260327c43c69 100644
--- a/subversion/include/private/svn_delta_private.h
+++ b/subversion/include/private/svn_delta_private.h
@@ -101,25 +101,12 @@ svn_delta__delta_from_editor(const svn_delta_editor_t **deditor,
struct svn_delta__extra_baton *exb,
apr_pool_t *pool);
-/**
- * Get the data from IN, compress it according to the specified
- * COMPRESSION_LEVEL and write the result to OUT.
- * SVN_DELTA_COMPRESSION_LEVEL_NONE is valid for COMPRESSION_LEVEL.
- */
+/** Read the txdelta window header from @a stream and return the total
+ length of the unparsed window data in @a *window_len. */
svn_error_t *
-svn__compress(svn_string_t *in,
- svn_stringbuf_t *out,
- int compression_level);
-
-/**
- * Get the compressed data from IN, decompress it and write the result to
- * OUT. Return an error if the decompressed size is larger than LIMIT.
- */
-svn_error_t *
-svn__decompress(svn_string_t *in,
- svn_stringbuf_t *out,
- apr_size_t limit);
-
+svn_txdelta__read_raw_window_len(apr_size_t *window_len,
+ svn_stream_t *stream,
+ apr_pool_t *pool);
#ifdef __cplusplus
}
diff --git a/subversion/include/private/svn_dep_compat.h b/subversion/include/private/svn_dep_compat.h
index 108b67cd673e..729cf7e4df11 100644
--- a/subversion/include/private/svn_dep_compat.h
+++ b/subversion/include/private/svn_dep_compat.h
@@ -20,7 +20,7 @@
* ====================================================================
* @endcopyright
*
- * @file svn_compat.h
+ * @file svn_dep_compat.h
* @brief Compatibility macros and functions.
* @since New in 1.5.0.
*/
@@ -35,71 +35,30 @@ extern "C" {
#endif /* __cplusplus */
/**
- * Check at compile time if the APR version is at least a certain
- * level.
- * @param major The major version component of the version checked
- * for (e.g., the "1" of "1.3.0").
- * @param minor The minor version component of the version checked
- * for (e.g., the "3" of "1.3.0").
- * @param patch The patch level component of the version checked
- * for (e.g., the "0" of "1.3.0").
+ * We assume that 'int' and 'unsigned' are at least 32 bits wide.
+ * This also implies that long (rev numbers) is 32 bits or wider.
*
- * @since New in 1.5.
- */
-#ifndef APR_VERSION_AT_LEAST /* Introduced in APR 1.3.0 */
-#define APR_VERSION_AT_LEAST(major,minor,patch) \
-(((major) < APR_MAJOR_VERSION) \
- || ((major) == APR_MAJOR_VERSION && (minor) < APR_MINOR_VERSION) \
- || ((major) == APR_MAJOR_VERSION && (minor) == APR_MINOR_VERSION && \
- (patch) <= APR_PATCH_VERSION))
-#endif /* APR_VERSION_AT_LEAST */
-
-/**
- * If we don't have a recent enough APR, emulate the behavior of the
- * apr_array_clear() API.
+ * @since New in 1.9.
*/
-#if !APR_VERSION_AT_LEAST(1,3,0)
-#define apr_array_clear(arr) (arr)->nelts = 0
+#if defined(APR_HAVE_LIMITS_H) \
+ && !defined(SVN_ALLOW_SHORT_INTS) \
+ && (INT_MAX < 0x7FFFFFFFl)
+#error int is shorter than 32 bits and may break Subversion. Define SVN_ALLOW_SHORT_INTS to skip this check.
#endif
-#if !APR_VERSION_AT_LEAST(1,3,0)
-/* Equivalent to the apr_hash_clear() function in APR >= 1.3.0. Used to
- * implement the 'apr_hash_clear' macro if the version of APR that
- * we build against does not provide the apr_hash_clear() function. */
-void svn_hash__clear(struct apr_hash_t *ht);
-
/**
- * If we don't have a recent enough APR, emulate the behavior of the
- * apr_hash_clear() API.
+ * We assume that 'char' is 8 bits wide. The critical interfaces are
+ * our repository formats and RA encodings. E.g. a 32 bit wide char may
+ * mess up UTF8 parsing, how we interpret size values etc.
+ *
+ * @since New in 1.9.
*/
-#define apr_hash_clear(ht) svn_hash__clear(ht)
+#if defined(CHAR_BIT) \
+ && !defined(SVN_ALLOW_NON_8_BIT_CHARS) \
+ && (CHAR_BIT != 8)
+#error char is not 8 bits and may break Subversion. Define SVN_ALLOW_NON_8_BIT_CHARS to skip this check.
#endif
-#if !APR_VERSION_AT_LEAST(1,0,0)
-#define APR_UINT64_C(val) UINT64_C(val)
-#define APR_FPROT_OS_DEFAULT APR_OS_DEFAULT
-#define apr_hash_make_custom(pool,hash_func) apr_hash_make(pool)
-#endif
-
-#if !APR_VERSION_AT_LEAST(1,3,0)
-#define APR_UINT16_MAX 0xFFFFU
-#define APR_INT16_MAX 0x7FFF
-#define APR_INT16_MIN (-APR_INT16_MAX-1)
-#define APR_UINT32_MAX 0xFFFFFFFFU
-#define APR_INT32_MAX 0x7FFFFFFF
-#define APR_INT32_MIN (-APR_INT32_MAX-1)
-#define APR_UINT64_MAX APR_UINT64_C(0xFFFFFFFFFFFFFFFF)
-#define APR_INT64_MAX APR_INT64_C(0x7FFFFFFFFFFFFFFF)
-#define APR_INT64_MIN (-APR_INT64_MAX-1)
-#define APR_SIZE_MAX (~(apr_size_t)0)
-
-#if APR_SIZEOF_VOIDP == 8
-typedef apr_uint64_t apr_uintptr_t;
-#else
-typedef apr_uint32_t apr_uintptr_t;
-#endif
-#endif /* !APR_VERSION_AT_LEAST(1,3,0) */
-
/**
* Work around a platform dependency issue. apr_thread_rwlock_trywrlock()
* will make APR_STATUS_IS_EBUSY() return TRUE if the lock could not be
@@ -115,6 +74,19 @@ typedef apr_uint32_t apr_uintptr_t;
#define SVN_LOCK_IS_BUSY(x) APR_STATUS_IS_EBUSY(x)
#endif
+/**
+ * APR keeps a few interesting defines hidden away in its private
+ * headers apr_arch_file_io.h, so we redefined them here.
+ *
+ * @since New in 1.9
+ */
+#ifndef APR_FREADONLY
+#define APR_FREADONLY 0x10000000
+#endif
+#ifndef APR_OPENINFO
+#define APR_OPENINFO 0x00100000
+#endif
+
#if !APR_VERSION_AT_LEAST(1,4,0)
#ifndef apr_time_from_msec
#define apr_time_from_msec(msec) ((apr_time_t)(msec) * 1000)
diff --git a/subversion/include/private/svn_diff_private.h b/subversion/include/private/svn_diff_private.h
index bb17c17170ed..48b4d5266200 100644
--- a/subversion/include/private/svn_diff_private.h
+++ b/subversion/include/private/svn_diff_private.h
@@ -97,6 +97,9 @@ svn_diff__unidiff_write_header(svn_stream_t *output_stream,
* merged or reverse merged; otherwise (or if the mergeinfo property values
* don't parse correctly) display them just like any other property.
*
+ * Pass @a context_size, @a cancel_func and @a cancel_baton to the diff
+ * output functions.
+ *
* Use @a scratch_pool for temporary allocations.
*/
svn_error_t *
@@ -105,6 +108,9 @@ svn_diff__display_prop_diffs(svn_stream_t *outstream,
const apr_array_header_t *propchanges,
apr_hash_t *original_props,
svn_boolean_t pretty_print_mergeinfo,
+ int context_size,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
apr_pool_t *scratch_pool);
diff --git a/subversion/include/private/svn_diff_tree.h b/subversion/include/private/svn_diff_tree.h
index 8cd4c0e71018..4554da2b47c9 100644
--- a/subversion/include/private/svn_diff_tree.h
+++ b/subversion/include/private/svn_diff_tree.h
@@ -103,18 +103,22 @@ extern "C" {
* Note that it is possible for nodes to be described as a delete followed by
* an add at the same place within one parent. (Iff the diff is reversed you
* can see an add followed by a delete!)
+ * ### "An add followed by a delete" sounds wrong.
*
* The directory batons live between the open and close events of a directory
* and are thereby guaranteed to outlive the batons of their descendants.
*/
/* Describes the source of a merge */
+/* ### You mean a diff?
+ * ### How come many users don't set the 'repos_relpath' field? */
typedef struct svn_diff_source_t
{
/* Always available */
svn_revnum_t revision;
/* Depending on the driver available for copyfrom */
+ /* ### What? */
const char *repos_relpath;
} svn_diff_source_t;
@@ -137,9 +141,10 @@ typedef struct svn_diff_tree_processor_t
{
/** The value passed to svn_diff__tree_processor_create() as BATON.
*/
- void *baton; /* To avoid an additional in some places */
+ void *baton; /* To avoid an additional in some places
+ * ### What? */
- /* Called before a directories children are processed.
+ /* Called before a directory's children are processed.
*
* Set *SKIP_CHILDREN to TRUE, to skip calling callbacks for all
* children.
@@ -319,7 +324,7 @@ svn_diff__tree_processor_filter_create(const svn_diff_tree_processor_t *processo
apr_pool_t *result_pool);
/**
- * Create a new svn_diff_tree_processor_t instace with all function setup
+ * Create a new svn_diff_tree_processor_t instance with all function setup
* to call into processor with all adds with copyfrom information transformed
* to simple node changes.
*
diff --git a/subversion/include/private/svn_editor.h b/subversion/include/private/svn_editor.h
index d714bb17a00d..aa8a2ac0904d 100644
--- a/subversion/include/private/svn_editor.h
+++ b/subversion/include/private/svn_editor.h
@@ -270,7 +270,6 @@ svn_delta_shim_callbacks_default(apr_pool_t *result_pool);
* svn_editor_setcb_delete() \n
* svn_editor_setcb_copy() \n
* svn_editor_setcb_move() \n
- * svn_editor_setcb_rotate() \n
* svn_editor_setcb_complete() \n
* svn_editor_setcb_abort()
*
@@ -293,7 +292,6 @@ svn_delta_shim_callbacks_default(apr_pool_t *result_pool);
* svn_editor_delete() \n
* svn_editor_copy() \n
* svn_editor_move() \n
- * svn_editor_rotate()
* \n\n
* Just before each callback invocation is carried out, the @a cancel_func
* that was passed to svn_editor_create() is invoked to poll any
@@ -325,7 +323,7 @@ svn_delta_shim_callbacks_default(apr_pool_t *result_pool);
* In order to reduce complexity of callback receivers, the editor callbacks
* must be driven in adherence to these rules:
*
- * - If any path is added (with add_*) or deleted/moved/rotated, then
+ * - If any path is added (with add_*) or deleted/moved, then
* an svn_editor_alter_directory() call must be made for its parent
* directory with the target/eventual set of children.
*
@@ -344,15 +342,13 @@ svn_delta_shim_callbacks_default(apr_pool_t *result_pool);
* its children, if a directory) may be copied many times, and are
* otherwise subject to the Once Rule. The destination path of a copy
* or move may have alter_* operations applied, but not add_* or delete.
- * If the destination path of a copy, move, or rotate is a directory,
+ * If the destination path of a copy or move is a directory,
* then its children are subject to the Once Rule. The source path of
* a move (and its child paths) may be referenced in add_*, or as the
* destination of a copy (where these new or copied nodes are subject
- * to the Once Rule). Paths listed in a rotation are both sources and
- * destinations, so they may not be referenced again in an add_* or a
- * deletion; these paths may have alter_* operations applied.
+ * to the Once Rule).
*
- * - The ancestor of an added, copied-here, moved-here, rotated, or
+ * - The ancestor of an added, copied-here, moved-here, or
* modified node may not be deleted. The ancestor may not be moved
* (instead: perform the move, *then* the edits).
*
@@ -375,10 +371,6 @@ svn_delta_shim_callbacks_default(apr_pool_t *result_pool);
* by a delete... that is fine. It is simply that svn_editor_move()
* should be used to describe a semantic move.
*
- * - Paths mentioned in svn_editor_rotate() may have their properties
- * and contents edited (via alter_* calls) by a previous or later call,
- * but they may not be subject to a later move, rotate, or deletion.
- *
* - One of svn_editor_complete() or svn_editor_abort() must be called
* exactly once, which must be the final call the driver invokes.
* Invoking svn_editor_complete() must imply that the set of changes has
@@ -573,9 +565,9 @@ typedef svn_error_t *(*svn_editor_cb_alter_file_t)(
void *baton,
const char *relpath,
svn_revnum_t revision,
- apr_hash_t *props,
const svn_checksum_t *checksum,
svn_stream_t *contents,
+ apr_hash_t *props,
apr_pool_t *scratch_pool);
/** @see svn_editor_alter_symlink(), svn_editor_t.
@@ -585,8 +577,8 @@ typedef svn_error_t *(*svn_editor_cb_alter_symlink_t)(
void *baton,
const char *relpath,
svn_revnum_t revision,
- apr_hash_t *props,
const char *target,
+ apr_hash_t *props,
apr_pool_t *scratch_pool);
/** @see svn_editor_delete(), svn_editor_t.
@@ -620,15 +612,6 @@ typedef svn_error_t *(*svn_editor_cb_move_t)(
svn_revnum_t replaces_rev,
apr_pool_t *scratch_pool);
-/** @see svn_editor_rotate(), svn_editor_t.
- * @since New in 1.8.
- */
-typedef svn_error_t *(*svn_editor_cb_rotate_t)(
- void *baton,
- const apr_array_header_t *relpaths,
- const apr_array_header_t *revisions,
- apr_pool_t *scratch_pool);
-
/** @see svn_editor_complete(), svn_editor_t.
* @since New in 1.8.
*/
@@ -790,17 +773,6 @@ svn_editor_setcb_move(svn_editor_t *editor,
svn_editor_cb_move_t callback,
apr_pool_t *scratch_pool);
-/** Sets the #svn_editor_cb_rotate_t callback in @a editor
- * to @a callback.
- * @a scratch_pool is used for temporary allocations (if any).
- * @see also svn_editor_setcb_many().
- * @since New in 1.8.
- */
-svn_error_t *
-svn_editor_setcb_rotate(svn_editor_t *editor,
- svn_editor_cb_rotate_t callback,
- apr_pool_t *scratch_pool);
-
/** Sets the #svn_editor_cb_complete_t callback in @a editor
* to @a callback.
* @a scratch_pool is used for temporary allocations (if any).
@@ -841,7 +813,6 @@ typedef struct svn_editor_cb_many_t
svn_editor_cb_delete_t cb_delete;
svn_editor_cb_copy_t cb_copy;
svn_editor_cb_move_t cb_move;
- svn_editor_cb_rotate_t cb_rotate;
svn_editor_cb_complete_t cb_complete;
svn_editor_cb_abort_t cb_abort;
@@ -1020,9 +991,9 @@ svn_error_t *
svn_editor_alter_file(svn_editor_t *editor,
const char *relpath,
svn_revnum_t revision,
- apr_hash_t *props,
const svn_checksum_t *checksum,
- svn_stream_t *contents);
+ svn_stream_t *contents,
+ apr_hash_t *props);
/** Drive @a editor's #svn_editor_cb_alter_symlink_t callback.
*
@@ -1047,8 +1018,8 @@ svn_error_t *
svn_editor_alter_symlink(svn_editor_t *editor,
const char *relpath,
svn_revnum_t revision,
- apr_hash_t *props,
- const char *target);
+ const char *target,
+ apr_hash_t *props);
/** Drive @a editor's #svn_editor_cb_delete_t callback.
*
@@ -1093,7 +1064,7 @@ svn_editor_copy(svn_editor_t *editor,
* expect to find this node. That is, @a src_relpath at the start of
* the whole edit and @a src_relpath at @a src_revision must lie within
* the same node-rev (aka history-segment). This is just like the
- * revisions specified to svn_editor_delete() and svn_editor_rotate().
+ * revisions specified to svn_editor_delete().
*
* For a description of @a replaces_rev, see svn_editor_add_file().
*
@@ -1110,36 +1081,6 @@ svn_editor_move(svn_editor_t *editor,
const char *dst_relpath,
svn_revnum_t replaces_rev);
-/** Drive @a editor's #svn_editor_cb_rotate_t callback.
- *
- * Perform a rotation among multiple nodes in the target tree.
- *
- * The @a relpaths and @a revisions arrays (pair-wise) specify nodes in the
- * tree which are located at a path and expected to be at a specific
- * revision. These nodes are simultaneously moved in a rotation pattern.
- * For example, the node at index 0 of @a relpaths and @a revisions will
- * be moved to the relpath specified at index 1 of @a relpaths. The node
- * at index 1 will be moved to the location at index 2. The node at index
- * N-1 will be moved to the relpath specified at index 0.
- *
- * The simplest form of this operation is to swap nodes A and B. One may
- * think to move A to a temporary location T, then move B to A, then move
- * T to B. However, this last move violations the Once Rule by moving T
- * (which had already by edited by the move from A). In order to keep the
- * restrictions against multiple moves of a single node, the rotation
- * operation is needed for certain types of tree edits.
- *
- * ### what happens if one of the paths of the rotation is not "within" the
- * ### receiver's set of paths?
- *
- * For all restrictions on driving the editor, see #svn_editor_t.
- * @since New in 1.8.
- */
-svn_error_t *
-svn_editor_rotate(svn_editor_t *editor,
- const apr_array_header_t *relpaths,
- const apr_array_header_t *revisions);
-
/** Drive @a editor's #svn_editor_cb_complete_t callback.
*
* Send word that the edit has been completed successfully.
diff --git a/subversion/include/private/svn_error_private.h b/subversion/include/private/svn_error_private.h
index f8bd2bc51617..2d35bc613bf9 100644
--- a/subversion/include/private/svn_error_private.h
+++ b/subversion/include/private/svn_error_private.h
@@ -37,7 +37,7 @@ extern "C" {
* Returns if @a err is a "tracing" error.
*/
svn_boolean_t
-svn_error__is_tracing_link(svn_error_t *err);
+svn_error__is_tracing_link(const svn_error_t *err);
/**
* Converts a zlib error to an svn_error_t. zerr is the error code,
diff --git a/subversion/include/private/svn_fs_fs_private.h b/subversion/include/private/svn_fs_fs_private.h
new file mode 100644
index 000000000000..59aede1c7a62
--- /dev/null
+++ b/subversion/include/private/svn_fs_fs_private.h
@@ -0,0 +1,355 @@
+/**
+ * @copyright
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ * @endcopyright
+ *
+ * @file svn_fs_fs_private.h
+ * @brief Private API for tools that access FSFS internals and can't use
+ * the svn_fs_t API for that.
+ */
+
+
+#ifndef SVN_FS_FS_PRIVATE_H
+#define SVN_FS_FS_PRIVATE_H
+
+#include <apr_pools.h>
+#include <apr_hash.h>
+
+#include "svn_types.h"
+#include "svn_error.h"
+#include "svn_fs.h"
+#include "svn_iter.h"
+#include "svn_config.h"
+#include "svn_string.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+
+/* Description of one large representation. It's content will be reused /
+ * overwritten when it gets replaced by an even larger representation.
+ */
+typedef struct svn_fs_fs__large_change_info_t
+{
+ /* size of the (deltified) representation */
+ apr_uint64_t size;
+
+ /* Revision of the representation. SVN_INVALID_REVNUM for unused entries. */
+ svn_revnum_t revision;
+
+ /* node path. "" for unused instances */
+ svn_stringbuf_t *path;
+} svn_fs_fs__large_change_info_t;
+
+/* Container for the largest representations found so far. The capacity
+ * is fixed and entries will be inserted by reusing the last one and
+ * reshuffling the entry pointers.
+ */
+typedef struct svn_fs_fs__largest_changes_t
+{
+ /* number of entries allocated in CHANGES */
+ apr_size_t count;
+
+ /* size of the smallest change */
+ apr_uint64_t min_size;
+
+ /* changes kept in this struct */
+ svn_fs_fs__large_change_info_t **changes;
+} svn_fs_fs__largest_changes_t;
+
+/* Information we gather per size bracket.
+ */
+typedef struct svn_fs_fs__histogram_line_t
+{
+ /* number of item that fall into this bracket */
+ apr_uint64_t count;
+
+ /* sum of values in this bracket */
+ apr_uint64_t sum;
+} svn_fs_fs__histogram_line_t;
+
+/* A histogram of 64 bit integer values.
+ */
+typedef struct svn_fs_fs__histogram_t
+{
+ /* total sum over all brackets */
+ svn_fs_fs__histogram_line_t total;
+
+ /* one bracket per binary step.
+ * line[i] is the 2^(i-1) <= x < 2^i bracket */
+ svn_fs_fs__histogram_line_t lines[64];
+} svn_fs_fs__histogram_t;
+
+/* Information we collect per file ending.
+ */
+typedef struct svn_fs_fs__extension_info_t
+{
+ /* file extension, including leading "."
+ * "(none)" in the container for files w/o extension. */
+ const char *extension;
+
+ /* histogram of representation sizes */
+ svn_fs_fs__histogram_t rep_histogram;
+
+ /* histogram of sizes of changed files */
+ svn_fs_fs__histogram_t node_histogram;
+} svn_fs_fs__extension_info_t;
+
+/* Compression statistics we collect over a given set of representations.
+ */
+typedef struct svn_fs_fs__rep_pack_stats_t
+{
+ /* number of representations */
+ apr_uint64_t count;
+
+ /* total size after deltification (i.e. on disk size) */
+ apr_uint64_t packed_size;
+
+ /* total size after de-deltification (i.e. plain text size) */
+ apr_uint64_t expanded_size;
+
+ /* total on-disk header size */
+ apr_uint64_t overhead_size;
+} svn_fs_fs__rep_pack_stats_t;
+
+/* Statistics we collect over a given set of representations.
+ * We group them into shared and non-shared ("unique") reps.
+ */
+typedef struct svn_fs_fs__representation_stats_t
+{
+ /* stats over all representations */
+ svn_fs_fs__rep_pack_stats_t total;
+
+ /* stats over those representations with ref_count == 1 */
+ svn_fs_fs__rep_pack_stats_t uniques;
+
+ /* stats over those representations with ref_count > 1 */
+ svn_fs_fs__rep_pack_stats_t shared;
+
+ /* sum of all ref_counts */
+ apr_uint64_t references;
+
+ /* sum of ref_count * expanded_size,
+ * i.e. total plaintext content if there was no rep sharing */
+ apr_uint64_t expanded_size;
+} svn_fs_fs__representation_stats_t;
+
+/* Basic statistics we collect over a given set of noderevs.
+ */
+typedef struct svn_fs_fs__node_stats_t
+{
+ /* number of noderev structs */
+ apr_uint64_t count;
+
+ /* their total size on disk (structs only) */
+ apr_uint64_t size;
+} svn_fs_fs__node_stats_t;
+
+/* Comprises all the information needed to create the output of the
+ * 'svnfsfs stats' command.
+ */
+typedef struct svn_fs_fs__stats_t
+{
+ /* sum total of all rev / pack file sizes in bytes */
+ apr_uint64_t total_size;
+
+ /* number of revisions in the repository */
+ apr_uint64_t revision_count;
+
+ /* total number of changed paths */
+ apr_uint64_t change_count;
+
+ /* sum of all changed path list sizes on disk in bytes */
+ apr_uint64_t change_len;
+
+ /* stats on all representations */
+ svn_fs_fs__representation_stats_t total_rep_stats;
+
+ /* stats on all file text representations */
+ svn_fs_fs__representation_stats_t file_rep_stats;
+
+ /* stats on all directory text representations */
+ svn_fs_fs__representation_stats_t dir_rep_stats;
+
+ /* stats on all file prop representations */
+ svn_fs_fs__representation_stats_t file_prop_rep_stats;
+
+ /* stats on all directory prop representations */
+ svn_fs_fs__representation_stats_t dir_prop_rep_stats;
+
+ /* size and count summary over all noderevs */
+ svn_fs_fs__node_stats_t total_node_stats;
+
+ /* size and count summary over all file noderevs */
+ svn_fs_fs__node_stats_t file_node_stats;
+
+ /* size and count summary over all directory noderevs */
+ svn_fs_fs__node_stats_t dir_node_stats;
+
+ /* the biggest single contributors to repo size */
+ svn_fs_fs__largest_changes_t *largest_changes;
+
+ /* histogram of representation sizes */
+ svn_fs_fs__histogram_t rep_size_histogram;
+
+ /* histogram of sizes of changed nodes */
+ svn_fs_fs__histogram_t node_size_histogram;
+
+ /* histogram of representation sizes */
+ svn_fs_fs__histogram_t added_rep_size_histogram;
+
+ /* histogram of sizes of changed nodes */
+ svn_fs_fs__histogram_t added_node_size_histogram;
+
+ /* histogram of unused representations */
+ svn_fs_fs__histogram_t unused_rep_histogram;
+
+ /* histogram of sizes of changed files */
+ svn_fs_fs__histogram_t file_histogram;
+
+ /* histogram of sizes of file representations */
+ svn_fs_fs__histogram_t file_rep_histogram;
+
+ /* histogram of sizes of changed file property sets */
+ svn_fs_fs__histogram_t file_prop_histogram;
+
+ /* histogram of sizes of file property representations */
+ svn_fs_fs__histogram_t file_prop_rep_histogram;
+
+ /* histogram of sizes of changed directories (in bytes) */
+ svn_fs_fs__histogram_t dir_histogram;
+
+ /* histogram of sizes of directories representations */
+ svn_fs_fs__histogram_t dir_rep_histogram;
+
+ /* histogram of sizes of changed directories property sets */
+ svn_fs_fs__histogram_t dir_prop_histogram;
+
+ /* histogram of sizes of directories property representations */
+ svn_fs_fs__histogram_t dir_prop_rep_histogram;
+
+ /* extension -> svn_fs_fs__extension_info_t* map */
+ apr_hash_t *by_extension;
+} svn_fs_fs__stats_t;
+
+
+/* Scan all contents of the repository FS and return statistics in *STATS,
+ * allocated in RESULT_POOL. Report progress through PROGRESS_FUNC with
+ * PROGRESS_BATON, if PROGRESS_FUNC is not NULL.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_fs__get_stats(svn_fs_fs__stats_t **stats,
+ svn_fs_t *fs,
+ svn_fs_progress_notify_func_t progress_func,
+ void *progress_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Node-revision IDs in FSFS consist of 3 of sub-IDs ("parts") that consist
+ * of a creation REVISION number and some revision- / transaction-local
+ * counter value (NUMBER). Old-style ID parts use global counter values.
+ *
+ * The parts are: node_id, copy_id and txn_id for in-txn IDs as well as
+ * node_id, copy_id and rev_offset for in-revision IDs. This struct the
+ * data structure used for each of those parts.
+ */
+typedef struct svn_fs_fs__id_part_t
+{
+ /* SVN_INVALID_REVNUM for txns -> not a txn, COUNTER must be 0.
+ SVN_INVALID_REVNUM for others -> not assigned to a revision, yet.
+ 0 for others -> old-style ID or the root in rev 0. */
+ svn_revnum_t revision;
+
+ /* sub-id value relative to REVISION. Its interpretation depends on
+ the part itself. In rev_item, it is the index_index value, in others
+ it represents a unique counter value. */
+ apr_uint64_t number;
+} svn_fs_fs__id_part_t;
+
+/* (user visible) entry in the phys-to-log index. It describes a section
+ * of some packed / non-packed rev file as containing a specific item.
+ * There must be no overlapping / conflicting entries.
+ */
+typedef struct svn_fs_fs__p2l_entry_t
+{
+ /* offset of the first byte that belongs to the item */
+ apr_off_t offset;
+
+ /* length of the item in bytes */
+ apr_off_t size;
+
+ /* type of the item (see SVN_FS_FS__ITEM_TYPE_*) defines */
+ apr_uint32_t type;
+
+ /* modified FNV-1a checksum. 0 if unknown checksum */
+ apr_uint32_t fnv1_checksum;
+
+ /* item in that block */
+ svn_fs_fs__id_part_t item;
+} svn_fs_fs__p2l_entry_t;
+
+
+/* Callback function type receiving a single P2L index ENTRY, a user
+ * provided BATON and a SCRATCH_POOL for temporary allocations.
+ * ENTRY's lifetime may end when the callback returns.
+ */
+typedef svn_error_t *
+(*svn_fs_fs__dump_index_func_t)(const svn_fs_fs__p2l_entry_t *entry,
+ void *baton,
+ apr_pool_t *scratch_pool);
+
+/* Read the P2L index for the rev / pack file containing REVISION in FS.
+ * For each index entry, invoke CALLBACK_FUNC with CALLBACK_BATON.
+ * If not NULL, call CANCEL_FUNC with CANCEL_BATON from time to time.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_fs_fs__dump_index(svn_fs_t *fs,
+ svn_revnum_t revision,
+ svn_fs_fs__dump_index_func_t callback_func,
+ void *callback_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+
+/* Rewrite the respective index information of the rev / pack file in FS
+ * containing REVISION and use the svn_fs_fs__p2l_entry_t * array ENTRIES
+ * as the new index contents. Allocate temporaries from SCRATCH_POOL.
+ *
+ * Note that this becomes a no-op if ENTRIES is empty. You may use a zero-
+ * sized empty entry instead.
+ */
+svn_error_t *
+svn_fs_fs__load_index(svn_fs_t *fs,
+ svn_revnum_t revision,
+ apr_array_header_t *entries,
+ apr_pool_t *scratch_pool);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* SVN_FS_FS_PRIVATE_H */
diff --git a/subversion/include/private/svn_fs_private.h b/subversion/include/private/svn_fs_private.h
index 20b70cd2059d..5bd89c0280c0 100644
--- a/subversion/include/private/svn_fs_private.h
+++ b/subversion/include/private/svn_fs_private.h
@@ -179,6 +179,23 @@ svn_fs__editor_commit(svn_revnum_t *revision,
apr_pool_t *scratch_pool);
+/** Set @a *mergeinfo to the mergeinfo for @a path in @a root.
+ *
+ * If there is no mergeinfo, set @a *mergeinfo to NULL.
+ *
+ * See svn_fs_get_mergeinfo2() but for the meanings of @a inherit and
+ * @a adjust_inheritable_mergeinfo and other details.
+ */
+svn_error_t *
+svn_fs__get_mergeinfo_for_path(svn_mergeinfo_t *mergeinfo,
+ svn_fs_root_t *root,
+ const char *path,
+ svn_mergeinfo_inheritance_t inherit,
+ svn_boolean_t adjust_inherited_mergeinfo,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+
/** @} */
diff --git a/subversion/include/private/svn_fs_util.h b/subversion/include/private/svn_fs_util.h
index eb0f024de847..c9f74a126858 100644
--- a/subversion/include/private/svn_fs_util.h
+++ b/subversion/include/private/svn_fs_util.h
@@ -29,12 +29,17 @@
#include "svn_types.h"
#include "svn_error.h"
+#include "svn_version.h"
#include "svn_fs.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
+/* Get libsvn_fs_util version information. */
+const svn_version_t *
+svn_fs_util__version(void);
+
/* Returns whether PATH is in canonical form as defined by
svn_fs__canonicalize_abspath().
*/
@@ -210,6 +215,26 @@ svn_fs__append_to_merged_froms(svn_mergeinfo_t *output,
const char *rel_path,
apr_pool_t *pool);
+/* Given the FS creation options in CONFIG, return the oldest version that
+ we shall be compatible with in *COMPATIBLE_VERSION. The patch level
+ is always set to 0 and the tag to "". Allocate the result in POOL.
+
+ Note that the result will always be compatible to the current tool
+ version, i.e. will be a version number not more recent than this tool. */
+svn_error_t *
+svn_fs__compatible_version(svn_version_t **compatible_version,
+ apr_hash_t *config,
+ apr_pool_t *pool);
+
+/* Compare the property lists A and B using POOL for temporary allocations.
+ Return true iff both lists contain the same properties with the same
+ values. A and B may be NULL in which case they will be equal to and
+ empty list. */
+svn_boolean_t
+svn_fs__prop_lists_equal(apr_hash_t *a,
+ apr_hash_t *b,
+ apr_pool_t *pool);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/subversion/include/private/svn_io_private.h b/subversion/include/private/svn_io_private.h
index 239cd6e61108..814c27aea422 100644
--- a/subversion/include/private/svn_io_private.h
+++ b/subversion/include/private/svn_io_private.h
@@ -44,6 +44,15 @@ extern "C" {
#define SVN__APR_FINFO_MASK_OUT (0)
#endif
+/* 90% of the lines we encounter will be less than this many chars.
+ *
+ * Line-based functions like svn_stream_readline should fetch data in
+ * blocks no longer than this. Although using a larger prefetch size is
+ * not illegal and must not break any functionality, it may be
+ * significantly less efficient in certain situations.
+ */
+#define SVN__LINE_CHUNK_SIZE 80
+
/** Set @a *executable TRUE if @a file_info is executable for the
* user, FALSE otherwise.
@@ -64,6 +73,18 @@ svn_io__is_finfo_read_only(svn_boolean_t *read_only,
apr_pool_t *pool);
+/**
+ * Lock file at @a lock_file. If that file does not exist, create an empty
+ * file.
+ *
+ * Lock will be automatically released when @a pool is cleared or destroyed.
+ * Use @a pool for memory allocations.
+ */
+svn_error_t *
+svn_io__file_lock_autocreate(const char *lock_file,
+ apr_pool_t *pool);
+
+
/** Buffer test handler function for a generic stream. @see svn_stream_t
* and svn_stream__is_buffered().
*
@@ -81,7 +102,7 @@ svn_stream__set_is_buffered(svn_stream_t *stream,
/** Return whether this generic @a stream uses internal buffering.
* This may be used to work around subtle differences between buffered
- * an non-buffered APR files. A lazy-open stream cannot report the
+ * and non-buffered APR files. A lazy-open stream cannot report the
* true buffering state until after the lazy open: a stream that
* initially reports as non-buffered may report as buffered later.
*
@@ -96,6 +117,82 @@ svn_stream__is_buffered(svn_stream_t *stream);
apr_file_t *
svn_stream__aprfile(svn_stream_t *stream);
+/* Creates as *INSTALL_STREAM a stream that once completed can be installed
+ using Windows checkouts much slower than Unix.
+
+ While writing the stream is temporarily stored in TMP_ABSPATH.
+ */
+svn_error_t *
+svn_stream__create_for_install(svn_stream_t **install_stream,
+ const char *tmp_abspath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Installs a stream created with svn_stream__create_for_install in its final
+ location FINAL_ABSPATH, potentially using platform specific optimizations.
+
+ If MAKE_PARENTS is TRUE, this function will create missing parent
+ directories if needed.
+ */
+svn_error_t *
+svn_stream__install_stream(svn_stream_t *install_stream,
+ const char *final_abspath,
+ svn_boolean_t make_parents,
+ apr_pool_t *scratch_pool);
+
+/* Deletes the install stream (when installing is not necessary after all) */
+svn_error_t *
+svn_stream__install_delete(svn_stream_t *install_stream,
+ apr_pool_t *scratch_pool);
+
+/* Optimized apr_file_stat / apr_file_info_get operating on a closed
+ install stream */
+svn_error_t *
+svn_stream__install_get_info(apr_finfo_t *finfo,
+ svn_stream_t *install_stream,
+ apr_int32_t wanted,
+ apr_pool_t *scratch_pool);
+
+
+#if defined(WIN32)
+
+/* ### Move to something like io.h or subr.h, to avoid making it
+ part of the DLL api */
+
+/* This is semantically the same as the APR utf8_to_unicode_path
+ function, but reimplemented here because APR does not export it.
+
+ Note that this function creates "\\?\" paths so the resulting path
+ can only be used for WINAPI functions that explicitly document support
+ for this kind of paths. Newer Windows functions (Vista+) that support
+ long paths directly DON'T want this kind of escaping.
+ */
+svn_error_t*
+svn_io__utf8_to_unicode_longpath(const WCHAR **result,
+ const char *source,
+ apr_pool_t *result_pool);
+
+/* This Windows-specific function marks the file to be deleted on close using
+ an existing file handle. It can be used to avoid having to reopen the file
+ as part of the delete handling. Return SVN_ERR_UNSUPPORTED_FEATURE if
+ delete on close operation is not supported by OS. */
+svn_error_t *
+svn_io__win_delete_file_on_close(apr_file_t *file,
+ const char *path,
+ apr_pool_t *pool);
+
+/* This Windows-specific function renames the file using an existing file
+ handle. It can be used to avoid having to reopen the file as part of the
+ rename operation. Return SVN_ERR_UNSUPPORTED_FEATURE if renaming open
+ file is not supported by OS.*/
+svn_error_t *
+svn_io__win_rename_open_file(apr_file_t *file,
+ const char *from_path,
+ const char *to_path,
+ apr_pool_t *pool);
+
+#endif /* WIN32 */
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/subversion/include/private/svn_log.h b/subversion/include/private/svn_log.h
index bdcf32f5a609..1ad8d559b9df 100644
--- a/subversion/include/private/svn_log.h
+++ b/subversion/include/private/svn_log.h
@@ -204,7 +204,7 @@ svn_log__get_file_revs(const char *path, svn_revnum_t start, svn_revnum_t end,
* @since New in 1.6.
*/
const char *
-svn_log__lock(const apr_array_header_t *paths, svn_boolean_t steal,
+svn_log__lock(apr_hash_t *targets, svn_boolean_t steal,
apr_pool_t *pool);
/**
@@ -213,7 +213,7 @@ svn_log__lock(const apr_array_header_t *paths, svn_boolean_t steal,
* @since New in 1.6.
*/
const char *
-svn_log__unlock(const apr_array_header_t *paths, svn_boolean_t break_lock,
+svn_log__unlock(apr_hash_t *targets, svn_boolean_t break_lock,
apr_pool_t *pool);
/**
diff --git a/subversion/include/private/svn_magic.h b/subversion/include/private/svn_magic.h
index b057e563b3e8..2e5fafd60c52 100644
--- a/subversion/include/private/svn_magic.h
+++ b/subversion/include/private/svn_magic.h
@@ -30,14 +30,16 @@
/* An opaque struct that wraps a libmagic cookie. */
typedef struct svn_magic__cookie_t svn_magic__cookie_t;
-/* This routine initialises libmagic.
+/* This routine initialises libmagic. CONFIG is a config hash and
+ * may be NULL.
* Upon success a new *MAGIC_COOKIE is allocated in RESULT_POOL.
* On failure *MAGIC_COOKIE is set to NULL.
* All resources used by libmagic are freed by a cleanup handler
* installed on RESULT_POOL, i.e. *MAGIC_COOKIE becomes invalid when
* the pool is cleared! */
-void
+svn_error_t *
svn_magic__init(svn_magic__cookie_t **magic_cookie,
+ apr_hash_t *config,
apr_pool_t *result_pool);
/* Detect the mime-type of the file at LOCAL_ABSPATH using MAGIC_COOKIE.
diff --git a/subversion/include/private/svn_mergeinfo_private.h b/subversion/include/private/svn_mergeinfo_private.h
index b8748f4dc7a8..716d0c9f90e2 100644
--- a/subversion/include/private/svn_mergeinfo_private.h
+++ b/subversion/include/private/svn_mergeinfo_private.h
@@ -119,13 +119,13 @@ svn_mergeinfo__equals(svn_boolean_t *is_equal,
svn_boolean_t consider_inheritance,
apr_pool_t *pool);
-/* Examine MERGEINFO, removing all paths from the hash which map to
- empty rangelists. POOL is used only to allocate the apr_hash_index_t
- iterator. Returns TRUE if any paths were removed and FALSE if none were
+/* Remove all paths from MERGEINFO which map to empty rangelists.
+
+ Return TRUE if any paths were removed and FALSE if none were
removed or MERGEINFO is NULL. */
svn_boolean_t
svn_mergeinfo__remove_empty_rangelists(svn_mergeinfo_t mergeinfo,
- apr_pool_t *pool);
+ apr_pool_t *scratch_pool);
/* Make a shallow (ie, mergeinfos are not duped, or altered at all;
keys share storage) copy of IN_CATALOG in *OUT_CATALOG, removing
diff --git a/subversion/include/private/svn_mutex.h b/subversion/include/private/svn_mutex.h
index c64769717b40..c04820bacbbb 100644
--- a/subversion/include/private/svn_mutex.h
+++ b/subversion/include/private/svn_mutex.h
@@ -39,27 +39,23 @@ extern "C" {
* This is a simple wrapper around @c apr_thread_mutex_t and will be a
* valid identifier even if APR does not support threading.
*/
-#if APR_HAS_THREADS
/** A mutex for synchronization between threads. It may be NULL, in
* which case no synchronization will take place. The latter is useful
* when implementing some functionality with optional synchronization.
*/
-typedef apr_thread_mutex_t svn_mutex__t;
-
-#else
-
-/** Dummy definition. The content will never be actually accessed.
- */
-typedef void svn_mutex__t;
-
-#endif
+typedef struct svn_mutex__t svn_mutex__t;
/** Initialize the @a *mutex. If @a mutex_required is TRUE, the mutex will
* actually be created with a lifetime defined by @a result_pool. Otherwise,
* the pointer will be set to @c NULL and svn_mutex__lock() as well as
* svn_mutex__unlock() will be no-ops.
*
+ * We don't support recursive locks, i.e. a thread may not acquire the same
+ * mutex twice without releasing it in between. Attempts to lock a mutex
+ * recursively will cause lock ups and other undefined behavior on some
+ * systems.
+ *
* If threading is not supported by APR, this function is a no-op.
*/
svn_error_t *
diff --git a/subversion/include/private/svn_named_atomic.h b/subversion/include/private/svn_named_atomic.h
deleted file mode 100644
index 4efa255e7583..000000000000
--- a/subversion/include/private/svn_named_atomic.h
+++ /dev/null
@@ -1,162 +0,0 @@
-/**
- * @copyright
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- * @endcopyright
- *
- * @file svn_named_atomics.h
- * @brief Structures and functions for machine-wide named atomics.
- * These atomics store 64 bit signed integer values and provide
- * a number of basic operations on them. Instead of an address,
- * these atomics are identified by strings / names. We also support
- * namespaces - mainly to separate debug from production data.
- */
-
-#ifndef SVN_NAMED_ATOMICS_H
-#define SVN_NAMED_ATOMICS_H
-
-#include "svn_error.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/** An opaque structure that represents a namespace, i.e. a container
- * for named atomics.
- */
-typedef struct svn_atomic_namespace__t svn_atomic_namespace__t;
-
-/** An opaque structure that represents a named, system-wide visible
- * 64 bit integer with atomic access routines.
- */
-typedef struct svn_named_atomic__t svn_named_atomic__t;
-
-/** Maximum length of the name of any atomic (excluding the terminal NUL).
- */
-#define SVN_NAMED_ATOMIC__MAX_NAME_LENGTH 30
-
-/** Returns #FALSE when named atomics are not available to our process
- * and svn_atomic_namespace__create is likely to fail.
- *
- * @note The actual check will be performed only once and later
- * changes in process privileges will not reflect in the outcome of future
- * calls to this function.
- */
-svn_boolean_t
-svn_named_atomic__is_supported(void);
-
-/** Returns #TRUE on platforms that don't need expensive synchronization
- * objects to serialize access to named atomics. If this returns #FALSE,
- * reading from or modifying a #svn_named_atomic__t may be as expensive
- * as a file system operation.
- */
-svn_boolean_t
-svn_named_atomic__is_efficient(void);
-
-/** Create a namespace (i.e. access object) with the given @a name and
- * return it in @a *ns.
- *
- * Multiple access objects with the same name may be created. They access
- * the same shared memory region but have independent lifetimes.
- *
- * The access object will be allocated in @a result_pool and atomics gotten
- * from this object will become invalid when the pool is being cleared.
- */
-svn_error_t *
-svn_atomic_namespace__create(svn_atomic_namespace__t **ns,
- const char *name,
- apr_pool_t *result_pool);
-
-/** Removes persistent data structures (files in particular) that got
- * created for the namespace given by @a name. Use @a pool for temporary
- * allocations.
- *
- * @note You must not call this while the respective namespace is still
- * in use. Calling this multiple times for the same namespace is safe.
- */
-svn_error_t *
-svn_atomic_namespace__cleanup(const char *name,
- apr_pool_t *pool);
-
-/** Find the atomic with the specified @a name in namespace @a ns and
- * return it in @a *atomic. If no object with that name can be found, the
- * behavior depends on @a auto_create. If it is @c FALSE, @a *atomic will
- * be set to @c NULL. Otherwise, a new atomic will be created, its value
- * set to 0 and the access structure be returned in @a *atomic.
- *
- * Note that @a name must not exceed #SVN_NAMED_ATOMIC__MAX_NAME_LENGTH
- * characters and an error will be returned if the specified name is longer
- * than supported.
- *
- * @note The lifetime of the atomic object is bound to the lifetime
- * of the @a ns object, i.e. the pool the latter was created in.
- * The data in the namespace persists as long as at least one process
- * holds an #svn_atomic_namespace__t object corresponding to it.
- */
-svn_error_t *
-svn_named_atomic__get(svn_named_atomic__t **atomic,
- svn_atomic_namespace__t *ns,
- const char *name,
- svn_boolean_t auto_create);
-
-/** Read the @a atomic and return its current @a *value.
- * An error will be returned if @a atomic is @c NULL.
- */
-svn_error_t *
-svn_named_atomic__read(apr_int64_t *value,
- svn_named_atomic__t *atomic);
-
-/** Set the data in @a atomic to @a new_value and return its old content
- * in @a *old_value. @a old_value may be NULL.
- *
- * An error will be returned if @a atomic is @c NULL.
- */
-svn_error_t *
-svn_named_atomic__write(apr_int64_t *old_value,
- apr_int64_t new_value,
- svn_named_atomic__t *atomic);
-
-/** Add @a delta to the data in @a atomic and return its new value in
- * @a *new_value. @a new_value may be null.
- *
- * An error will be returned if @a atomic is @c NULL.
- */
-svn_error_t *
-svn_named_atomic__add(apr_int64_t *new_value,
- apr_int64_t delta,
- svn_named_atomic__t *atomic);
-
-/** If the current data in @a atomic equals @a comperand, set it to
- * @a new_value. Return the initial value in @a *old_value.
- * @a old_value may be NULL.
- *
- * An error will be returned if @a atomic is @c NULL.
- */
-svn_error_t *
-svn_named_atomic__cmpxchg(apr_int64_t *old_value,
- apr_int64_t new_value,
- apr_int64_t comperand,
- svn_named_atomic__t *atomic);
-
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* SVN_NAMED_ATOMICS_H */
diff --git a/subversion/include/private/svn_object_pool.h b/subversion/include/private/svn_object_pool.h
new file mode 100644
index 000000000000..7a9383e5f625
--- /dev/null
+++ b/subversion/include/private/svn_object_pool.h
@@ -0,0 +1,154 @@
+/**
+ * @copyright
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ * @endcopyright
+ *
+ * @file svn_object_pool.h
+ * @brief multithreaded object pool API
+ *
+ * This is the core data structure behind various object pools. It
+ * provides a thread-safe associative container for object instances of
+ * the same type.
+ *
+ * Memory and lifetime management for the objects are handled by the pool.
+ * Reference counting takes care that neither objects nor the object pool
+ * get actually destroyed while other parts depend on them. All objects
+ * are thought to be recycle-able and live in their own root memory pools
+ * making them (potentially) safe to be used from different threads.
+ * Currently unused objects may be kept around for a while and returned
+ * by the next lookup.
+ *
+ * Two modes are supported: shared use and exclusive use. In shared mode,
+ * any object can be handed out to multiple users and in potentially
+ * different threads at the same time. In exclusive mode, the same object
+ * will only be referenced at most once.
+ *
+ * Object creation and access must be provided outside this structure.
+ * In particular, the using container will usually wrap the actual object
+ * in a meta-data struct containing key information etc and must provide
+ * getters and setters for those wrapper structs.
+ */
+
+
+
+#ifndef SVN_OBJECT_POOL_H
+#define SVN_OBJECT_POOL_H
+
+#include <apr.h> /* for apr_int64_t */
+#include <apr_pools.h> /* for apr_pool_t */
+#include <apr_hash.h> /* for apr_hash_t */
+
+#include "svn_types.h"
+
+#include "private/svn_mutex.h"
+#include "private/svn_string_private.h"
+
+
+
+/* The opaque object container type. */
+typedef struct svn_object_pool__t svn_object_pool__t;
+
+/* Extract the actual object from the WRAPPER using optional information
+ * from BATON (provided through #svn_object_pool__lookup) and return it.
+ * The result will be used with POOL and must remain valid throughout
+ * POOL's lifetime.
+ *
+ * It is legal to return a copy, allocated in POOL, of the wrapped object.
+ */
+typedef void * (* svn_object_pool__getter_t)(void *wrapper,
+ void *baton,
+ apr_pool_t *pool);
+
+/* Copy the information from the SOURCE object wrapper into the already
+ * existing *TARGET object wrapper using POOL for allocations and BATON
+ * for optional context (provided through #svn_object_pool__insert).
+ */
+typedef svn_error_t * (* svn_object_pool__setter_t)(void **target,
+ void *source,
+ void *baton,
+ apr_pool_t *pool);
+
+/* Create a new object pool in POOL and return it in *OBJECT_POOL.
+ * Objects will be extracted using GETTER and updated using SETTER. Either
+ * one (or both) may be NULL and the default implementation assumes that
+ * wrapper == object and updating is a no-op.
+ *
+ * If THREAD_SAFE is not set, neither the object pool nor the object
+ * references returned from it may be accessed from multiple threads.
+ *
+ * It is not legal to call any API on the object pool after POOL got
+ * cleared or destroyed. However, existing object references handed out
+ * from the object pool remain valid and will keep the internal pool data
+ * structures alive for as long as such object references exist.
+ */
+svn_error_t *
+svn_object_pool__create(svn_object_pool__t **object_pool,
+ svn_object_pool__getter_t getter,
+ svn_object_pool__setter_t setter,
+ svn_boolean_t thread_safe,
+ apr_pool_t *pool);
+
+/* Return the root pool containing the OBJECT_POOL and all sub-structures.
+ */
+apr_pool_t *
+svn_object_pool__new_wrapper_pool(svn_object_pool__t *object_pool);
+
+/* Return the mutex used to serialize all OBJECT_POOL access.
+ */
+svn_mutex__t *
+svn_object_pool__mutex(svn_object_pool__t *object_pool);
+
+/* Return the number of object instances (used or unused) in OBJECT_POOL.
+ */
+unsigned
+svn_object_pool__count(svn_object_pool__t *object_pool);
+
+/* In OBJECT_POOL, look for an available object by KEY and return a
+ * reference to it in *OBJECT. If none can be found, *OBJECT will be NULL.
+ * BATON will be passed to OBJECT_POOL's getter function. The reference
+ * will be returned when *RESULT_POOL gets cleaned up or destroyed.
+ */
+svn_error_t *
+svn_object_pool__lookup(void **object,
+ svn_object_pool__t *object_pool,
+ svn_membuf_t *key,
+ void *baton,
+ apr_pool_t *result_pool);
+
+/* Store the wrapped object WRAPPER under KEY in OBJECT_POOL and return
+ * a reference to the object in *OBJECT (just like lookup).
+ *
+ * The object must have been created in WRAPPER_POOL and the latter must
+ * be a sub-pool of OBJECT_POOL's root POOL (see #svn_object_pool__pool).
+ *
+ * BATON will be passed to OBJECT_POOL's setter and getter functions.
+ * The reference will be returned when *RESULT_POOL gets cleaned up or
+ * destroyed.
+ */
+svn_error_t *
+svn_object_pool__insert(void **object,
+ svn_object_pool__t *object_pool,
+ const svn_membuf_t *key,
+ void *wrapper,
+ void *baton,
+ apr_pool_t *wrapper_pool,
+ apr_pool_t *result_pool);
+
+#endif /* SVN_OBJECT_POOL_H */
diff --git a/subversion/include/private/svn_opt_private.h b/subversion/include/private/svn_opt_private.h
index 6ae67a5bfb32..89e722760802 100644
--- a/subversion/include/private/svn_opt_private.h
+++ b/subversion/include/private/svn_opt_private.h
@@ -46,10 +46,6 @@ extern "C" {
* UTF8_TARGET need not be canonical. *TRUE_TARGET will not be canonical
* unless UTF8_TARGET is.
*
- * It is an error if *TRUE_TARGET results in the empty string after the
- * split, which happens in case UTF8_TARGET has a leading '@' character
- * with no additional '@' characters to escape the first '@'.
- *
* Note that *PEG_REVISION will still contain the '@' symbol as the first
* character if a peg revision was found. If a trailing '@' symbol was
* used to escape other '@' characters in UTF8_TARGET, *PEG_REVISION will
diff --git a/subversion/include/private/svn_packed_data.h b/subversion/include/private/svn_packed_data.h
new file mode 100644
index 000000000000..6faf0dd0e116
--- /dev/null
+++ b/subversion/include/private/svn_packed_data.h
@@ -0,0 +1,255 @@
+/* packed_data.h : Interface to the packed binary stream data structure
+ *
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ */
+
+#ifndef SVN_PACKED_DATA_H
+#define SVN_PACKED_DATA_H
+
+#include "svn_string.h"
+#include "svn_io.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* This API provides Yet Another Serialization Framework.
+ *
+ * It is geared towards efficiently encoding collections of structured
+ * binary data (e.g. an array of noderev objects). The basic idea is to
+ * transform them into hierarchies of streams with each stream usually
+ * corresponding to a single attribute in the original data structures.
+ * The user is free model the mapping structure <-> streams mapping as she
+ * sees fit.
+ *
+ * With all data inside the same (sub-)stream carrying similar attribute
+ * values, the whole stream lends itself to data compression. Strings /
+ * plain byte sequences will be stored as is. Numbers use a 7b/8b encoding
+ * scheme to eliminate leading zeros. Because values are often dependent
+ * (increasing offsets, roughly similar revision number, etc.), streams
+ * can be configured as storing (hopefully shorter) deltas instead of the
+ * original value.
+ *
+ * Two stream types are provided: integer and byte streams. While the
+ * first store 64 bit integers only and can be configured to assume
+ * signed and / or deltifyable data, the second will store arbitrary
+ * byte sequences including their length. At the root level, you may
+ * create an arbitrary number of integer and byte streams. Any stream
+ * may have an arbitrary number of sub-streams of the same kind. You
+ * should create the full stream hierarchy before writing any data to it.
+ *
+ * As a convenience, when an integer stream has sub-streams, you may write
+ * to the parent stream instead of all sub-streams individually and the
+ * values will be passed down automatically in a round-robin fashion.
+ * Reading from the parent stream is similarly supported.
+ *
+ * When all data has been added to the stream, it can be written to an
+ * ordinary svn_stream_t. First, we write a description of the stream
+ * structure (types, sub-streams, sizes and configurations) followed by
+ * zlib compressed stream content. For each top-level stream, all sub-
+ * stream data will be concatenated and then compressed as a single block.
+ * To maximize the effect of this, make sure all data in that stream
+ * hierarchy has a similar value distribution.
+ *
+ * Reading data starts with an svn_stream_t and automatically recreates
+ * the stream hierarchies. You only need to extract data from it in the
+ * same order as you wrote it.
+ *
+ * Although not enforced programmatically, you may either only write to a
+ * stream hierarchy or only read from it but you cannot do both on the
+ * same data structure.
+ */
+
+
+
+/* We pack / unpack integers en block to minimize calling and setup overhead.
+ * This is the number of integers we put into a buffer before writing them
+ * them to / after reading them from the 7b/8b stream. Under 64 bits, this
+ * value creates a 128 byte data structure (14 + 2 integers, 8 bytes each).
+ */
+#define SVN__PACKED_DATA_BUFFER_SIZE 14
+
+
+/* Data types. */
+
+/* Opaque type for the root object.
+ */
+typedef struct svn_packed__data_root_t svn_packed__data_root_t;
+
+/* Opaque type for byte streams.
+ */
+typedef struct svn_packed__byte_stream_t svn_packed__byte_stream_t;
+
+/* Semi-opaque type for integer streams. We expose the unpacked buffer
+ * to allow for replacing svn_packed__add_uint and friends by macros.
+ */
+typedef struct svn_packed__int_stream_t
+{
+ /* pointer to the remainder of the data structure */
+ void *private_data;
+
+ /* number of value entries in BUFFER */
+ apr_size_t buffer_used;
+
+ /* unpacked integers (either yet to be packed or pre-fetched from the
+ * packed buffers). Only the first BUFFER_USED entries are valid. */
+ apr_uint64_t buffer[SVN__PACKED_DATA_BUFFER_SIZE];
+} svn_packed__int_stream_t;
+
+
+/* Writing data. */
+
+/* Return a new serialization root object, allocated in POOL.
+ */
+svn_packed__data_root_t *
+svn_packed__data_create_root(apr_pool_t *pool);
+
+/* Create and return a new top-level integer stream in ROOT. If signed,
+ * negative numbers will be put into that stream, SIGNED_INTS should be
+ * TRUE as a more efficient encoding will be used in that case. Set
+ * DIFF to TRUE if you expect the difference between consecutive numbers
+ * to be much smaller (~100 times) than the actual numbers.
+ */
+svn_packed__int_stream_t *
+svn_packed__create_int_stream(svn_packed__data_root_t *root,
+ svn_boolean_t diff,
+ svn_boolean_t signed_ints);
+
+/* Create and return a sub-stream to the existing integer stream PARENT.
+ * If signed, negative numbers will be put into that stream, SIGNED_INTS
+ * should be TRUE as a more efficient encoding will be used in that case.
+ * Set DIFF to TRUE if you expect the difference between consecutive numbers
+ * to be much smaller (~100 times) than the actual numbers.
+ */
+svn_packed__int_stream_t *
+svn_packed__create_int_substream(svn_packed__int_stream_t *parent,
+ svn_boolean_t diff,
+ svn_boolean_t signed_ints);
+
+/* Create and return a new top-level byte sequence stream in ROOT.
+ */
+svn_packed__byte_stream_t *
+svn_packed__create_bytes_stream(svn_packed__data_root_t *root);
+
+/* Write the unsigned integer VALUE to STEAM.
+ */
+void
+svn_packed__add_uint(svn_packed__int_stream_t *stream,
+ apr_uint64_t value);
+
+/* Write the signed integer VALUE to STEAM.
+ */
+void
+svn_packed__add_int(svn_packed__int_stream_t *stream,
+ apr_int64_t value);
+
+/* Write the sequence stating at DATA containing LEN bytes to STEAM.
+ */
+void
+svn_packed__add_bytes(svn_packed__byte_stream_t *stream,
+ const char *data,
+ apr_size_t len);
+
+/* Write all contents of ROOT (including all sub-streams) to STREAM.
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_error_t *
+svn_packed__data_write(svn_stream_t *stream,
+ svn_packed__data_root_t *root,
+ apr_pool_t *scratch_pool);
+
+
+/* Reading data. */
+
+/* Return the first integer stream in ROOT. Returns NULL in case there
+ * aren't any.
+ */
+svn_packed__int_stream_t *
+svn_packed__first_int_stream(svn_packed__data_root_t *root);
+
+/* Return the first byte sequence stream in ROOT. Returns NULL in case
+ * there aren't any.
+ */
+svn_packed__byte_stream_t *
+svn_packed__first_byte_stream(svn_packed__data_root_t *root);
+
+/* Return the next (sibling) integer stream to STREAM. Returns NULL in
+ * case there isn't any.
+ */
+svn_packed__int_stream_t *
+svn_packed__next_int_stream(svn_packed__int_stream_t *stream);
+
+/* Return the next (sibling) byte sequence stream to STREAM. Returns NULL
+ * in case there isn't any.
+ */
+svn_packed__byte_stream_t *
+svn_packed__next_byte_stream(svn_packed__byte_stream_t *stream);
+
+/* Return the first sub-stream of STREAM. Returns NULL in case there
+ * isn't any.
+ */
+svn_packed__int_stream_t *
+svn_packed__first_int_substream(svn_packed__int_stream_t *stream);
+
+/* Return the number of integers left to read from STREAM.
+ */
+apr_size_t
+svn_packed__int_count(svn_packed__int_stream_t *stream);
+
+/* Return the number of bytes left to read from STREAM.
+ */
+apr_size_t
+svn_packed__byte_count(svn_packed__byte_stream_t *stream);
+
+/* Return the next number from STREAM as unsigned integer. Returns 0 when
+ * reading beyond the end of the stream.
+ */
+apr_uint64_t
+svn_packed__get_uint(svn_packed__int_stream_t *stream);
+
+/* Return the next number from STREAM as signed integer. Returns 0 when
+ * reading beyond the end of the stream.
+ */
+apr_int64_t
+svn_packed__get_int(svn_packed__int_stream_t *stream);
+
+/* Return the next byte sequence from STREAM and set *LEN to the length
+ * of that sequence. Sets *LEN to 0 when reading beyond the end of the
+ * stream.
+ */
+const char *
+svn_packed__get_bytes(svn_packed__byte_stream_t *stream,
+ apr_size_t *len);
+
+/* Allocate a new packed data root in RESULT_POOL, read its structure and
+ * stream contents from STREAM and return it in *ROOT_P. Use SCRATCH_POOL
+ * for temporary allocations.
+ */
+svn_error_t *
+svn_packed__data_read(svn_packed__data_root_t **root_p,
+ svn_stream_t *stream,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* SVN_PACKED_DATA_H */
diff --git a/subversion/include/private/svn_pseudo_md5.h b/subversion/include/private/svn_pseudo_md5.h
deleted file mode 100644
index 34d59296e8fe..000000000000
--- a/subversion/include/private/svn_pseudo_md5.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * @copyright
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- * @endcopyright
- *
- * @file svn_pseudo_md5.h
- * @brief Subversion hash sum calculation for runtime data (only)
- */
-
-#ifndef SVN_PSEUDO_MD5_H
-#define SVN_PSEUDO_MD5_H
-
-#include <apr.h> /* for apr_uint32_t */
-
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-
-/**
- * Calculates a hash sum for 15 bytes in @a x and returns it in @a digest.
- * The most significant byte in @a x must be 0 (independent of being on a
- * little or big endian machine).
- *
- * @note Use for runtime data hashing only.
- *
- * @note The output is NOT an MD5 digest shares has the same basic
- * cryptographic properties. Collisions with proper MD5 on the same
- * or other input data is equally unlikely as any MD5 collision.
- */
-void svn__pseudo_md5_15(apr_uint32_t digest[4],
- const apr_uint32_t x[4]);
-
-/**
- * Calculates a hash sum for 31 bytes in @a x and returns it in @a digest.
- * The most significant byte in @a x must be 0 (independent of being on a
- * little or big endian machine).
- *
- * @note Use for runtime data hashing only.
- *
- * @note The output is NOT an MD5 digest shares has the same basic
- * cryptographic properties. Collisions with proper MD5 on the same
- * or other input data is equally unlikely as any MD5 collision.
- */
-void svn__pseudo_md5_31(apr_uint32_t digest[4],
- const apr_uint32_t x[8]);
-
-/**
- * Calculates a hash sum for 63 bytes in @a x and returns it in @a digest.
- * The most significant byte in @a x must be 0 (independent of being on a
- * little or big endian machine).
- *
- * @note Use for runtime data hashing only.
- *
- * @note The output is NOT an MD5 digest shares has the same basic
- * cryptographic properties. Collisions with proper MD5 on the same
- * or other input data is equally unlikely as any MD5 collision.
- */
-void svn__pseudo_md5_63(apr_uint32_t digest[4],
- const apr_uint32_t x[16]);
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-
-#endif /* SVN_PSEUDO_MD5_H */
diff --git a/subversion/include/private/svn_ra_private.h b/subversion/include/private/svn_ra_private.h
index accca3d4f484..1afa07148a65 100644
--- a/subversion/include/private/svn_ra_private.h
+++ b/subversion/include/private/svn_ra_private.h
@@ -39,6 +39,33 @@
extern "C" {
#endif /* __cplusplus */
+
+
+/**
+ * Open a new ra session @a *new_session to the same repository as an existing
+ * ra session @a old_session, copying the callbacks, auth baton, etc. from the
+ * old session. This essentially limits the lifetime of the new, duplicated
+ * session to the lifetime of the old session. If the new session should
+ * outlive the new session, creating a new session using svn_ra_open4() is
+ * recommended.
+ *
+ * If @a session_url is not NULL, parent the new session at session_url. Note
+ * that @a session_url MUST BE in the same repository as @a old_session or an
+ * error will be returned. When @a session_url NULL the same session root
+ * will be used.
+ *
+ * Allocate @a new_session in @a result_pool. Perform temporary allocations
+ * in @a scratch_pool.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_ra__dup_session(svn_ra_session_t **new_session,
+ svn_ra_session_t *old_session,
+ const char *session_url,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
/* Equivalent to svn_ra__assert_capable_server()
for SVN_RA_CAPABILITY_MERGEINFO. */
svn_error_t *
diff --git a/subversion/include/private/svn_ra_svn_private.h b/subversion/include/private/svn_ra_svn_private.h
index b4294d048f0e..bc2fa4533f31 100644
--- a/subversion/include/private/svn_ra_svn_private.h
+++ b/subversion/include/private/svn_ra_svn_private.h
@@ -43,6 +43,12 @@ svn_ra_svn__set_shim_callbacks(svn_ra_svn_conn_t *conn,
svn_delta_shim_callbacks_t *shim_callbacks);
/**
+ * Return the memory pool used to allocate @a conn.
+ */
+apr_pool_t *
+svn_ra_svn__get_pool(svn_ra_svn_conn_t *conn);
+
+/**
* @defgroup ra_svn_deprecated ra_svn low-level functions
* @{
*/
@@ -83,6 +89,15 @@ svn_ra_svn__write_word(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
const char *word);
+/** Write a boolean over the net.
+ *
+ * Writes will be buffered until the next read or flush.
+ */
+svn_error_t *
+svn_ra_svn__write_boolean(svn_ra_svn_conn_t *conn,
+ apr_pool_t *pool,
+ svn_boolean_t value);
+
/** Write a list of properties over the net. @a props is allowed to be NULL,
* in which case an empty list will be written out.
*
@@ -186,6 +201,7 @@ svn_ra_svn__skip_leading_garbage(svn_ra_svn_conn_t *conn,
w const char ** Word
b svn_boolean_t * Word ("true" or "false")
B apr_uint64_t * Word ("true" or "false")
+ 3 svn_tristate_t * Word ("true" or "false")
l apr_array_header_t ** List
( Begin tuple
) End tuple
@@ -196,14 +212,18 @@ svn_ra_svn__skip_leading_garbage(svn_ra_svn_conn_t *conn,
* the end of the specification. So if @a fmt is "c?cc" and @a list
* contains two elements, an error will result.
*
- * 'B' is similar to 'b', but may be used in the optional tuple specification.
- * It returns TRUE, FALSE, or SVN_RA_SVN_UNSPECIFIED_NUMBER.
+ * '3' is similar to 'b', but may be used in the optional tuple specification.
+ * It returns #svn_tristate_true, #svn_tristate_false or #svn_tristate_unknown.
+ *
+ * 'B' is similar to '3', but it returns @c TRUE, @c FALSE, or
+ * #SVN_RA_SVN_UNSPECIFIED_NUMBER. 'B' is deprecated; new code should
+ * use '3' instead.
*
* If an optional part of a tuple contains no data, 'r' values will be
- * set to @c SVN_INVALID_REVNUM, 'n' and 'B' values will be set to
- * SVN_RA_SVN_UNSPECIFIED_NUMBER, and 's', 'c', 'w', and 'l' values
- * will be set to @c NULL. 'b' may not appear inside an optional
- * tuple specification; use 'B' instead.
+ * set to @c SVN_INVALID_REVNUM; 'n' and 'B' values will be set to
+ * #SVN_RA_SVN_UNSPECIFIED_NUMBER; 's', 'c', 'w', and 'l' values
+ * will be set to @c NULL; and '3' values will be set to #svn_tristate_unknown
+ * 'b' may not appear inside an optional tuple specification; use '3' instead.
*/
svn_error_t *
svn_ra_svn__parse_tuple(const apr_array_header_t *list,
@@ -236,6 +256,33 @@ svn_ra_svn__read_cmd_response(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
const char *fmt, ...);
+/** Check the receive buffer and socket of @a conn whether there is some
+ * unprocessed incoming data without waiting for new data to come in.
+ * If data is found, set @a *has_command to TRUE. If the connection does
+ * not contain any more data and has been closed, set @a *terminated to
+ * TRUE.
+ */
+svn_error_t *
+svn_ra_svn__has_command(svn_boolean_t *has_command,
+ svn_boolean_t *terminated,
+ svn_ra_svn_conn_t *conn,
+ apr_pool_t *pool);
+
+/** Accept a single command from @a conn and handle them according
+ * to @a cmd_hash. Command handlers will be passed @a conn, @a pool,
+ * the parameters of the command, and @a baton. @a *terminate will be
+ * set if either @a error_on_disconnect is FALSE and the connection got
+ * closed, or if the command being handled has the "terminate" flag set
+ * in the command table.
+ */
+svn_error_t *
+svn_ra_svn__handle_command(svn_boolean_t *terminate,
+ apr_hash_t *cmd_hash,
+ void *baton,
+ svn_ra_svn_conn_t *conn,
+ svn_boolean_t error_on_disconnect,
+ apr_pool_t *pool);
+
/** Accept commands over the network and handle them according to @a
* commands. Command handlers will be passed @a conn, a subpool of @a
* pool (cleared after each command is handled), the parameters of the
@@ -267,11 +314,13 @@ svn_ra_svn__write_cmd_response(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
const char *fmt, ...);
-/** Write an unsuccessful command response over the network. */
+/** Write an unsuccessful command response over the network.
+ *
+ * @note This does not clear @a err. */
svn_error_t *
svn_ra_svn__write_cmd_failure(svn_ra_svn_conn_t *conn,
apr_pool_t *pool,
- svn_error_t *err);
+ const svn_error_t *err);
/**
* @}
@@ -563,7 +612,11 @@ svn_ra_svn__write_cmd_get_dated_rev(svn_ra_svn_conn_t *conn,
/** Send a "change-rev-prop2" command over connection @a conn.
* Use @a pool for allocations.
*
- * @see #svn_ra_change_rev_prop2 for a description.
+ * If @a dont_care is false then check that the old value matches
+ * @a old_value. If @a dont_care is true then do not check the old
+ * value; in this case @a old_value must be NULL.
+ *
+ * @see #svn_ra_change_rev_prop2 for the rest of the description.
*/
svn_error_t *
svn_ra_svn__write_cmd_change_rev_prop2(svn_ra_svn_conn_t *conn,
@@ -819,6 +872,77 @@ svn_ra_svn__write_cmd_finish_replay(svn_ra_svn_conn_t *conn,
/**
* @}
*/
+
+/**
+ * @defgroup svn_send_data sending data structures over ra_svn
+ * @{
+ */
+
+/** Send a changed path (as part of transmitting a log entry) over connection
+ * @a conn. Use @a pool for allocations.
+ *
+ * @see svn_log_changed_path2_t for a description of the other parameters.
+ */
+svn_error_t *
+svn_ra_svn__write_data_log_changed_path(svn_ra_svn_conn_t *conn,
+ apr_pool_t *pool,
+ const char *path,
+ char action,
+ const char *copyfrom_path,
+ svn_revnum_t copyfrom_rev,
+ svn_node_kind_t node_kind,
+ svn_boolean_t text_modified,
+ svn_boolean_t props_modified);
+
+/** Send a the details of a log entry (as part of transmitting a log entry
+ * and without revprops and changed paths) over connection @a conn.
+ * Use @a pool for allocations.
+ *
+ * @a author, @a date and @a message have been extracted and removed from
+ * the revprops to follow. @a has_children is taken directly from the
+ * #svn_log_entry_t struct. @a revision is too, except when it equals
+ * #SVN_INVALID_REVNUM. In that case, @a revision must be 0 and
+ * @a invalid_revnum be set to TRUE. @a revprop_count is the number of
+ * revprops that will follow in the revprops list.
+ */
+svn_error_t *
+svn_ra_svn__write_data_log_entry(svn_ra_svn_conn_t *conn,
+ apr_pool_t *pool,
+ svn_revnum_t revision,
+ const svn_string_t *author,
+ const svn_string_t *date,
+ const svn_string_t *message,
+ svn_boolean_t has_children,
+ svn_boolean_t invalid_revnum,
+ unsigned revprop_count);
+
+/**
+ * @}
+ */
+
+/**
+ * @defgroup svn_read_data reading data structures from ra_svn
+ * @{
+ */
+
+/** Take the data tuple ITEMS received over ra_svn and convert it to the
+ * a changed path (as part of receiving a log entry).
+ *
+ * @see svn_log_changed_path2_t for a description of the output parameters.
+ */
+svn_error_t *
+svn_ra_svn__read_data_log_changed_entry(const apr_array_header_t *items,
+ svn_string_t **cpath,
+ const char **action,
+ const char **copy_path,
+ svn_revnum_t *copy_rev,
+ const char **kind_str,
+ apr_uint64_t *text_mods,
+ apr_uint64_t *prop_mods);
+/**
+ * @}
+ */
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/subversion/include/private/svn_repos_private.h b/subversion/include/private/svn_repos_private.h
index 09e4037e7caa..c5a232f29b55 100644
--- a/subversion/include/private/svn_repos_private.h
+++ b/subversion/include/private/svn_repos_private.h
@@ -32,16 +32,30 @@
#include "svn_types.h"
#include "svn_repos.h"
#include "svn_editor.h"
+#include "svn_config.h"
+
+#include "private/svn_string_private.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
-/** Validate that property @a name is valid for use in a Subversion
- * repository; return @c SVN_ERR_REPOS_BAD_ARGS if it isn't. For some
- * "svn:" properties, also validate the @a value, and return
- * @c SVN_ERR_BAD_PROPERTY_VALUE if it is not valid.
+/** Validate that property @a name with @a value is valid (as an addition
+ * or edit or deletion) in a Subversion repository. Return an error if not.
+ *
+ * If @a value is NULL, return #SVN_NO_ERROR to indicate that any property
+ * may be deleted, even an invalid one. Otherwise, if the @a name is not
+ * of kind #svn_prop_regular_kind (see #svn_prop_kind_t), return
+ * #SVN_ERR_REPOS_BAD_ARGS. Otherwise, for some "svn:" properties, also
+ * perform some validations on the @a value (e.g., for such properties,
+ * typically the @a value must be in UTF-8 with LF linefeeds), and return
+ * #SVN_ERR_BAD_PROPERTY_VALUE if it is not valid.
+ *
+ * Validations may be added in future releases, for example, for
+ * newly-added #SVN_PROP_PREFIX properties. However, user-defined
+ * (non-#SVN_PROP_PREFIX) properties will never have their @a value
+ * validated in any way.
*
* Use @a pool for temporary allocations.
*
@@ -113,10 +127,260 @@ svn_repos__replay_ev2(svn_fs_root_t *root,
void *authz_read_baton,
apr_pool_t *scratch_pool);
-/* A private addition to svn_repos_notify_warning_t. */
-#define svn_repos__notify_warning_invalid_mergeinfo \
- ((svn_repos_notify_warning_t)(-1))
+/* Given a PATH which might be a relative repo URL (^/), an absolute
+ * local repo URL (file://), an absolute path outside of the repo
+ * or a location in the Windows registry.
+ *
+ * Retrieve the configuration data that PATH points at and parse it into
+ * CFG_P allocated in POOL.
+ *
+ * If PATH cannot be parsed as a config file then an error is returned. The
+ * contents of CFG_P is then undefined. If MUST_EXIST is TRUE, a missing
+ * authz file is also an error. The CASE_SENSITIVE controls the lookup
+ * behavior for section and option names alike.
+ *
+ * REPOS_ROOT points at the root of the repos you are
+ * going to apply the authz against, can be NULL if you are sure that you
+ * don't have a repos relative URL in PATH. */
+svn_error_t *
+svn_repos__retrieve_config(svn_config_t **cfg_p,
+ const char *path,
+ svn_boolean_t must_exist,
+ svn_boolean_t case_sensitive,
+ apr_pool_t *pool);
+
+/**
+ * @defgroup svn_config_pool Configuration object pool API
+ * @{
+ */
+
+/* Opaque thread-safe factory and container for configuration objects.
+ *
+ * Instances handed out are read-only and may be given to multiple callers
+ * from multiple threads. Configuration objects no longer referenced by
+ * any user may linger for a while before being cleaned up.
+ */
+typedef struct svn_repos__config_pool_t svn_repos__config_pool_t;
+
+/* Create a new configuration pool object with a lifetime determined by
+ * POOL and return it in *CONFIG_POOL.
+ *
+ * The THREAD_SAFE flag indicates whether the pool actually needs to be
+ * thread-safe and POOL must be also be thread-safe if this flag is set.
+ */
+svn_error_t *
+svn_repos__config_pool_create(svn_repos__config_pool_t **config_pool,
+ svn_boolean_t thread_safe,
+ apr_pool_t *pool);
+/* Set *CFG to a read-only reference to the current contents of the
+ * configuration specified by PATH. If the latter is a URL, we read the
+ * data from a local repository. CONFIG_POOL will store the configuration
+ * and make further callers use the same instance if the content matches.
+ * If KEY is not NULL, *KEY will be set to a unique ID - if available.
+ *
+ * If MUST_EXIST is TRUE, a missing config file is also an error, *CFG
+ * is otherwise simply NULL. The CASE_SENSITIVE controls the lookup
+ * behavior for section and option names alike.
+ *
+ * PREFERRED_REPOS is only used if it is not NULL and PATH is a URL.
+ * If it matches the URL, access the repository through this object
+ * instead of creating a new repo instance. Note that this might not
+ * return the latest content.
+ *
+ * POOL determines the minimum lifetime of *CFG (may remain cached after
+ * release) but must not exceed the lifetime of the pool provided to
+ * #svn_repos__config_pool_create.
+ */
+svn_error_t *
+svn_repos__config_pool_get(svn_config_t **cfg,
+ svn_membuf_t **key,
+ svn_repos__config_pool_t *config_pool,
+ const char *path,
+ svn_boolean_t must_exist,
+ svn_boolean_t case_sensitive,
+ svn_repos_t *preferred_repos,
+ apr_pool_t *pool);
+
+/** @} */
+
+/**
+ * @defgroup svn_authz_pool Authz object pool API
+ * @{
+ */
+
+/* Opaque thread-safe factory and container for authorization objects.
+ *
+ * Instances handed out are read-only and may be given to multiple callers
+ * from multiple threads. Authorization objects no longer referenced by
+ * any user may linger for a while before being cleaned up.
+ */
+typedef struct svn_repos__authz_pool_t svn_repos__authz_pool_t;
+
+/* Create a new authorization pool object with a lifetime determined by
+ * POOL and return it in *AUTHZ_POOL. CONFIG_POOL will be the common
+ * source for the configuration data underlying the authz objects and must
+ * remain valid at least until POOL cleanup.
+ *
+ * The THREAD_SAFE flag indicates whether the pool actually needs to be
+ * thread-safe and POOL must be also be thread-safe if this flag is set.
+ */
+svn_error_t *
+svn_repos__authz_pool_create(svn_repos__authz_pool_t **authz_pool,
+ svn_repos__config_pool_t *config_pool,
+ svn_boolean_t thread_safe,
+ apr_pool_t *pool);
+
+/* Set *AUTHZ_P to a read-only reference to the current contents of the
+ * authorization specified by PATH and GROUPS_PATH. If these are URLs,
+ * we read the data from a local repository (see #svn_repos_authz_read2).
+ * AUTHZ_POOL will store the authz data and make further callers use the
+ * same instance if the content matches.
+ *
+ * If MUST_EXIST is TRUE, a missing config file is also an error, *AUTHZ_P
+ * is otherwise simply NULL.
+ *
+ * PREFERRED_REPOS is only used if it is not NULL and PATH is a URL.
+ * If it matches the URL, access the repository through this object
+ * instead of creating a new repo instance. Note that this might not
+ * return the latest content.
+ *
+ * POOL determines the minimum lifetime of *AUTHZ_P (may remain cached
+ * after release) but must not exceed the lifetime of the pool provided to
+ * svn_repos__authz_pool_create.
+ */
+svn_error_t *
+svn_repos__authz_pool_get(svn_authz_t **authz_p,
+ svn_repos__authz_pool_t *authz_pool,
+ const char *path,
+ const char *groups_path,
+ svn_boolean_t must_exist,
+ svn_repos_t *preferred_repos,
+ apr_pool_t *pool);
+
+/** @} */
+
+/* Adjust mergeinfo paths and revisions in ways that are useful when loading
+ * a dump stream.
+ *
+ * Set *NEW_VALUE_P to an adjusted version of the mergeinfo property value
+ * supplied in OLD_VALUE, with the following adjustments.
+ *
+ * - Normalize line endings: if all CRLF, change to LF; but error if
+ * mixed. If this normalization is performed, send a notification type
+ * svn_repos_notify_load_normalized_mergeinfo to NOTIFY_FUNC/NOTIFY_BATON.
+ *
+ * - Prefix all the merge source paths with PARENT_DIR, if not null.
+ *
+ * - Adjust any mergeinfo revisions not older than OLDEST_DUMPSTREAM_REV
+ * by using REV_MAP which maps (svn_revnum_t) old rev to (svn_revnum_t)
+ * new rev.
+ *
+ * - Adjust any mergeinfo revisions older than OLDEST_DUMPSTREAM_REV by
+ * (-OLDER_REVS_OFFSET), dropping any revisions that become <= 0.
+ *
+ * Allocate *NEW_VALUE_P in RESULT_POOL.
+ */
+svn_error_t *
+svn_repos__adjust_mergeinfo_property(svn_string_t **new_value_p,
+ const svn_string_t *old_value,
+ const char *parent_dir,
+ apr_hash_t *rev_map,
+ svn_revnum_t oldest_dumpstream_rev,
+ apr_int32_t older_revs_offset,
+ svn_repos_notify_func_t notify_func,
+ void *notify_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* A (nearly) opaque representation of an ordered list of header lines.
+ */
+typedef struct apr_array_header_t svn_repos__dumpfile_headers_t;
+
+/* Create an empty set of headers.
+ */
+svn_repos__dumpfile_headers_t *
+svn_repos__dumpfile_headers_create(apr_pool_t *pool);
+
+/* Push the header (KEY, VAL) onto HEADERS.
+ *
+ * Duplicate the key and value into HEADERS's pool.
+ */
+void
+svn_repos__dumpfile_header_push(svn_repos__dumpfile_headers_t *headers,
+ const char *key,
+ const char *val);
+
+/* Push the header (KEY, val = VAL_FMT ...) onto HEADERS.
+ *
+ * Duplicate the key and value into HEADERS's pool.
+ */
+void
+svn_repos__dumpfile_header_pushf(svn_repos__dumpfile_headers_t *headers,
+ const char *key,
+ const char *val_fmt,
+ ...)
+ __attribute__((format(printf, 3, 4)));
+
+/* Write to STREAM the headers in HEADERS followed by a blank line.
+ */
+svn_error_t *
+svn_repos__dump_headers(svn_stream_t *stream,
+ svn_repos__dumpfile_headers_t *headers,
+ apr_pool_t *scratch_pool);
+
+/* Write a revision record to DUMP_STREAM for revision REVISION with revision
+ * properies REVPROPS, creating appropriate headers.
+ *
+ * Include all of the headers in EXTRA_HEADERS (if non-null), ignoring
+ * the revision number header and the three content length headers (which
+ * will be recreated as needed). EXTRA_HEADERS maps (char *) key to
+ * (char *) value.
+ *
+ * REVPROPS maps (char *) key to (svn_string_t *) value.
+ *
+ * Iff PROPS_SECTION_ALWAYS is true, include a prop content section (and
+ * corresponding header) even when REVPROPS is empty. This option exists
+ * to support a historical difference between svndumpfilter and svnadmin
+ * dump.
+ *
+ * Finally write another blank line.
+ */
+svn_error_t *
+svn_repos__dump_revision_record(svn_stream_t *dump_stream,
+ svn_revnum_t revision,
+ apr_hash_t *extra_headers,
+ apr_hash_t *revprops,
+ svn_boolean_t props_section_always,
+ apr_pool_t *scratch_pool);
+
+/* Output node headers and props.
+ *
+ * Output HEADERS, content length headers, blank line, and
+ * then PROPS_STR (if non-null) to DUMP_STREAM.
+ *
+ * HEADERS is an array of headers as struct {const char *key, *val;}.
+ * Write them all in the given order.
+ *
+ * PROPS_STR is the property content block, including a terminating
+ * 'PROPS_END\n' line. Iff PROPS_STR is non-null, write a
+ * Prop-content-length header and the prop content block.
+ *
+ * Iff HAS_TEXT is true, write a Text-content length, using the value
+ * TEXT_CONTENT_LENGTH.
+ *
+ * Write a Content-length header, its value being the sum of the
+ * Prop- and Text- content length headers, if props and/or text are present
+ * or if CONTENT_LENGTH_ALWAYS is true.
+ */
+svn_error_t *
+svn_repos__dump_node_record(svn_stream_t *dump_stream,
+ svn_repos__dumpfile_headers_t *headers,
+ svn_stringbuf_t *props_str,
+ svn_boolean_t has_text,
+ svn_filesize_t text_content_length,
+ svn_boolean_t content_length_always,
+ apr_pool_t *scratch_pool);
#ifdef __cplusplus
}
diff --git a/subversion/include/private/svn_sorts_private.h b/subversion/include/private/svn_sorts_private.h
new file mode 100644
index 000000000000..c358513e9233
--- /dev/null
+++ b/subversion/include/private/svn_sorts_private.h
@@ -0,0 +1,227 @@
+/**
+ * @copyright
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ * @endcopyright
+ *
+ * @file svn_sorts_private.h
+ * @brief all sorts of sorts.
+ */
+
+
+#ifndef SVN_SORTS_PRIVATE_H
+#define SVN_SORTS_PRIVATE_H
+
+#include "../svn_sorts.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+
+/** This structure is used to hold a key/value from a hash table.
+ * @note Private. For use by Subversion's own code only. See issue #1644.
+ */
+struct svn_sort__item_t {
+ /** pointer to the key */
+ const void *key;
+
+ /** size of the key */
+ apr_ssize_t klen;
+
+ /** pointer to the value */
+ void *value;
+};
+
+/** Sort @a ht according to its keys, return an @c apr_array_header_t
+ * containing @c svn_sort__item_t structures holding those keys and values
+ * (i.e. for each @c svn_sort__item_t @a item in the returned array,
+ * @a item->key and @a item->size are the hash key, and @a item->value points to
+ * the hash value).
+ *
+ * Storage is shared with the original hash, not copied.
+ *
+ * @a comparison_func should take two @c svn_sort__item_t's and return an
+ * integer greater than, equal to, or less than 0, according as the first item
+ * is greater than, equal to, or less than the second.
+ *
+ * @note Private. For use by Subversion's own code only. See issue #1644.
+ *
+ * @note This function and the @c svn_sort__item_t should go over to APR.
+ */
+apr_array_header_t *
+svn_sort__hash(apr_hash_t *ht,
+ int (*comparison_func)(const svn_sort__item_t *,
+ const svn_sort__item_t *),
+ apr_pool_t *pool);
+
+/* Sort APR array @a array using ordering defined by @a comparison_func.
+ * @a comparison_func is defined as for the C stdlib function qsort().
+ */
+void
+svn_sort__array(apr_array_header_t *array,
+ int (*comparison_func)(const void *,
+ const void *));
+
+/* Return the lowest index at which the element @a *key should be inserted into
+ * the array @a array, according to the ordering defined by @a compare_func.
+ * The array must already be sorted in the ordering defined by @a compare_func.
+ * @a compare_func is defined as for the C stdlib function bsearch(); the
+ * @a key will always passed to it as the second parameter.
+ *
+ * @note Private. For use by Subversion's own code only.
+ */
+int
+svn_sort__bsearch_lower_bound(const apr_array_header_t *array,
+ const void *key,
+ int (*compare_func)(const void *, const void *));
+
+/* Find the lowest index at which the element @a *key should be inserted into
+ * the array @a array, according to the ordering defined by @a compare_func.
+ * The array must already be sorted in the ordering defined by @a compare_func.
+ * @a compare_func is defined as for the C stdlib function bsearch(); the
+ * @a key will always passed to it as the second parameter.
+ *
+ * Returns a reference to the array element at the insertion location if
+ * that matches @a key and return NULL otherwise. If you call this function
+ * multiple times for the same array and expect the results to often be
+ * consecutive array elements, provide @a hint. It should be initialized
+ * with -1 for the first call and receives the array index if the returned
+ * element. If the return value is NULL, @a *hint is the location where
+ * the respective key would be inserted.
+ *
+ * @note Private. For use by Subversion's own code only.
+ */
+void *
+svn_sort__array_lookup(const apr_array_header_t *array,
+ const void *key,
+ int *hint,
+ int (*compare_func)(const void *, const void *));
+
+
+/* Insert a shallow copy of @a *new_element into the array @a array at the index
+ * @a insert_index, growing the array and shuffling existing elements along to
+ * make room.
+ *
+ * @note Private. For use by Subversion's own code only.
+ */
+void
+svn_sort__array_insert(apr_array_header_t *array,
+ const void *new_element,
+ int insert_index);
+
+
+/* Remove @a elements_to_delete elements starting at @a delete_index from the
+ * array @a arr. If @a delete_index is not a valid element of @a arr,
+ * @a elements_to_delete is not greater than zero, or
+ * @a delete_index + @a elements_to_delete is greater than @a arr->nelts,
+ * then do nothing.
+ *
+ * @note Private. For use by Subversion's own code only.
+ */
+void
+svn_sort__array_delete(apr_array_header_t *arr,
+ int delete_index,
+ int elements_to_delete);
+
+/* Reverse the order of elements in @a array, in place.
+ *
+ * @note Private. For use by Subversion's own code only.
+ */
+void
+svn_sort__array_reverse(apr_array_header_t *array,
+ apr_pool_t *scratch_pool);
+
+/** Priority queues.
+ *
+ * @defgroup svn_priority_queue__t Priority Queues
+ * @{
+ */
+
+/**
+ * We implement priority queues on top of existing ELEMENTS arrays. They
+ * provide us with memory management and very basic element type information.
+ *
+ * The extraction order is being defined by a comparison function similar
+ * to the ones used with qsort. The first element in the queue is always
+ * on with COMPARISON_FUNC(first,element) <= 0, for all elements in the
+ * queue.
+ */
+
+/**
+ * Opaque data type for priority queues.
+ */
+typedef struct svn_priority_queue__t svn_priority_queue__t;
+
+/**
+ * Return a priority queue containing all provided @a elements and prioritize
+ * them according to @a compare_func.
+ *
+ * @note The priority queue will use the existing @a elements array for data
+ * storage. So, you must not manipulate that array while using the queue.
+ * Also, the lifetime of the queue is bound to that of the array.
+ */
+svn_priority_queue__t *
+svn_priority_queue__create(apr_array_header_t *elements,
+ int (*compare_func)(const void *, const void *));
+
+/**
+ * Returns the number of elements in the @a queue.
+ */
+apr_size_t
+svn_priority_queue__size(svn_priority_queue__t *queue);
+
+/**
+ * Returns a reference to the first element in the @a queue. The queue
+ * contents remains unchanged. If the @a queue is empty, #NULL will be
+ * returned.
+ */
+void *
+svn_priority_queue__peek(svn_priority_queue__t *queue);
+
+/**
+ * Notify the @a queue after modifying the first item as returned by
+ * #svn_priority_queue__peek.
+ */
+void
+svn_priority_queue__update(svn_priority_queue__t *queue);
+
+/**
+ * Remove the first element from the @a queue. This is a no-op for empty
+ * queues.
+ */
+void
+svn_priority_queue__pop(svn_priority_queue__t *queue);
+
+/**
+ * Append the new @a element to the @a queue. @a element must neither be
+ * #NULL nor the first element as returned by #svn_priority_queue__peek.
+ */
+void
+svn_priority_queue__push(svn_priority_queue__t *queue, const void *element);
+
+/** @} */
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* SVN_SORTS_PRIVATE_H */
diff --git a/subversion/include/private/svn_sqlite.h b/subversion/include/private/svn_sqlite.h
index 4c03e19a8cda..6faa5b384f6b 100644
--- a/subversion/include/private/svn_sqlite.h
+++ b/subversion/include/private/svn_sqlite.h
@@ -63,7 +63,7 @@ typedef enum svn_sqlite__mode_e {
typedef svn_error_t *(*svn_sqlite__func_t)(svn_sqlite__context_t *sctx,
int argc,
svn_sqlite__value_t *values[],
- apr_pool_t *scatch_pool);
+ void *baton);
/* Step the given statement; if it returns SQLITE_DONE, reset the statement.
@@ -117,12 +117,16 @@ svn_sqlite__read_schema_version(int *version,
STATEMENTS itself may be NULL, in which case it has no impact.
See svn_sqlite__get_statement() for how these strings are used.
+ TIMEOUT defines the SQLite busy timeout, values <= 0 cause a Subversion
+ default to be used.
+
The statements will be finalized and the SQLite database will be closed
when RESULT_POOL is cleaned up. */
svn_error_t *
-svn_sqlite__open(svn_sqlite__db_t **db, const char *repos_path,
+svn_sqlite__open(svn_sqlite__db_t **db, const char *path,
svn_sqlite__mode_t mode, const char * const statements[],
int latest_schema, const char * const *upgrade_sql,
+ apr_int32_t timeout,
apr_pool_t *result_pool, apr_pool_t *scratch_pool);
/* Explicitly close the connection in DB. */
@@ -130,11 +134,16 @@ svn_error_t *
svn_sqlite__close(svn_sqlite__db_t *db);
/* Add a custom function to be used with this database connection. The data
- in BATON should live at least as long as the connection in DB. */
+ in BATON should live at least as long as the connection in DB.
+
+ Pass TRUE if the result of the function is constant within a statement with
+ a specific set of argument values and FALSE if not (or when in doubt). When
+ TRUE newer Sqlite versions use this knowledge for query optimizations. */
svn_error_t *
svn_sqlite__create_scalar_function(svn_sqlite__db_t *db,
const char *func_name,
int argc,
+ svn_boolean_t deterministic,
svn_sqlite__func_t func,
void *baton);
@@ -345,6 +354,11 @@ svn_sqlite__column_is_null(svn_sqlite__stmt_t *stmt, int column);
int
svn_sqlite__column_bytes(svn_sqlite__stmt_t *stmt, int column);
+/* When Subversion is compiled in maintainer mode: enables the sqlite error
+ logging to SVN_DBG_OUTPUT. */
+void
+svn_sqlite__dbg_enable_errorlog(void);
+
/* --------------------------------------------------------------------- */
@@ -372,6 +386,9 @@ svn_sqlite__result_null(svn_sqlite__context_t *sctx);
void
svn_sqlite__result_int64(svn_sqlite__context_t *sctx, apr_int64_t val);
+void
+svn_sqlite__result_error(svn_sqlite__context_t *sctx, const char *msg, int num);
+
/* --------------------------------------------------------------------- */
@@ -522,7 +539,7 @@ svn_sqlite__with_immediate_transaction(svn_sqlite__db_t *db,
SCRATCH_POOL will be passed to the callback (NULL is valid).
### Since we now require SQLite >= 3.6.18, this function has the effect of
- always behaving like a defered transaction. Can it be combined with
+ always behaving like a deferred transaction. Can it be combined with
svn_sqlite__with_transaction()?
*/
svn_error_t *
diff --git a/subversion/include/private/svn_string_private.h b/subversion/include/private/svn_string_private.h
index 8579f4d3398f..2f162733db81 100644
--- a/subversion/include/private/svn_string_private.h
+++ b/subversion/include/private/svn_string_private.h
@@ -131,10 +131,13 @@ svn_membuf__nzero(svn_membuf_t *membuf, apr_size_t size);
svn_string_t *
svn_stringbuf__morph_into_string(svn_stringbuf_t *strbuf);
-/** Like apr_strtoff but provided here for backward compatibility
- * with APR 0.9 */
-apr_status_t
-svn__strtoff(apr_off_t *offset, const char *buf, char **end, int base);
+/** Like strtoul but with a fixed base of 10 and without overflow checks.
+ * This allows the compiler to generate massively faster (4x on 64bit LINUX)
+ * code. Overflow checks may be added on the caller side where you might
+ * want to test for a more specific value range anyway.
+ */
+unsigned long
+svn__strtoul(const char *buffer, const char **end);
/** Number of chars needed to represent signed (19 places + sign + NUL) or
* unsigned (20 places + NUL) integers as strings.
@@ -156,22 +159,55 @@ apr_size_t
svn__i64toa(char * dest, apr_int64_t number);
/** Returns a decimal string for @a number allocated in @a pool. Put in
- * the @a seperator at each third place.
+ * the @a separator at each third place.
*/
char *
-svn__ui64toa_sep(apr_uint64_t number, char seperator, apr_pool_t *pool);
+svn__ui64toa_sep(apr_uint64_t number, char separator, apr_pool_t *pool);
/** Returns a decimal string for @a number allocated in @a pool. Put in
- * the @a seperator at each third place.
+ * the @a separator at each third place.
*/
char *
-svn__i64toa_sep(apr_int64_t number, char seperator, apr_pool_t *pool);
+svn__i64toa_sep(apr_int64_t number, char separator, apr_pool_t *pool);
+
+
+/** Writes the @a number as base36-encoded string into @a dest. The latter
+ * must provide space for at least #SVN_INT64_BUFFER_SIZE characters.
+ * Returns the number chars written excluding the terminating NUL.
+ *
+ * @note The actual maximum buffer requirement is much shorter than
+ * #SVN_INT64_BUFFER_SIZE but introducing yet another constant is only
+ * marginally useful and may open the door to security issues when e.g.
+ * switching between base10 and base36 encoding.
+ */
+apr_size_t
+svn__ui64tobase36(char *dest, apr_uint64_t number);
+
+/** Returns the value of the base36 encoded unsigned integer starting at
+ * @a source. If @a next is not NULL, @a *next will be set to the first
+ * position after the integer.
+ *
+ * The data in @a source will be considered part of the number to parse
+ * as long as the characters are within the base36 range. If there are
+ * no such characters to begin with, 0 is returned. Inputs with more than
+ * #SVN_INT64_BUFFER_SIZE digits will not be fully parsed, i.e. the value
+ * of @a *next as well as the return value are undefined.
+ */
+apr_uint64_t
+svn__base36toui64(const char **next, const char *source);
+
+/**
+ * The upper limit of the similarity range returned by
+ * svn_cstring__similarity() and svn_string__similarity().
+ */
+#define SVN_STRING__SIM_RANGE_MAX 1000000
/**
* Computes the similarity score of STRA and STRB. Returns the ratio
* of the length of their longest common subsequence and the average
- * length of the strings, normalized to the range [0..1000].
- * The result is equivalent to Python's
+ * length of the strings, normalized to the range
+ * [0..SVN_STRING__SIM_RANGE_MAX]. The result is equivalent to
+ * Python's
*
* difflib.SequenceMatcher.ratio
*
@@ -196,7 +232,7 @@ svn__i64toa_sep(apr_int64_t number, char seperator, apr_pool_t *pool);
* has O(strlen(STRA) * strlen(STRB)) worst-case performance,
* so do keep a rein on your enthusiasm.
*/
-unsigned int
+apr_size_t
svn_cstring__similarity(const char *stra, const char *strb,
svn_membuf_t *buffer, apr_size_t *rlcs);
@@ -204,12 +240,82 @@ svn_cstring__similarity(const char *stra, const char *strb,
* Like svn_cstring__similarity, but accepts svn_string_t's instead
* of NUL-terminated character strings.
*/
-unsigned int
+apr_size_t
svn_string__similarity(const svn_string_t *stringa,
const svn_string_t *stringb,
svn_membuf_t *buffer, apr_size_t *rlcs);
+/* Return the lowest position at which A and B differ. If no difference
+ * can be found in the first MAX_LEN characters, MAX_LEN will be returned.
+ */
+apr_size_t
+svn_cstring__match_length(const char *a,
+ const char *b,
+ apr_size_t max_len);
+
+/* Return the number of bytes before A and B that don't differ. If no
+ * difference can be found in the first MAX_LEN characters, MAX_LEN will
+ * be returned. Please note that A-MAX_LEN and B-MAX_LEN must both be
+ * valid addresses.
+ */
+apr_size_t
+svn_cstring__reverse_match_length(const char *a,
+ const char *b,
+ apr_size_t max_len);
+
+/** @} */
+
+/** Prefix trees.
+ *
+ * Prefix trees allow for a space-efficient representation of a set of path-
+ * like strings, i.e. those that share common prefixes. Any given string
+ * value will be stored only once, i.e. two strings stored in the same tree
+ * are equal if and only if the point to the same #svn_prefix_string__t.
+ *
+ * @defgroup svn_prefix_string Strings in prefix trees.
+* @{
+ */
+
+/**
+ * Opaque data type for prefix-tree-based strings.
+ */
+typedef struct svn_prefix_string__t svn_prefix_string__t;
+
+/**
+ * Opaque data type representing a prefix tree
+ */
+typedef struct svn_prefix_tree__t svn_prefix_tree__t;
+
+/**
+ * Return a new prefix tree allocated in @a pool.
+ */
+svn_prefix_tree__t *
+svn_prefix_tree__create(apr_pool_t *pool);
+
+/**
+ * Return a string with the value @a s stored in @a tree. If no such string
+ * exists yet, add it automatically.
+ */
+svn_prefix_string__t *
+svn_prefix_string__create(svn_prefix_tree__t *tree,
+ const char *s);
+
+/**
+ * Return the contents of @a s as a new string object allocated in @a pool.
+ */
+svn_string_t *
+svn_prefix_string__expand(const svn_prefix_string__t *s,
+ apr_pool_t *pool);
+
+/**
+ * Compare the two strings @a lhs and @a rhs that must be part of the same
+ * tree.
+ */
+int
+svn_prefix_string__compare(const svn_prefix_string__t *lhs,
+ const svn_prefix_string__t *rhs);
+
/** @} */
/** @} */
diff --git a/subversion/include/private/svn_subr_private.h b/subversion/include/private/svn_subr_private.h
index 30fbbf264c96..095d71c5df2c 100644
--- a/subversion/include/private/svn_subr_private.h
+++ b/subversion/include/private/svn_subr_private.h
@@ -26,7 +26,7 @@
#include "svn_types.h"
#include "svn_io.h"
-#include "svn_version.h"
+#include "svn_config.h"
#ifdef __cplusplus
@@ -95,11 +95,32 @@ svn_spillbuf__create(apr_size_t blocksize,
apr_size_t maxsize,
apr_pool_t *result_pool);
+/* Create a spill buffer, with extra parameters. */
+svn_spillbuf_t *
+svn_spillbuf__create_extended(apr_size_t blocksize,
+ apr_size_t maxsize,
+ svn_boolean_t delete_on_close,
+ svn_boolean_t spill_all_contents,
+ const char* dirpath,
+ apr_pool_t *result_pool);
/* Determine how much content is stored in the spill buffer. */
svn_filesize_t
svn_spillbuf__get_size(const svn_spillbuf_t *buf);
+/* Determine how much content the spill buffer is caching in memory. */
+svn_filesize_t
+svn_spillbuf__get_memory_size(const svn_spillbuf_t *buf);
+
+/* Retrieve the name of the spill file. The returned value can be NULL
+ if the file has not been created yet. */
+const char *
+svn_spillbuf__get_filename(const svn_spillbuf_t *buf);
+
+/* Retrieve the handle of the spill file. The returned value can be
+ NULL if the file has not been created yet. */
+apr_file_t *
+svn_spillbuf__get_file(const svn_spillbuf_t *buf);
/* Write some data into the spill buffer. */
svn_error_t *
@@ -153,13 +174,13 @@ svn_spillbuf__process(svn_boolean_t *exhausted,
typedef struct svn_spillbuf_reader_t svn_spillbuf_reader_t;
-/* Create a spill-buffer and a reader for it. */
+/* Create a spill-buffer and a reader for it, using the same arguments as
+ svn_spillbuf__create(). */
svn_spillbuf_reader_t *
svn_spillbuf__reader_create(apr_size_t blocksize,
apr_size_t maxsize,
apr_pool_t *result_pool);
-
/* Read @a len bytes from @a reader into @a data. The number of bytes
actually read is stored in @a amt. If the content is exhausted, then
@a amt is set to zero. It will always be non-zero if the spill-buffer
@@ -191,17 +212,23 @@ svn_spillbuf__reader_write(svn_spillbuf_reader_t *reader,
apr_pool_t *scratch_pool);
-/* Return a stream built on top of a spillbuf, using the same arguments as
- svn_spillbuf__create(). This stream can be used for reading and writing,
- but implements the same basic sematics of a spillbuf for the underlying
- storage. */
+/* Return a stream built on top of a spillbuf.
+
+ This stream can be used for reading and writing, but implements the
+ same basic semantics of a spillbuf for the underlying storage. */
svn_stream_t *
-svn_stream__from_spillbuf(apr_size_t blocksize,
- apr_size_t maxsize,
+svn_stream__from_spillbuf(svn_spillbuf_t *buf,
apr_pool_t *result_pool);
/** @} */
+/*----------------------------------------------------*/
+
+/**
+ * @defgroup svn_checksum_private Checksumming helper APIs
+ * @{
+ */
+
/**
* Internal function for creating a MD5 checksum from a binary digest.
*
@@ -221,6 +248,76 @@ svn_checksum_t *
svn_checksum__from_digest_sha1(const unsigned char *digest,
apr_pool_t *result_pool);
+/**
+ * Internal function for creating a 32 bit FNV-1a checksum from a binary
+ * digest.
+ *
+ * @since New in 1.9
+ */
+svn_checksum_t *
+svn_checksum__from_digest_fnv1a_32(const unsigned char *digest,
+ apr_pool_t *result_pool);
+
+/**
+ * Internal function for creating a modified 32 bit FNV-1a checksum from
+ * a binary digest.
+ *
+ * @since New in 1.9
+ */
+svn_checksum_t *
+svn_checksum__from_digest_fnv1a_32x4(const unsigned char *digest,
+ apr_pool_t *result_pool);
+
+
+/**
+ * Return a stream that calculates a checksum of type @a kind over all
+ * data written to the @a inner_stream. When the returned stream gets
+ * closed, write the checksum to @a *checksum.
+ * Allocate the result in @a pool.
+ *
+ * @note The stream returned only supports #svn_stream_write and
+ * #svn_stream_close.
+ */
+svn_stream_t *
+svn_checksum__wrap_write_stream(svn_checksum_t **checksum,
+ svn_stream_t *inner_stream,
+ svn_checksum_kind_t kind,
+ apr_pool_t *pool);
+
+/**
+ * Return a stream that calculates a 32 bit modified FNV-1a checksum
+ * over all data written to the @a inner_stream and writes the digest
+ * to @a *digest when the returned stream gets closed.
+ * Allocate the stream in @a pool.
+ */
+svn_stream_t *
+svn_checksum__wrap_write_stream_fnv1a_32x4(apr_uint32_t *digest,
+ svn_stream_t *inner_stream,
+ apr_pool_t *pool);
+
+/**
+ * Return a 32 bit FNV-1a checksum for the first @a len bytes in @a input.
+ *
+ * @since New in 1.9
+ */
+apr_uint32_t
+svn__fnv1a_32(const void *input, apr_size_t len);
+
+/**
+ * Return a 32 bit modified FNV-1a checksum for the first @a len bytes in
+ * @a input.
+ *
+ * @note This is a proprietary checksumming algorithm based FNV-1a with
+ * approximately the same strength. It is up to 4 times faster
+ * than plain FNV-1a for longer data blocks.
+ *
+ * @since New in 1.9
+ */
+apr_uint32_t
+svn__fnv1a_32x4(const void *input, apr_size_t len);
+
+/** @} */
+
/**
* @defgroup svn_hash_support Hash table serialization support
@@ -285,6 +382,54 @@ svn_hash__make(apr_pool_t *pool);
/** @} */
+/**
+ * @defgroup svn_hash_read Reading serialized hash tables
+ * @{
+ */
+
+/** Struct that represents a key value pair read from a serialized hash
+ * representation. There are special cases that can also be represented:
+ * a #NULL @a key signifies the end of the hash, a #NULL @a val for non-
+ * NULL keys is only possible in incremental mode describes a deletion.
+ *
+ * @since New in 1.9.
+ */
+typedef struct svn_hash__entry_t
+{
+ /** 0-terminated Key. #NULL if this contains no data at all because we
+ * encountered the end of the hash. */
+ char *key;
+
+ /** Length of @a key. Must be 0 if @a key is #NULL. */
+ apr_size_t keylen;
+
+ /** 0-terminated value stored with the key. If this is #NULL for a
+ * non-NULL @a key, then this means that the key shall be removed from
+ * the hash (only used in incremental mode). Must be #NULL if @a key is
+ * #NULL. */
+ char *val;
+
+ /** Length of @a val. Must be 0 if @a val is #NULL. */
+ apr_size_t vallen;
+} svn_hash__entry_t;
+
+/** Reads a single key-value pair from @a stream and returns it in the
+ * caller-provided @a *entry (members don't need to be pre-initialized).
+ * @a pool is used to allocate members of @a *entry and for tempoaries.
+ *
+ * @see #svn_hash_read2 for more details.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_hash__read_entry(svn_hash__entry_t *entry,
+ svn_stream_t *stream,
+ const char *terminator,
+ svn_boolean_t incremental,
+ apr_pool_t *pool);
+
+/** @} */
+
/** @} */
@@ -332,20 +477,230 @@ svn_version__at_least(svn_version_t *version,
int minor,
int patch);
-/** Like svn_ver_check_list(), but with a @a comparator parameter.
- * Private backport of svn_ver_check_list2() from trunk.
+/** @} */
+
+/**
+ * @defgroup svn_compress Data (de-)compression API
+ * @{
+ */
+
+/* This is at least as big as the largest size of an integer that
+ svn__encode_uint() can generate; it is sufficient for creating buffers
+ for it to write into. This assumes that integers are at most 64 bits,
+ and so 10 bytes (with 7 bits of information each) are sufficient to
+ represent them. */
+#define SVN__MAX_ENCODED_UINT_LEN 10
+
+/* Compression method parameters for svn__encode_uint. */
+
+/* No compression (but a length prefix will still be added to the buffer) */
+#define SVN__COMPRESSION_NONE 0
+
+/* Fastest, least effective compression method & level provided by zlib. */
+#define SVN__COMPRESSION_ZLIB_MIN 1
+
+/* Default compression method & level provided by zlib. */
+#define SVN__COMPRESSION_ZLIB_DEFAULT 5
+
+/* Slowest, best compression method & level provided by zlib. */
+#define SVN__COMPRESSION_ZLIB_MAX 9
+
+/* Encode VAL into the buffer P using the variable-length 7b/8b unsigned
+ integer format. Return the incremented value of P after the
+ encoded bytes have been written. P must point to a buffer of size
+ at least SVN__MAX_ENCODED_UINT_LEN.
+
+ This encoding uses the high bit of each byte as a continuation bit
+ and the other seven bits as data bits. High-order data bits are
+ encoded first, followed by lower-order bits, so the value can be
+ reconstructed by concatenating the data bits from left to right and
+ interpreting the result as a binary number. Examples (brackets
+ denote byte boundaries, spaces are for clarity only):
+
+ 1 encodes as [0 0000001]
+ 33 encodes as [0 0100001]
+ 129 encodes as [1 0000001] [0 0000001]
+ 2000 encodes as [1 0001111] [0 1010000]
+*/
+unsigned char *
+svn__encode_uint(unsigned char *p, apr_uint64_t val);
+
+/* Decode an unsigned 7b/8b-encoded integer into *VAL and return a pointer
+ to the byte after the integer. The bytes to be decoded live in the
+ range [P..END-1]. If these bytes do not contain a whole encoded
+ integer, return NULL; in this case *VAL is undefined.
+
+ See the comment for svn__encode_uint() earlier in this file for more
+ detail on the encoding format. */
+const unsigned char *
+svn__decode_uint(apr_uint64_t *val,
+ const unsigned char *p,
+ const unsigned char *end);
+
+/* Get the data from IN, compress it according to the specified
+ * COMPRESSION_METHOD and write the result to OUT.
+ * SVN__COMPRESSION_NONE is valid for COMPRESSION_METHOD.
+ */
+svn_error_t *
+svn__compress(svn_stringbuf_t *in,
+ svn_stringbuf_t *out,
+ int compression_method);
+
+/* Get the compressed data from IN, decompress it and write the result to
+ * OUT. Return an error if the decompressed size is larger than LIMIT.
+ */
+svn_error_t *
+svn__decompress(svn_stringbuf_t *in,
+ svn_stringbuf_t *out,
+ apr_size_t limit);
+
+/** @} */
+
+/**
+ * @defgroup svn_root_pools Recycle-able root pools API
+ * @{
+ */
+
+/* Opaque thread-safe container for unused / recylcleable root pools.
+ *
+ * Recyling root pools (actually, their allocators) circumvents a
+ * scalability bottleneck in the OS memory management when multi-threaded
+ * applications frequently create and destroy allocators.
+ */
+typedef struct svn_root_pools__t svn_root_pools__t;
+
+/* Create a new root pools container and return it in *POOLS.
*/
svn_error_t *
-svn_ver__check_list2(const svn_version_t *my_version,
- const svn_version_checklist_t *checklist,
- svn_boolean_t (*comparator)(const svn_version_t *,
- const svn_version_t *));
+svn_root_pools__create(svn_root_pools__t **pools);
+
+/* Return a currently unused pool from POOLS. If POOLS is empty, create a
+ * new root pool and return that. The pool returned is not thread-safe.
+ */
+apr_pool_t *
+svn_root_pools__acquire_pool(svn_root_pools__t *pools);
-/** To minimize merge churn in callers, alias the trunk name privately. */
-#define svn_ver_check_list2 svn_ver__check_list2
+/* Clear and release the given root POOL and put it back into POOLS.
+ * If that fails, destroy POOL.
+ */
+void
+svn_root_pools__release_pool(apr_pool_t *pool,
+ svn_root_pools__t *pools);
/** @} */
+/**
+ * @defgroup svn_config_private Private configuration handling API
+ * @{
+ */
+
+/* Future attempts to modify CFG will trigger an assertion. */
+void
+svn_config__set_read_only(svn_config_t *cfg,
+ apr_pool_t *scratch_pool);
+
+/* Return TRUE, if CFG cannot be modified. */
+svn_boolean_t
+svn_config__is_read_only(svn_config_t *cfg);
+
+/* Return TRUE, if OPTION in SECTION in CFG exists and does not require
+ * further expansion (due to either containing no placeholders or already
+ * having been expanded). */
+svn_boolean_t
+svn_config__is_expanded(svn_config_t *cfg,
+ const char *section,
+ const char *option);
+
+/* Return a shallow copy of SCR in POOL. If SRC is read-only, different
+ * shallow copies may be used from different threads.
+ *
+ * Any single r/o svn_config_t or shallow copy is not thread-safe because
+ * it contains shared buffers for tempoary data.
+ */
+svn_config_t *
+svn_config__shallow_copy(svn_config_t *src,
+ apr_pool_t *pool);
+
+/* Add / replace SECTION in TARGET with the same section from SOURCE by
+ * simply adding a reference to it. If TARGET is read-only, the sections
+ * list in target gets duplicated before the modification.
+ *
+ * This is an API tailored for use by the svn_repos__authz_pool_t API to
+ * prevent breach of encapsulation.
+ */
+void
+svn_config__shallow_replace_section(svn_config_t *target,
+ svn_config_t *source,
+ const char *section);
+
+/* Allocate *CFG_HASH and populate it with default, empty,
+ * svn_config_t for the configuration categories (@c
+ * SVN_CONFIG_CATEGORY_SERVERS, @c SVN_CONFIG_CATEGORY_CONFIG, etc.).
+ * This returns a hash equivalent to svn_config_get_config when the
+ * config files are empty.
+ */
+svn_error_t *
+svn_config__get_default_config(apr_hash_t **cfg_hash,
+ apr_pool_t *pool);
+
+/** @} */
+
+
+/**
+ * @defgroup svn_bit_array Packed bit array handling API
+ * @{
+ */
+
+/* This opaque data struct is an alternative to an INT->VOID hash.
+ *
+ * Technically, it is an automatically growing packed bit array.
+ * All indexes not previously set are implicitly 0 and setting it will
+ * grow the array as needed.
+ */
+typedef struct svn_bit_array__t svn_bit_array__t;
+
+/* Return a new bit array allocated in POOL. MAX is a mere hint for
+ * the initial size of the array in bits.
+ */
+svn_bit_array__t *
+svn_bit_array__create(apr_size_t max,
+ apr_pool_t *pool);
+
+/* Set bit at index IDX in ARRAY to VALUE. If necessary, grow the
+ * underlying data buffer, i.e. any IDX is valid unless we run OOM.
+ */
+void
+svn_bit_array__set(svn_bit_array__t *array,
+ apr_size_t idx,
+ svn_boolean_t value);
+
+/* Get the bit value at index IDX in ARRAY. Bits not previously accessed
+ * are implicitly 0 (or FALSE). That implies IDX can never be out-of-range.
+ */
+svn_boolean_t
+svn_bit_array__get(svn_bit_array__t *array,
+ apr_size_t idx);
+
+/* Return the global pool used by the DSO loader, this may be NULL if
+ no DSOs have been loaded. */
+apr_pool_t *
+svn_dso__pool(void);
+
+/** @} */
+
+
+/* Return the xml (expat) version we compiled against. */
+const char *svn_xml__compiled_version(void);
+
+/* Return the xml (expat) version we run against. */
+const char *svn_xml__runtime_version(void);
+
+/* Return the zlib version we compiled against. */
+const char *svn_zlib__compiled_version(void);
+
+/* Return the zlib version we run against. */
+const char *svn_zlib__runtime_version(void);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/subversion/include/private/svn_temp_serializer.h b/subversion/include/private/svn_temp_serializer.h
index 7a007c38fbb3..dd2e0478e21c 100644
--- a/subversion/include/private/svn_temp_serializer.h
+++ b/subversion/include/private/svn_temp_serializer.h
@@ -143,6 +143,22 @@ void
svn_temp_serializer__pop(svn_temp_serializer__context_t *context);
/**
+ * Serialize a referenced sub-structure within the serialization
+ * @a context. @a source_struct must be a reference to the
+ * pointer in the original parent structure so that the correspondence in
+ * the serialized structure can be established. @a struct_size must match
+ * the result of @c sizeof() of the actual structure.
+ *
+ * This function is equivalent but more efficient than calling
+ * #svn_temp_serializer__push() immediately followed by
+ * #svn_temp_serializer__pop().
+ */
+void
+svn_temp_serializer__add_leaf(svn_temp_serializer__context_t *context,
+ const void * const * source_struct,
+ apr_size_t struct_size);
+
+/**
* Serialize a string referenced from the current structure within the
* serialization @a context. @a s must be a reference to the @c char*
* pointer in the original structure so that the correspondence in the
diff --git a/subversion/include/private/svn_utf_private.h b/subversion/include/private/svn_utf_private.h
index 9f5a4ad41ea2..4584944fb47c 100644
--- a/subversion/include/private/svn_utf_private.h
+++ b/subversion/include/private/svn_utf_private.h
@@ -21,7 +21,7 @@
* @endcopyright
*
* @file svn_utf_private.h
- * @brief UTF validation routines
+ * @brief UTF validation and normalization routines
*/
#ifndef SVN_UTF_PRIVATE_H
@@ -31,6 +31,8 @@
#include <apr_pools.h>
#include "svn_types.h"
+#include "svn_string.h"
+#include "svn_string_private.h"
#ifdef __cplusplus
extern "C" {
@@ -71,6 +73,18 @@ svn_utf__last_valid(const char *src, apr_size_t len);
const char *
svn_utf__last_valid2(const char *src, apr_size_t len);
+/* Copy LENGTH bytes of SRC, converting characters as follows:
+ - Pass characters from the ASCII subset to the result
+ - Strip all combining marks from the string
+ - Represent other valid Unicode chars as {U+XXXX}
+ - Replace invalid Unicode chars with {U?XXXX}
+ - Represent chars that are not valid UTF-8 as ?\XX
+ - Replace codes outside the Unicode range with a sequence of ?\XX
+ - Represent the null byte as \0
+ Allocate the result in POOL. */
+const char *
+svn_utf__fuzzy_escape(const char *src, apr_size_t length, apr_pool_t *pool);
+
const char *
svn_utf__cstring_from_utf8_fuzzy(const char *src,
apr_pool_t *pool,
@@ -80,6 +94,166 @@ svn_utf__cstring_from_utf8_fuzzy(const char *src,
apr_pool_t *));
+#if defined(WIN32)
+/* On Windows: Convert the UTF-8 string SRC to UTF-16.
+ If PREFIX is not NULL, prepend it to the converted result.
+ The result, if not empty, will be allocated in RESULT_POOL. */
+svn_error_t *
+svn_utf__win32_utf8_to_utf16(const WCHAR **result,
+ const char *src,
+ const WCHAR *prefix,
+ apr_pool_t *result_pool);
+
+/* On Windows: Convert the UTF-16 string SRC to UTF-8.
+ If PREFIX is not NULL, prepend it to the converted result.
+ The result, if not empty, will be allocated in RESULT_POOL. */
+svn_error_t *
+svn_utf__win32_utf16_to_utf8(const char **result,
+ const WCHAR *src,
+ const char *prefix,
+ apr_pool_t *result_pool);
+#endif /* WIN32*/
+
+
+/* A constant used for many length parameters in the utf8proc wrappers
+ * to indicate that the length of a string is unknonw. */
+#define SVN_UTF__UNKNOWN_LENGTH ((apr_size_t) -1)
+
+
+/* Compare two UTF-8 strings, ignoring normalization, using buffers
+ * BUF1 and BUF2 for temporary storage. If either of LEN1 or LEN2 is
+ * SVN_UTF__UNKNOWN_LENGTH, assume the associated string is
+ * null-terminated; otherwise, consider the string only up to the
+ * given length.
+ *
+ * Return compare value in *RESULT.
+ */
+svn_error_t *
+svn_utf__normcmp(int *result,
+ const char *str1, apr_size_t len1,
+ const char *str2, apr_size_t len2,
+ svn_membuf_t *buf1, svn_membuf_t *buf2);
+
+/* Normalize the UTF-8 string STR to form C, using BUF for temporary
+ * storage. If LEN is SVN_UTF__UNKNOWN_LENGTH, assume STR is
+ * null-terminated; otherwise, consider the string only up to the
+ * given length.
+ *
+ * Return the normalized string in *RESULT, which shares storage with
+ * BUF and is valid only until the next time BUF is modified.
+ *
+ * A returned error may indicate that STRING contains invalid UTF-8 or
+ * invalid Unicode codepoints.
+ */
+svn_error_t*
+svn_utf__normalize(const char **result,
+ const char *str, apr_size_t len,
+ svn_membuf_t *buf);
+
+/* Check if STRING is a valid, NFC-normalized UTF-8 string. Note that
+ * a FALSE return value may indicate that STRING is not valid UTF-8 at
+ * all.
+ *
+ * Use SCRATCH_POOL for temporary allocations.
+ */
+svn_boolean_t
+svn_utf__is_normalized(const char *string, apr_pool_t *scratch_pool);
+
+/* Encode an UCS-4 string to UTF-8, placing the result into BUFFER.
+ * While utf8proc does have a similar function, it does more checking
+ * and processing than we want here; this function does not attempt
+ * any normalizations but just encodes the individual code points.
+ * The encoded string will always be NUL-terminated.
+ *
+ * Return the length of the result (excluding the NUL terminator) in
+ * *result_length.
+ *
+ * A returned error indicates that a codepoint is invalid.
+ */
+svn_error_t *
+svn_utf__encode_ucs4_string(svn_membuf_t *buffer,
+ const apr_int32_t *ucs4str,
+ apr_size_t length,
+ apr_size_t *result_length);
+
+/* Pattern matching similar to the the SQLite LIKE and GLOB
+ * operators. PATTERN, KEY and ESCAPE must all point to UTF-8
+ * strings. Furthermore, ESCAPE, if provided, must be a character from
+ * the ASCII subset.
+ *
+ * If any of PATTERN_LEN, STRING_LEN or ESCAPE_LEN are
+ * SVN_UTF__UNKNOWN_LENGTH, assume the associated string is
+ * null-terminated; otherwise, consider the string only up to the
+ * given length.
+ *
+ * Use buffers PATTERN_BUF, STRING_BUF and TEMP_BUF for temporary storage.
+ *
+ * If SQL_LIKE is true, interpret PATTERN as a pattern used by the SQL
+ * LIKE operator and notice ESCAPE. Otherwise it's a Unix fileglob
+ * pattern, and ESCAPE must be NULL.
+ *
+ * Set *MATCH to the result of the comparison.
+*/
+svn_error_t *
+svn_utf__glob(svn_boolean_t *match,
+ const char *pattern, apr_size_t pattern_len,
+ const char *string, apr_size_t string_len,
+ const char *escape, apr_size_t escape_len,
+ svn_boolean_t sql_like,
+ svn_membuf_t *pattern_buf,
+ svn_membuf_t *string_buf,
+ svn_membuf_t *temp_buf);
+
+/* Return the compiled version of the wrapped utf8proc library. */
+const char *
+svn_utf__utf8proc_compiled_version(void);
+
+/* Return the runtime version of the wrapped utf8proc library. */
+const char *
+svn_utf__utf8proc_runtime_version(void);
+
+/* Convert an UTF-16 (or UCS-2) string to UTF-8, returning the pointer
+ * in RESULT. If BIG_ENDIAN is set, then UTF16STR is big-endian;
+ * otherwise, it's little-endian.
+ *
+ * If UTF16LEN is SVN_UTF__UNKNOWN_LENGTH, then UTF16STR must be
+ * terminated with a zero; otherwise, it is the number of 16-bit codes
+ * to convert, and the source string may contain NUL values.
+ *
+ * Allocate RESULT in RESULT_POOL and use SCRATCH_POOL for
+ * intermediate allocation.
+ *
+ * This function combines UTF-16 surrogate pairs into single code
+ * points, but will leave single lead or trail surrogates unchanged.
+ */
+svn_error_t *
+svn_utf__utf16_to_utf8(const svn_string_t **result,
+ const apr_uint16_t *utf16str,
+ apr_size_t utf16len,
+ svn_boolean_t big_endian,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* Convert an UTF-32 string to UTF-8, returning the pointer in
+ * RESULT. If BIG_ENDIAN is set, then UTF32STR is big-endian;
+ * otherwise, it's little-endian.
+ *
+ * If UTF32LEN is SVN_UTF__UNKNOWN_LENGTH, then UTF32STR must be
+ * terminated with a zero; otherwise, it is the number of 32-bit codes
+ * to convert, and the source string may contain NUL values.
+ *
+ * Allocate RESULT in RESULT_POOL and use SCRATCH_POOL for
+ * intermediate allocation.
+ */
+svn_error_t *
+svn_utf__utf32_to_utf8(const svn_string_t **result,
+ const apr_int32_t *utf32str,
+ apr_size_t utf32len,
+ svn_boolean_t big_endian,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/subversion/include/private/svn_wc_private.h b/subversion/include/private/svn_wc_private.h
index fce42b053d33..28d22479118e 100644
--- a/subversion/include/private/svn_wc_private.h
+++ b/subversion/include/private/svn_wc_private.h
@@ -82,8 +82,6 @@ svn_wc__get_file_external_editor(const svn_delta_editor_t **editor,
const char *recorded_url,
const svn_opt_revision_t *recorded_peg_rev,
const svn_opt_revision_t *recorded_rev,
- svn_wc_conflict_resolver_func2_t conflict_func,
- void *conflict_baton,
svn_cancel_func_t cancel_func,
void *cancel_baton,
svn_wc_notify_func2_t notify_func,
@@ -354,7 +352,6 @@ svn_wc__get_wcroot(const char **wcroot_abspath,
* before the 1.7 release.
*/
-
/*
* Convert from svn_wc_conflict_description2_t to
* svn_wc_conflict_description_t. This is needed by some backwards-compat
@@ -370,7 +367,11 @@ svn_wc__cd2_to_cd(const svn_wc_conflict_description2_t *conflict,
/*
* Convert from svn_wc_status3_t to svn_wc_status2_t.
* Allocate the result in RESULT_POOL.
+ *
+ * Deprecated because svn_wc_status2_t is deprecated and the only
+ * calls are from other deprecated functions.
*/
+SVN_DEPRECATED
svn_error_t *
svn_wc__status2_from_3(svn_wc_status2_t **status,
const svn_wc_status3_t *old_status,
@@ -379,15 +380,13 @@ svn_wc__status2_from_3(svn_wc_status2_t **status,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
-
/**
* Set @a *children to a new array of the immediate children of the working
* node at @a dir_abspath. The elements of @a *children are (const char *)
* absolute paths.
*
- * Include children that are scheduled for deletion. Iff @a show_hidden
- * is true, also include children that are 'excluded' or 'server-excluded' or
- * 'not-present'.
+ * Include children that are scheduled for deletion, but not those that
+ * are excluded, server-excluded or not-present.
*
* Return every path that refers to a child of the working node at
* @a dir_abspath. Do not include a path just because it was a child of a
@@ -401,24 +400,20 @@ svn_error_t *
svn_wc__node_get_children_of_working_node(const apr_array_header_t **children,
svn_wc_context_t *wc_ctx,
const char *dir_abspath,
- svn_boolean_t show_hidden,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
/**
- * Like svn_wc__node_get_children_of_working_node(), except also include any
- * path that was a child of a deleted directory that existed at
- * @a dir_abspath, even if that directory is now scheduled to be replaced by
- * the working node at @a dir_abspath.
+ * Gets the immediate 'not-present' children of a node.
+ *
+ * #### Needed during 'svn cp WC URL' to handle mixed revision cases
*/
svn_error_t *
-svn_wc__node_get_children(const apr_array_header_t **children,
- svn_wc_context_t *wc_ctx,
- const char *dir_abspath,
- svn_boolean_t show_hidden,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool);
-
+svn_wc__node_get_not_present_children(const apr_array_header_t **children,
+ svn_wc_context_t *wc_ctx,
+ const char *dir_abspath,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
/**
* Fetch the repository information for the working version
@@ -442,18 +437,6 @@ svn_wc__node_get_repos_info(svn_revnum_t *revision,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
-
-
-/**
- * Get the depth of @a local_abspath using @a wc_ctx. If @a local_abspath is
- * not in the working copy, return @c SVN_ERR_WC_PATH_NOT_FOUND.
- */
-svn_error_t *
-svn_wc__node_get_depth(svn_depth_t *depth,
- svn_wc_context_t *wc_ctx,
- const char *local_abspath,
- apr_pool_t *scratch_pool);
-
/**
* Get the changed revision, date and author for @a local_abspath using @a
* wc_ctx. Allocate the return values in @a result_pool; use @a scratch_pool
@@ -501,6 +484,8 @@ svn_wc__node_get_url(const char **url,
* If not NULL, sets @a revision, @a repos_relpath, @a repos_root_url and
* @a repos_uuid to the original (if a copy) or their current values.
*
+ * If not NULL, set @a depth, to the recorded depth on @a local_abspath.
+ *
* If @a copy_root_abspath is not NULL, and @a *is_copy indicates that the
* node was copied, set @a *copy_root_abspath to the local absolute path of
* the root of the copied subtree containing the node. If the copied node is
@@ -519,6 +504,7 @@ svn_wc__node_get_origin(svn_boolean_t *is_copy,
const char **repos_relpath,
const char **repos_root_url,
const char **repos_uuid,
+ svn_depth_t *depth,
const char **copy_root_abspath,
svn_wc_context_t *wc_ctx,
const char *local_abspath,
@@ -527,38 +513,6 @@ svn_wc__node_get_origin(svn_boolean_t *is_copy,
apr_pool_t *scratch_pool);
/**
- * Set @a *is_deleted to TRUE if @a local_abspath is deleted, using
- * @a wc_ctx. If @a local_abspath is not in the working copy, return
- * @c SVN_ERR_WC_PATH_NOT_FOUND. Use @a scratch_pool for all temporary
- * allocations.
- */
-svn_error_t *
-svn_wc__node_is_status_deleted(svn_boolean_t *is_deleted,
- svn_wc_context_t *wc_ctx,
- const char *local_abspath,
- apr_pool_t *scratch_pool);
-
-/**
- * Set @a *deleted_ancestor_abspath to the root of the delete operation
- * that deleted @a local_abspath. If @a local_abspath itself was deleted
- * and has no deleted ancestor, @a *deleted_ancestor_abspath will equal
- * @a local_abspath. If @a local_abspath was not deleted,
- * set @a *deleted_ancestor_abspath to @c NULL.
- *
- * A node is considered 'deleted' if it is deleted or moved-away, and is
- * not replaced.
- *
- * @a *deleted_ancestor_abspath is allocated in @a result_pool.
- * Use @a scratch_pool for all temporary allocations.
- */
-svn_error_t *
-svn_wc__node_get_deleted_ancestor(const char **deleted_ancestor_abspath,
- svn_wc_context_t *wc_ctx,
- const char *local_abspath,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool);
-
-/**
* Set @a *not_present to TRUE when @a local_abspath has status
* svn_wc__db_status_not_present. Set @a *user_excluded to TRUE when
* @a local_abspath has status svn_wc__db_status_excluded. Set
@@ -641,7 +595,6 @@ svn_wc__node_get_base(svn_node_kind_t *kind,
svn_wc_context_t *wc_ctx,
const char *local_abspath,
svn_boolean_t ignore_enoent,
- svn_boolean_t show_hidden,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
@@ -771,20 +724,6 @@ svn_wc__call_with_write_lock(svn_wc__with_write_lock_func_t func,
} while (0)
-/**
- * Calculates the schedule and copied status of a node as that would
- * have been stored in an svn_wc_entry_t instance.
- *
- * If not @c NULL, @a schedule and @a copied are set to their calculated
- * values.
- */
-svn_error_t *
-svn_wc__node_get_schedule(svn_wc_schedule_t *schedule,
- svn_boolean_t *copied,
- svn_wc_context_t *wc_ctx,
- const char *local_abspath,
- apr_pool_t *scratch_pool);
-
/** A callback invoked by svn_wc__prop_list_recursive().
* It is equivalent to svn_proplist_receiver_t declared in svn_client.h,
* but kept private within the svn_wc__ namespace because it is used within
@@ -978,15 +917,17 @@ svn_wc__get_excluded_subtrees(apr_hash_t **server_excluded_subtrees,
/* Indicate in @a *is_modified whether the working copy has local
* modifications, using context @a wc_ctx.
- * Use @a scratch_pool for temporary allocations.
*
- * This function provides a subset of the functionality of
- * svn_wc_revision_status2() and is more efficient if the caller
- * doesn't need all information returned by svn_wc_revision_status2(). */
+ * If IGNORE_UNVERSIONED, unversioned paths inside the tree rooted by
+ * LOCAL_ABSPATH are not seen as a change, otherwise they are.
+ * (svn:ignored paths are always ignored)
+ *
+ * Use @a scratch_pool for temporary allocations. */
svn_error_t *
svn_wc__has_local_mods(svn_boolean_t *is_modified,
svn_wc_context_t *wc_ctx,
const char *local_abspath,
+ svn_boolean_t ignore_unversioned,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *scratch_pool);
@@ -1294,6 +1235,44 @@ svn_wc__resolve_relative_external_url(const char **resolved_url,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
+typedef enum svn_wc__external_description_format_t
+{
+ /* LOCALPATH [-r PEG] URL */
+ svn_wc__external_description_format_1 = 0,
+
+ /* [-r REV] URL[@PEG] LOCALPATH, introduced in Subversion 1.5 */
+ svn_wc__external_description_format_2
+} svn_wc__external_description_format_t;
+
+/* Additional information about what the external's parser has parsed. */
+typedef struct svn_wc__externals_parser_info_t
+{
+ /* The syntax format used by the external description. */
+ svn_wc__external_description_format_t format;
+
+ /* The string used for defining the operative revision, i.e.
+ "-rN", "-rHEAD", or "-r{DATE}".
+ NULL if revision was not given. */
+ const char *rev_str;
+
+ /* The string used for defining the peg revision (equals rev_str in
+ format 1, is "@N", or "@HEAD" or "@{DATE}" in format 2).
+ NULL if peg revision was not given. */
+ const char *peg_rev_str;
+
+} svn_wc__externals_parser_info_t;
+
+/* Like svn_wc_parse_externals_description3() but returns an additional array
+ * with elements of type svn_wc__externals_parser_info_t in @a *parser_infos_p.
+ * @a parser_infos_p may be NULL if not required by the caller.
+ */
+svn_error_t *
+svn_wc__parse_externals_description(apr_array_header_t **externals_p,
+ apr_array_header_t **parser_infos_p,
+ const char *defining_directory,
+ const char *desc,
+ svn_boolean_t canonicalize_url,
+ apr_pool_t *pool);
/**
* Set @a *editor and @a *edit_baton to an editor that generates
@@ -1318,8 +1297,8 @@ svn_wc__resolve_relative_external_url(const char **resolved_url,
*
* Assuming the target is a directory, then:
*
- * - If @a get_all is FALSE, then only locally-modified entries will be
- * returned. If TRUE, then all entries will be returned.
+ * - If @a get_all is @c FALSE, then only locally-modified entries will be
+ * returned. If @c TRUE, then all entries will be returned.
*
* - If @a depth is #svn_depth_empty, a status structure will
* be returned for the target only; if #svn_depth_files, for the
@@ -1334,6 +1313,9 @@ svn_wc__resolve_relative_external_url(const char **resolved_url,
* If the given @a depth is incompatible with the depth found in a
* working copy directory, the found depth always governs.
*
+ * If @a check_working_copy is not set, do not scan the working copy
+ * for local modifications, taking only the BASE tree into account.
+ *
* If @a no_ignore is set, statuses that would typically be ignored
* will instead be reported.
*
@@ -1368,6 +1350,7 @@ svn_wc__get_status_editor(const svn_delta_editor_t **editor,
const char *target_basename,
svn_depth_t depth,
svn_boolean_t get_all,
+ svn_boolean_t check_working_copy,
svn_boolean_t no_ignore,
svn_boolean_t depth_as_sticky,
svn_boolean_t server_performs_filtering,
@@ -1557,7 +1540,7 @@ svn_wc__get_switch_editor(const svn_delta_editor_t **editor,
* Diffs will be reported as valid relpaths, with @a anchor_abspath being
* the root ("").
*
- * @a callbacks/@a callback_baton is the callback table to use.
+ * @a diff_processor will retrieve the diff report.
*
* If @a depth is #svn_depth_empty, just diff exactly @a target or
* @a anchor_path if @a target is empty. If #svn_depth_files then do the same
@@ -1583,8 +1566,12 @@ svn_wc__get_switch_editor(const svn_delta_editor_t **editor,
* if they weren't modified after being copied. This allows the callbacks
* to generate appropriate --git diff headers for such files.
*
- * Normally, the difference from repository->working_copy is shown.
- * If @a reverse_order is TRUE, then show working_copy->repository diffs.
+ * Normally, the difference from repository->working_copy is shown. If
+ * @a reverse_order is TRUE, then we want to show working_copy->repository
+ * diffs. Most of the reversal is done by the caller; here we just swap the
+ * order of reporting a replacement so that the local addition is reported
+ * before the remote delete. (The caller's diff processor can then transform
+ * adds into deletes and deletes into adds, but it can't reorder the output.)
*
* If @a cancel_func is non-NULL, it will be used along with @a cancel_baton
* to periodically check if the client has canceled the operation.
@@ -1628,14 +1615,11 @@ svn_wc__get_diff_editor(const svn_delta_editor_t **editor,
const char *target,
svn_depth_t depth,
svn_boolean_t ignore_ancestry,
- svn_boolean_t show_copies_as_adds,
- svn_boolean_t use_git_diff_format,
svn_boolean_t use_text_base,
svn_boolean_t reverse_order,
svn_boolean_t server_performs_filtering,
const apr_array_header_t *changelist_filter,
- const svn_wc_diff_callbacks4_t *callbacks,
- void *callback_baton,
+ const svn_diff_tree_processor_t *diff_processor,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *result_pool,
@@ -1840,6 +1824,29 @@ svn_wc__acquire_write_lock_for_resolve(const char **lock_root_abspath,
const char *local_abspath,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
+
+/* The implemementation of svn_wc_diff6(), but reporting to a diff processor
+ *
+ * If ROOT_RELPATH is not NULL, set *ROOT_RELPATH to the target of the diff
+ * within the diff namespace. ("" or a single path component).
+ *
+ * If ROOT_IS_FILE is NOT NULL set it
+ * the first processor call. (The anchor is LOCAL_ABSPATH or an ancestor of it)
+ */
+svn_error_t *
+svn_wc__diff7(const char **root_relpath,
+ svn_boolean_t *root_is_dir,
+ svn_wc_context_t *wc_ctx,
+ const char *local_abspath,
+ svn_depth_t depth,
+ svn_boolean_t ignore_ancestry,
+ const apr_array_header_t *changelist_filter,
+ const svn_diff_tree_processor_t *diff_processor,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/subversion/include/svn_auth.h b/subversion/include/svn_auth.h
index 3e9f45e5c201..3a78ba6ace5f 100644
--- a/subversion/include/svn_auth.h
+++ b/subversion/include/svn_auth.h
@@ -884,7 +884,11 @@ svn_auth_get_platform_specific_client_providers(
* @note An administrative password reset may invalidate the account's
* secret key. This function will detect that situation and behave as
* if the password were not cached at all.
+ * @deprecated Provided for backwards compatibility with the 1.8 API. Use
+ * svn_auth_get_platform_specific_provider with provider_name of "windows"
+ * and provider_type of "simple".
*/
+SVN_DEPRECATED
void
svn_auth_get_windows_simple_provider(svn_auth_provider_object_t **provider,
apr_pool_t *pool);
@@ -906,7 +910,11 @@ svn_auth_get_windows_simple_provider(svn_auth_provider_object_t **provider,
* @note An administrative password reset may invalidate the account's
* secret key. This function will detect that situation and behave as
* if the password were not cached at all.
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
+ * Use svn_auth_get_platform_specific_provider with provider_name
+ * of "windows" and provider_type of "ssl_client_cert_pw".
*/
+SVN_DEPRECATED
void
svn_auth_get_windows_ssl_client_cert_pw_provider(
svn_auth_provider_object_t **provider,
@@ -923,7 +931,11 @@ svn_auth_get_windows_ssl_client_cert_pw_provider(
*
* @since New in 1.5.
* @note This function is only available on Windows.
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
+ * Use svn_auth_get_platform_specific_provider with provider_name
+ * of "windows" and provider_type of "ssl_server_trust".
*/
+SVN_DEPRECATED
void
svn_auth_get_windows_ssl_server_trust_provider(
svn_auth_provider_object_t **provider,
@@ -943,7 +955,11 @@ svn_auth_get_windows_ssl_server_trust_provider(
*
* @since New in 1.4
* @note This function is only available on Mac OS 10.2 and higher.
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
+ * Use svn_auth_get_platform_specific_provider with provider_name
+ * of "keychain" and provider_type of "simple".
*/
+SVN_DEPRECATED
void
svn_auth_get_keychain_simple_provider(svn_auth_provider_object_t **provider,
apr_pool_t *pool);
@@ -959,7 +975,11 @@ svn_auth_get_keychain_simple_provider(svn_auth_provider_object_t **provider,
*
* @since New in 1.6
* @note This function is only available on Mac OS 10.2 and higher.
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
+ * Use svn_auth_get_platform_specific_provider with provider_name
+ * of "keychain" and provider_type of "ssl_client_cert_pw".
*/
+SVN_DEPRECATED
void
svn_auth_get_keychain_ssl_client_cert_pw_provider(
svn_auth_provider_object_t **provider,
@@ -1029,7 +1049,11 @@ svn_auth_gnome_keyring_version(void);
* @since New in 1.6
* @note This function actually works only on systems with
* libsvn_auth_gnome_keyring and GNOME Keyring installed.
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
+ * Use svn_auth_get_platform_specific_provider with provider_name
+ * of "gnome_keyring" and provider_type of "simple".
*/
+SVN_DEPRECATED
void
svn_auth_get_gnome_keyring_simple_provider(
svn_auth_provider_object_t **provider,
@@ -1056,7 +1080,11 @@ svn_auth_get_gnome_keyring_simple_provider(
* @since New in 1.6
* @note This function actually works only on systems with
* libsvn_auth_gnome_keyring and GNOME Keyring installed.
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
+ * Use svn_auth_get_platform_specific_provider with provider_name
+ * of "gnome_keyring" and provider_type of "ssl_client_cert_pw".
*/
+SVN_DEPRECATED
void
svn_auth_get_gnome_keyring_ssl_client_cert_pw_provider(
svn_auth_provider_object_t **provider,
@@ -1084,7 +1112,11 @@ svn_auth_kwallet_version(void);
* @since New in 1.6
* @note This function actually works only on systems with libsvn_auth_kwallet
* and KWallet installed.
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
+ * Use svn_auth_get_platform_specific_provider with provider_name
+ * of "kwallet" and provider_type of "simple".
*/
+SVN_DEPRECATED
void
svn_auth_get_kwallet_simple_provider(svn_auth_provider_object_t **provider,
apr_pool_t *pool);
@@ -1102,7 +1134,11 @@ svn_auth_get_kwallet_simple_provider(svn_auth_provider_object_t **provider,
* @since New in 1.6
* @note This function actually works only on systems with libsvn_auth_kwallet
* and KWallet installed.
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
+ * Use svn_auth_get_platform_specific_provider with provider_name
+ * of "kwallet" and provider_type of "ssl_client_cert_pw".
*/
+SVN_DEPRECATED
void
svn_auth_get_kwallet_ssl_client_cert_pw_provider(
svn_auth_provider_object_t **provider,
@@ -1124,7 +1160,11 @@ svn_auth_get_kwallet_ssl_client_cert_pw_provider(
* @since New in 1.8
* @note This function actually works only on systems with
* GNU Privacy Guard installed.
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
+ * Use svn_auth_get_platform_specific_provider with provider_name
+ * of "gpg_agent" and provider_type of "simple".
*/
+SVN_DEPRECATED
void
svn_auth_get_gpg_agent_simple_provider
(svn_auth_provider_object_t **provider,
diff --git a/subversion/include/svn_cache_config.h b/subversion/include/svn_cache_config.h
index b03a07914993..2db619af241f 100644
--- a/subversion/include/svn_cache_config.h
+++ b/subversion/include/svn_cache_config.h
@@ -41,6 +41,9 @@ extern "C" {
/** Cache resource settings. It controls what caches, in what size and
how they will be created. The settings apply for the whole process.
+ @note Do not extend this data structure as this would break binary
+ compatibility.
+
@since New in 1.7.
*/
typedef struct svn_cache_config_t
@@ -56,6 +59,8 @@ typedef struct svn_cache_config_t
/** is this application guaranteed to be single-threaded? */
svn_boolean_t single_threaded;
+
+ /* DON'T add new members here. Bump struct and API version instead. */
} svn_cache_config_t;
/** Get the current cache configuration. If it has not been set,
diff --git a/subversion/include/svn_checksum.h b/subversion/include/svn_checksum.h
index d3271f5538b2..e332e87e328d 100644
--- a/subversion/include/svn_checksum.h
+++ b/subversion/include/svn_checksum.h
@@ -48,7 +48,17 @@ typedef enum svn_checksum_kind_t
svn_checksum_md5,
/** The checksum is (or should be set to) a SHA1 checksum. */
- svn_checksum_sha1
+ svn_checksum_sha1,
+
+ /** The checksum is (or should be set to) a FNV-1a 32 bit checksum,
+ * in big endian byte order.
+ * @since New in 1.9. */
+ svn_checksum_fnv1a_32,
+
+ /** The checksum is (or should be set to) a modified FNV-1a 32 bit,
+ * in big endian byte order.
+ * @since New in 1.9. */
+ svn_checksum_fnv1a_32x4
} svn_checksum_kind_t;
/**
diff --git a/subversion/include/svn_client.h b/subversion/include/svn_client.h
index 5db3e1689589..6719e3ea03fd 100644
--- a/subversion/include/svn_client.h
+++ b/subversion/include/svn_client.h
@@ -465,13 +465,19 @@ typedef struct svn_client_commit_item3_t
{
/* IMPORTANT: If you extend this structure, add new fields to the end. */
- /** absolute working-copy path of item */
+ /** absolute working-copy path of item. Always set during normal commits
+ * (and copies from a working copy) to the repository. Can only be NULL
+ * when stub commit items are created for operations that only involve
+ * direct repository operations. During WC->REPOS copy operations, this
+ * path is the WC source path of the operation. */
const char *path;
/** node kind (dir, file) */
svn_node_kind_t kind;
- /** commit URL for this item */
+ /** commit URL for this item. Points to the repository location of PATH
+ * during commits, or to the final URL of the item when copying from the
+ * working copy to the repository. */
const char *url;
/** revision of textbase */
@@ -1014,6 +1020,31 @@ typedef struct svn_client_ctx_t
* @since New in 1.7. */
svn_wc_context_t *wc_ctx;
+ /** Check-tunnel callback
+ *
+ * If not @c NULL, and open_tunnel_func is also not @c NULL, this
+ * callback will be invoked to check if open_tunnel_func should be
+ * used to create a specific tunnel, or if the default tunnel
+ * implementation (either built-in or configured in the client
+ * configuration file) should be used instead.
+ * @since New in 1.9.
+ */
+ svn_ra_check_tunnel_func_t check_tunnel_func;
+
+ /** Open-tunnel callback
+ *
+ * If not @c NULL, this callback will be invoked to create a tunnel
+ * for a ra_svn connection that needs one, overriding any tunnel
+ * definitions in the client config file. This callback is used only
+ * for ra_svn and ignored by the other RA modules.
+ * @since New in 1.9.
+ */
+ svn_ra_open_tunnel_func_t open_tunnel_func;
+
+ /** The baton used with check_tunnel_func and open_tunnel_func.
+ * @since New in 1.9.
+ */
+ void *tunnel_baton;
} svn_client_ctx_t;
/** Initialize a client context.
@@ -1051,20 +1082,15 @@ svn_client_create_context(svn_client_ctx_t **ctx,
/** @} end group: Client context management */
/**
- * @name Authentication information file names
- *
- * Names of files that contain authentication information.
- *
- * These filenames are decided by libsvn_client, since this library
- * implements all the auth-protocols; libsvn_wc does nothing but
- * blindly store and retrieve these files from protected areas.
- *
- * @defgroup clnt_auth_filenames Client authentication file names
- * @{
+ * @deprecated Provided for backward compatibility. This constant was never
+ * used in released versions.
*/
#define SVN_CLIENT_AUTH_USERNAME "username"
+/**
+ * @deprecated Provided for backward compatibility. This constant was never
+ * used in released versions.
+ */
#define SVN_CLIENT_AUTH_PASSWORD "password"
-/** @} group end: Authentication information file names */
/** Client argument processing
*
@@ -1100,6 +1126,12 @@ svn_client_create_context(svn_client_ctx_t **ctx,
* error, and if this is the only type of error encountered, complete
* the operation before returning the error(s).
*
+ * Return an error if a target is just a peg specifier with no path, such as
+ * "@abc". Before v1.6.5 (r878062) this form was interpreted as a literal path;
+ * it is now ambiguous. The form "@abc@" should now be used to refer to the
+ * literal path "@abc" with no peg revision, or the form ".@abc" to refer to
+ * the empty path with peg revision "abc".
+ *
* @since New in 1.7
*/
svn_error_t *
@@ -1114,6 +1146,9 @@ svn_client_args_to_target_array2(apr_array_header_t **targets_p,
* Similar to svn_client_args_to_target_array2() but with
* @a keep_last_origpath_on_truepath_collision always set to FALSE.
*
+ * @since Since 1.6.5, this returns an error if a path contains a peg
+ * specifier with no path before it, such as "@abc".
+ *
* @deprecated Provided for backward compatibility with the 1.6 API.
*/
SVN_DEPRECATED
@@ -2471,12 +2506,20 @@ typedef svn_error_t *(*svn_client_status_func_t)(
* retrieve only "interesting" entries (local mods and/or
* out of date).
*
- * - If @a update is set, contact the repository and augment the
- * status structures with information about out-of-dateness (with
- * respect to @a revision). Also, if @a result_rev is not @c NULL,
- * set @a *result_rev to the actual revision against which the
- * working copy was compared (@a *result_rev is not meaningful unless
- * @a update is set).
+ * - If @a check_out_of_date is set, contact the repository and
+ * augment the status structures with information about
+ * out-of-dateness (with respect to @a revision). Also, if @a
+ * result_rev is not @c NULL, set @a *result_rev to the actual
+ * revision against which the working copy was compared (@a
+ * *result_rev is not meaningful unless @a check_out_of_date is
+ * set).
+ *
+ * - If @a check_working_copy is not set, do not scan the working
+ * copy for local modifications. This parameter will be ignored
+ * unless @a check_out_of_date is set. When set, the status
+ * report will not contain any information about local changes in
+ * the working copy; this includes local deletions and
+ * replacements.
*
* If @a no_ignore is @c FALSE, don't report any file or directory (or
* recurse into any directory) that is found by recursion (as opposed to
@@ -2507,8 +2550,34 @@ typedef svn_error_t *(*svn_client_status_func_t)(
*
* All temporary allocations are performed in @a scratch_pool.
*
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_client_status6(svn_revnum_t *result_rev,
+ svn_client_ctx_t *ctx,
+ const char *path,
+ const svn_opt_revision_t *revision,
+ svn_depth_t depth,
+ svn_boolean_t get_all,
+ svn_boolean_t check_out_of_date,
+ svn_boolean_t check_working_copy,
+ svn_boolean_t no_ignore,
+ svn_boolean_t ignore_externals,
+ svn_boolean_t depth_as_sticky,
+ const apr_array_header_t *changelists,
+ svn_client_status_func_t status_func,
+ void *status_baton,
+ apr_pool_t *scratch_pool);
+
+
+/**
+ * Same as svn_client_status6(), but with @a check_out_of_date set to
+ * @a update and @a check_working_copy set to @c TRUE.
+ *
* @since New in 1.7.
+ * @deprecated Provided for backward compatibility with the 1.8 API.
*/
+SVN_DEPRECATED
svn_error_t *
svn_client_status5(svn_revnum_t *result_rev,
svn_client_ctx_t *ctx,
@@ -2641,8 +2710,8 @@ svn_client_status(svn_revnum_t *result_rev,
* #svn_opt_revision_unspecified, it defaults to #svn_opt_revision_head
* for URLs or #svn_opt_revision_working for WC paths.
*
- * If @a limit is non-zero only invoke @a receiver on the first @a limit
- * logs.
+ * If @a limit is greater than zero only invoke @a receiver on the first
+ * @a limit logs.
*
* If @a discover_changed_paths is set, then the @c changed_paths and @c
* changed_paths2 fields in the @c log_entry argument to @a receiver will be
@@ -2814,6 +2883,11 @@ svn_client_log(const apr_array_header_t *targets,
* in which case blame information will be generated regardless of the
* MIME types of the revisions.
*
+ * @a start may resolve to a revision number greater (younger) than @a end
+ * only if the server is 1.8.0 or greater (supports
+ * #SVN_RA_CAPABILITY_GET_FILE_REVS_REVERSE) and the client is 1.9.0 or
+ * newer.
+ *
* Use @a diff_options to determine how to compare different revisions of the
* target.
*
@@ -3919,8 +3993,15 @@ svn_client_mergeinfo_get_merged(apr_hash_t **mergeinfo,
* If a depth other than #svn_depth_empty or #svn_depth_infinity is
* requested then return a #SVN_ERR_UNSUPPORTED_FEATURE error.
*
- * @a discover_changed_paths and @a revprops are the same as for
- * svn_client_log5(). Use @a scratch_pool for all temporary allocations.
+ * In addition to the behavior of @a discover_changed_paths described in
+ * svn_client_log5(), if set to TRUE it enables detection of sub-tree
+ * merges that are complete but can't be detected as complete without
+ * access to the changed paths. Sub-tree merges detected as complete will
+ * be included if @a finding_merged is TRUE or filtered if @a finding_merged
+ * is FALSE.
+ *
+ * @a revprops is the same as for svn_client_log5(). Use @a scratch_pool for
+ * all temporary allocations.
*
* @a ctx is a context used for authentication.
*
@@ -4017,17 +4098,96 @@ svn_client_mergeinfo_log_eligible(const char *path_or_url,
* @{
*/
-/** Recursively cleanup a working copy directory @a dir, finishing any
+/** Recursively vacuum a working copy directory @a dir, removing unnecessary
+ * data.
+ *
+ * If @a include_externals is @c TRUE, recurse into externals and vacuum them
+ * as well.
+ *
+ * If @a remove_unversioned_items is @c TRUE, remove unversioned items
+ * in @a dir after successful working copy cleanup.
+ * If @a remove_ignored_items is @c TRUE, remove ignored unversioned items
+ * in @a dir after successful working copy cleanup.
+ *
+ * If @a fix_recorded_timestamps is @c TRUE, this function fixes recorded
+ * timestamps for unmodified files in the working copy, reducing comparision
+ * time on future checks.
+ *
+ * If @a vacuum_pristines is @c TRUE, and @a dir_abspath points to the working
+ * copy root unreferenced files in the pristine store are removed.
+ *
+ * When asked to remove unversioned or ignored items, and the working copy
+ * is already locked, return #SVN_ERR_WC_LOCKED. This prevents accidental
+ * working copy corruption in case users run the cleanup operation to
+ * remove unversioned items while another client is performing some other
+ * operation on the working copy.
+ *
+ * If @a ctx->cancel_func is non-NULL, invoke it with @a
+ * ctx->cancel_baton at various points during the operation. If it
+ * returns an error (typically #SVN_ERR_CANCELLED), return that error
+ * immediately.
+ *
+ * Use @a scratch_pool for any temporary allocations.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_client_vacuum(const char *dir_abspath,
+ svn_boolean_t remove_unversioned_items,
+ svn_boolean_t remove_ignored_items,
+ svn_boolean_t fix_recorded_timestamps,
+ svn_boolean_t vacuum_pristines,
+ svn_boolean_t include_externals,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *scratch_pool);
+
+
+/** Recursively cleanup a working copy directory @a dir_abspath, finishing any
* incomplete operations, removing lockfiles, etc.
*
+ * If @a break_locks is @c TRUE, existing working copy locks at or below @a
+ * dir_abspath are broken, otherwise a normal write lock is obtained.
+ *
+ * If @a fix_recorded_timestamps is @c TRUE, this function fixes recorded
+ * timestamps for unmodified files in the working copy, reducing comparision
+ * time on future checks.
+ *
+ * If @a clear_dav_cache is @c TRUE, the caching of DAV information for older
+ * mod_dav served repositories is cleared. This clearing invalidates some
+ * cached information used for pre-HTTPv2 repositories.
+ *
+ * If @a vacuum_pristines is @c TRUE, and @a dir_abspath points to the working
+ * copy root unreferenced files in the pristine store are removed.
+ *
+ * If @a include_externals is @c TRUE, recurse into externals and clean
+ * them up as well.
+ *
* If @a ctx->cancel_func is non-NULL, invoke it with @a
* ctx->cancel_baton at various points during the operation. If it
* returns an error (typically #SVN_ERR_CANCELLED), return that error
* immediately.
*
* Use @a scratch_pool for any temporary allocations.
+ *
+ * @since New in 1.9.
*/
svn_error_t *
+svn_client_cleanup2(const char *dir_abspath,
+ svn_boolean_t break_locks,
+ svn_boolean_t fix_recorded_timestamps,
+ svn_boolean_t clear_dav_cache,
+ svn_boolean_t vacuum_pristines,
+ svn_boolean_t include_externals,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *scratch_pool);
+
+/** Like svn_client_cleanup2(), but no support for not breaking locks and
+ * cleaning up externals and using a potentially non absolute path.
+ *
+ * @deprecated Provided for limited backwards compatibility with the 1.8 API.
+ */
+SVN_DEPRECATED
+svn_error_t *
svn_client_cleanup(const char *dir,
svn_client_ctx_t *ctx,
apr_pool_t *scratch_pool);
@@ -4133,6 +4293,13 @@ svn_client_relocate(const char *dir,
* changelists. If @a changelists is empty (or altogether @c NULL),
* no changelist filtering occurs.
*
+ * If @a clear_changelists is TRUE, then changelist information for the
+ * paths is cleared while reverting.
+ *
+ * If @a metadata_only is TRUE, the files and directories aren't changed
+ * by the operation. If there are conflict marker files attached to the
+ * targets these are removed.
+ *
* If @a ctx->notify_func2 is non-NULL, then for each item reverted,
* call @a ctx->notify_func2 with @a ctx->notify_baton2 and the path of
* the reverted item.
@@ -4141,8 +4308,24 @@ svn_client_relocate(const char *dir,
* then do not error, just invoke @a ctx->notify_func2 with @a
* ctx->notify_baton2, using notification code #svn_wc_notify_skip.
*
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_client_revert3(const apr_array_header_t *paths,
+ svn_depth_t depth,
+ const apr_array_header_t *changelists,
+ svn_boolean_t clear_changelists,
+ svn_boolean_t metadata_only,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *pool);
+
+/** Similar to svn_client_revert2, but with @a clear_changelists set to
+ * FALSE and @a metadata_only set to FALSE.
+ *
* @since New in 1.5.
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
*/
+SVN_DEPRECATED
svn_error_t *
svn_client_revert2(const apr_array_header_t *paths,
svn_depth_t depth,
@@ -4160,7 +4343,7 @@ svn_client_revert2(const apr_array_header_t *paths,
* @note Most APIs map @a recurse==FALSE to @a depth==svn_depth_files;
* revert is deliberately different.
*
- * @deprecated Provided for backwards compatibility with the 1.0 API.
+ * @deprecated Provided for backwards compatibility with the 1.4 API.
*/
SVN_DEPRECATED
svn_error_t *
@@ -4316,6 +4499,41 @@ typedef struct svn_client_copy_source_t
* If @a ignore_externals is set, don't process externals definitions
* as part of this operation.
*
+ * If @a metadata_only is @c TRUE and copying a file in a working copy,
+ * everything in the metadata is updated as if the node is moved, but the
+ * actual disk copy operation is not performed. This feature is useful for
+ * clients that want to keep the working copy in sync while the actual working
+ * copy is updated by some other task.
+ *
+ * If @a pin_externals is set, pin URLs in copied externals definitions
+ * to their current revision unless they were already pinned to a
+ * particular revision. A pinned external uses a URL which points at a
+ * fixed revision, rather than the HEAD revision. Externals in the copy
+ * destination are pinned to either a working copy base revision or the
+ * HEAD revision of a repository (as of the time the copy operation is
+ * performed), depending on the type of the copy source:
+ <pre>
+ copy source: working copy (WC) REPOS
+ ------------+------------------------+---------------------------+
+ copy WC | external's WC BASE rev | external's repos HEAD rev |
+ dest: |------------------------+---------------------------+
+ REPOS | external's WC BASE rev | external's repos HEAD rev |
+ ------------+------------------------+---------------------------+
+ </pre>
+ * If the copy source is a working copy, then all externals must be checked
+ * out, be at a single-revision, contain no local modifications, and contain
+ * no switched subtrees. Else, #SVN_ERR_WC_PATH_UNEXPECTED_STATUS is returned.
+ *
+ * If non-NULL, @a externals_to_pin restricts pinning to a subset of externals.
+ * It is a hash table keyed by either a local absolute path or a URL at which
+ * an svn:externals property is set. The hash table contains apr_array_header_t*
+ * elements as returned by svn_wc_parse_externals_description3(). These arrays
+ * contain elements of type svn_wc_external_item2_t*, each of which corresponds
+ * to a single line of an svn:externals definition. Externals corresponding to
+ * these items will be pinned, other externals will not be pinned.
+ * If @a externals_to_pin is @c NULL then all externals are pinned.
+ * If @a pin_externals is @c FALSE then @a externals_to_pin is ignored.
+ *
* If non-NULL, @a revprop_table is a hash table holding additional,
* custom revision properties (<tt>const char *</tt> names mapped to
* <tt>svn_string_t *</tt> values) to be set on the new revision in
@@ -4334,8 +4552,32 @@ typedef struct svn_client_copy_source_t
* @a commit_callback with @a commit_baton and a #svn_commit_info_t for
* the commit.
*
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_client_copy7(const apr_array_header_t *sources,
+ const char *dst_path,
+ svn_boolean_t copy_as_child,
+ svn_boolean_t make_parents,
+ svn_boolean_t ignore_externals,
+ svn_boolean_t metadata_only,
+ svn_boolean_t pin_externals,
+ const apr_hash_t *externals_to_pin,
+ const apr_hash_t *revprop_table,
+ svn_commit_callback2_t commit_callback,
+ void *commit_baton,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *pool);
+
+/**
+ * Similar to svn_client_copy7(), but doesn't support meta_data_only
+ * and cannot pin externals.
+ *
+ *
* @since New in 1.7.
+ * @deprecated Provided for backward compatibility with the 1.8 API.
*/
+SVN_DEPRECATED
svn_error_t *
svn_client_copy6(const apr_array_header_t *sources,
const char *dst_path,
@@ -5065,6 +5307,8 @@ svn_client_propget(apr_hash_t **props,
* in @a ctx for authentication, and @a pool for all memory allocation.
* Return the actual rev queried in @a *set_rev.
*
+ * If @a propname does not exist on @a revision, set @a *propval to @c NULL.
+ *
* Note that unlike its cousin svn_client_propget(), this routine
* doesn't affect the working copy at all; it's a pure network
* operation that queries an *unversioned* property attached to a
@@ -5616,15 +5860,14 @@ svn_client_ls(apr_hash_t **dirents,
/**
* Output the content of a file.
*
- * @param[in] out The stream to which the content will be written.
- * @param[in] path_or_url The path or URL of the file.
- * @param[in] peg_revision The peg revision.
- * @param[in] revision The operative revision.
+ * @param[out] props Optional output argument to obtain properties.
+ * @param[in] out The stream to which the content will be written.
+ * @param[in] path_or_url The path or URL of the file.
+ * @param[in] peg_revision The peg revision.
+ * @param[in] revision The operative revision.
+ * @param[in] expand_keywords When true, keywords (when set) are expanded.
* @param[in] ctx The standard client context, used for possible
* authentication.
- * @param[in] pool Used for any temporary allocation.
- *
- * @todo Add an expansion/translation flag?
*
* @return A pointer to an #svn_error_t of the type (this list is not
* exhaustive): <br>
@@ -5634,12 +5877,35 @@ svn_client_ls(apr_hash_t **dirents,
* determined. <br>
* If no error occurred, return #SVN_NO_ERROR.
*
- * @since New in 1.2.
+ * If @a *props is not NULL it is set to a hash of all the file's
+ * non-inherited properties. If it is NULL, the properties are only
+ * used for determining how and if the file should be translated.
*
* @see #svn_client_ctx_t <br> @ref clnt_revisions for
* a discussion of operative and peg revisions.
+ *
+ * @since New in 1.9.
*/
svn_error_t *
+svn_client_cat3(apr_hash_t **props,
+ svn_stream_t *out,
+ const char *path_or_url,
+ const svn_opt_revision_t *peg_revision,
+ const svn_opt_revision_t *revision,
+ svn_boolean_t expand_keywords,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/**
+ * Similar to svn_client_cat3() except without the option of directly
+ * reading the properties, and with @a expand_keywords always TRUE.
+ *
+ * @since New in 1.2.
+ * @deprecated Provided for backward compatibility with the 1.8 API.
+ */
+SVN_DEPRECATED
+svn_error_t *
svn_client_cat2(svn_stream_t *out,
const char *path_or_url,
const svn_opt_revision_t *peg_revision,
@@ -6110,14 +6376,38 @@ typedef svn_error_t *(*svn_client_info_receiver2_t)(
* is TRUE also send nodes that don't exist as versioned but are still
* tree conflicted.
*
+ * If @a include_externals is @c TRUE, recurse into externals and report about
+ * them as well.
+ *
* @a changelists is an array of <tt>const char *</tt> changelist
* names, used as a restrictive filter on items whose info is
* reported; that is, don't report info about any item unless
* it's a member of one of those changelists. If @a changelists is
* empty (or altogether @c NULL), no changelist filtering occurs.
*
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_client_info4(const char *abspath_or_url,
+ const svn_opt_revision_t *peg_revision,
+ const svn_opt_revision_t *revision,
+ svn_depth_t depth,
+ svn_boolean_t fetch_excluded,
+ svn_boolean_t fetch_actual_only,
+ svn_boolean_t include_externals,
+ const apr_array_header_t *changelists,
+ svn_client_info_receiver2_t receiver,
+ void *receiver_baton,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *scratch_pool);
+
+
+/** Similar to svn_client_info4, but doesn't support walking externals.
+ *
* @since New in 1.7.
+ * @deprecated Provided for backward compatibility with the 1.8 API.
*/
+SVN_DEPRECATED
svn_error_t *
svn_client_info3(const char *abspath_or_url,
const svn_opt_revision_t *peg_revision,
diff --git a/subversion/include/svn_cmdline.h b/subversion/include/svn_cmdline.h
index 80442e454a26..923aeee6235a 100644
--- a/subversion/include/svn_cmdline.h
+++ b/subversion/include/svn_cmdline.h
@@ -320,8 +320,28 @@ svn_cmdline_auth_plaintext_passphrase_prompt(svn_boolean_t *may_save_plaintext,
* by the command line client.
*
* @a non_interactive, @a username, @a password, @a config_dir,
- * @a no_auth_cache, and @a trust_server_cert are the values of the
- * command line options of the corresponding names.
+ * and @a no_auth_cache are the values of the command line options
+ * of the corresponding names.
+ *
+ * If @a non_interactive is @c TRUE, then the following parameters
+ * control whether an invalid SSL certificate will be accepted
+ * regardless of a specific verification failure:
+ *
+ * @a trust_server_cert_unknown_ca: If @c TRUE, accept certificates
+ * from unknown certificate authorities.
+ *
+ * @a trust_server_cert_cn_mismatch: If @c TRUE, accept certificates
+ * even if the Common Name attribute of the certificate differs from
+ * the hostname of the server.
+ *
+ * @a trust_server_cert_expired: If @c TRUE, accept certificates even
+ * if they are expired.
+ *
+ * @a trust_server_cert_not_yet_valid: If @c TRUE, accept certificates
+ * from the future.
+ *
+ * @a trust_server_cert_other_failure: If @c TRUE, accept certificates
+ * even if any other verification failure than the above occured.
*
* @a cfg is the @c SVN_CONFIG_CATEGORY_CONFIG configuration, and
* @a cancel_func and @a cancel_baton control the cancellation of the
@@ -329,6 +349,29 @@ svn_cmdline_auth_plaintext_passphrase_prompt(svn_boolean_t *may_save_plaintext,
*
* Use @a pool for all allocations.
*
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_cmdline_create_auth_baton2(svn_auth_baton_t **ab,
+ svn_boolean_t non_interactive,
+ const char *username,
+ const char *password,
+ const char *config_dir,
+ svn_boolean_t no_auth_cache,
+ svn_boolean_t trust_server_cert_unknown_ca,
+ svn_boolean_t trust_server_cert_cn_mismatch,
+ svn_boolean_t trust_server_cert_expired,
+ svn_boolean_t trust_server_cert_not_yet_valid,
+ svn_boolean_t trust_server_cert_other_failure,
+ svn_config_t *cfg,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool);
+
+/* Like svn_cmdline_create_auth_baton2, but with only one trust_server_cert
+ * option which corresponds to trust_server_cert_unknown_ca.
+ *
+ * @deprecated Provided for backward compatibility with the 1.8 API.
* @since New in 1.6.
*/
svn_error_t *
diff --git a/subversion/include/svn_compat.h b/subversion/include/svn_compat.h
index a127125c7d2d..35bbe19788d6 100644
--- a/subversion/include/svn_compat.h
+++ b/subversion/include/svn_compat.h
@@ -32,6 +32,7 @@
#include <apr_tables.h>
#include "svn_types.h"
+#include "svn_string.h"
#ifdef __cplusplus
extern "C" {
@@ -75,6 +76,17 @@ svn_compat_log_revprops_in(apr_pool_t *pool);
* revprops is NULL, all return values are NULL. Any return value may be
* NULL if the corresponding property is not set in @a revprops.
*
+ * @since New in 1.9.
+ */
+void
+svn_compat_log_revprops_out_string(const svn_string_t **author,
+ const svn_string_t **date,
+ const svn_string_t **message,
+ apr_hash_t *revprops);
+
+/** Simiar to svn_compat_log_revprops_out_string() but returns C-style strings
+ * instead of #svn_string_t.
+ *
* @since New in 1.5.
*/
void
diff --git a/subversion/include/svn_config.h b/subversion/include/svn_config.h
index a3fa9df937eb..b4dc84838d5e 100644
--- a/subversion/include/svn_config.h
+++ b/subversion/include/svn_config.h
@@ -95,6 +95,14 @@ typedef struct svn_config_t svn_config_t;
#define SVN_CONFIG_OPTION_HTTP_BULK_UPDATES "http-bulk-updates"
/** @since New in 1.8. */
#define SVN_CONFIG_OPTION_HTTP_MAX_CONNECTIONS "http-max-connections"
+/** @since New in 1.9. */
+#define SVN_CONFIG_OPTION_HTTP_CHUNKED_REQUESTS "http-chunked-requests"
+
+/** @since New in 1.9. */
+#define SVN_CONFIG_OPTION_SERF_LOG_COMPONENTS "serf-log-components"
+/** @since New in 1.9. */
+#define SVN_CONFIG_OPTION_SERF_LOG_LEVEL "serf-log-level"
+
#define SVN_CONFIG_CATEGORY_CONFIG "config"
#define SVN_CONFIG_SECTION_AUTH "auth"
@@ -123,6 +131,8 @@ typedef struct svn_config_t svn_config_t;
/** @deprecated Not used by Subversion since 2003/r847039 (well before 1.0) */
#define SVN_CONFIG_OPTION_TEMPLATE_ROOT "template-root"
#define SVN_CONFIG_OPTION_ENABLE_AUTO_PROPS "enable-auto-props"
+/** @since New in 1.9. */
+#define SVN_CONFIG_OPTION_ENABLE_MAGIC_FILE "enable-magic-file"
#define SVN_CONFIG_OPTION_NO_UNLOCK "no-unlock"
#define SVN_CONFIG_OPTION_MIMETYPES_FILE "mime-types-file"
#define SVN_CONFIG_OPTION_PRESERVED_CF_EXTS "preserved-conflict-file-exts"
@@ -130,6 +140,8 @@ typedef struct svn_config_t svn_config_t;
#define SVN_CONFIG_OPTION_INTERACTIVE_CONFLICTS "interactive-conflicts"
/** @since New in 1.7. */
#define SVN_CONFIG_OPTION_MEMORY_CACHE_SIZE "memory-cache-size"
+/** @since New in 1.9. */
+#define SVN_CONFIG_OPTION_DIFF_IGNORE_CONTENT_TYPE "diff-ignore-content-type"
#define SVN_CONFIG_SECTION_TUNNELS "tunnels"
#define SVN_CONFIG_SECTION_AUTO_PROPS "auto-props"
/** @since New in 1.8. */
@@ -138,6 +150,8 @@ typedef struct svn_config_t svn_config_t;
#define SVN_CONFIG_OPTION_SQLITE_EXCLUSIVE "exclusive-locking"
/** @since New in 1.8. */
#define SVN_CONFIG_OPTION_SQLITE_EXCLUSIVE_CLIENTS "exclusive-locking-clients"
+/** @since New in 1.9. */
+#define SVN_CONFIG_OPTION_SQLITE_BUSY_TIMEOUT "busy-timeout"
/** @} */
/** @name Repository conf directory configuration files strings
@@ -177,7 +191,7 @@ typedef struct svn_config_t svn_config_t;
#define SVN_CONFIG__DEFAULT_GLOBAL_IGNORES_LINE_1 \
"*.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo __pycache__"
#define SVN_CONFIG__DEFAULT_GLOBAL_IGNORES_LINE_2 \
- "*.rej *~ #*# .#* .*.swp .DS_Store"
+ "*.rej *~ #*# .#* .*.swp .DS_Store [Tt]humbs.db"
#endif
#define SVN_CONFIG_DEFAULT_GLOBAL_IGNORES \
@@ -659,11 +673,67 @@ svn_config_ensure(const char *config_dir,
*/
-/** A hash-key pointing to a realmstring. Every file containing
- * authentication data should have this key.
+/**
+ * Attributes of authentication credentials.
+ *
+ * The values of these keys are C strings.
+ *
+ * @note Some of these hash keys were also used in versions < 1.9 but were
+ * not part of the public API (except #SVN_CONFIG_REALMSTRING_KEY which
+ * has been present since 1.0).
+ *
+ * @defgroup cached_authentication_data_attributes Cached authentication data attributes
+ * @{
+ */
+
+/** A hash-key pointing to a realmstring. This attribute is mandatory.
+ *
+ * @since New in 1.0.
*/
#define SVN_CONFIG_REALMSTRING_KEY "svn:realmstring"
+/** A hash-key for usernames.
+ * @since New in 1.9.
+ */
+#define SVN_CONFIG_AUTHN_USERNAME_KEY "username"
+
+/** A hash-key for passwords.
+ * The password may be in plaintext or encrypted form, depending on
+ * the authentication provider.
+ * @since New in 1.9.
+ */
+#define SVN_CONFIG_AUTHN_PASSWORD_KEY "password"
+
+/** A hash-key for passphrases,
+ * such as SSL client ceritifcate passphrases. The passphrase may be in
+ * plaintext or encrypted form, depending on the authentication provider.
+ * @since New in 1.9.
+ */
+#define SVN_CONFIG_AUTHN_PASSPHRASE_KEY "passphrase"
+
+/** A hash-key for the type of a password or passphrase. The type
+ * indicates which provider owns the credential.
+ * @since New in 1.9.
+ */
+#define SVN_CONFIG_AUTHN_PASSTYPE_KEY "passtype"
+
+/** A hash-key for SSL certificates. The value is the base64-encoded DER form
+ * certificate.
+ * @since New in 1.9.
+ * @note The value is not human readable.
+ */
+#define SVN_CONFIG_AUTHN_ASCII_CERT_KEY "ascii_cert"
+
+/** A hash-key for recorded SSL certificate verification
+ * failures. Failures encoded as an ASCII integer containing any of the
+ * SVN_AUTH_SSL_* SSL server certificate failure bits defined in svn_auth.h.
+ * @since New in 1.9.
+ */
+#define SVN_CONFIG_AUTHN_FAILURES_KEY "failures"
+
+
+/** @} */
+
/** Use @a cred_kind and @a realmstring to locate a file within the
* ~/.subversion/auth/ area. If the file exists, initialize @a *hash
* and load the file contents into the hash, using @a pool. If the
@@ -712,7 +782,8 @@ svn_config_write_auth_data(apr_hash_t *hash,
* fully purged) to allow perusal and selective removal of credentials.
*
* @a cred_kind and @a realmstring specify the key of the credential.
- * @a hash contains the hash data associated with the record.
+ * @a hash contains the hash data associated with the record. @a walk_baton
+ * is the baton passed to svn_config_walk_auth_data().
*
* Before returning set @a *delete_cred to TRUE to remove the credential from
* the cache; leave @a *delete_cred unchanged or set it to FALSE to keep the
@@ -728,7 +799,7 @@ svn_config_write_auth_data(apr_hash_t *hash,
*/
typedef svn_error_t *
(*svn_config_auth_walk_func_t)(svn_boolean_t *delete_cred,
- void *cleanup_baton,
+ void *walk_baton,
const char *cred_kind,
const char *realmstring,
apr_hash_t *hash,
@@ -747,7 +818,7 @@ typedef svn_error_t *
*
* @note Removing credentials from the config-based disk store will
* not purge them from any open svn_auth_baton_t instance. Consider
- * using svn_auth_forget_credentials() -- from the @a cleanup_func,
+ * using svn_auth_forget_credentials() -- from the @a walk_func,
* even -- for this purpose.
*
* @note Removing credentials from the config-based disk store will
@@ -799,7 +870,7 @@ svn_config_get_user_config_path(const char **path,
*/
svn_error_t *
svn_config_dup(svn_config_t **cfgp,
- svn_config_t *src,
+ const svn_config_t *src,
apr_pool_t *pool);
/** Create a deep copy of the config hash @a src_hash and return
diff --git a/subversion/include/svn_delta.h b/subversion/include/svn_delta.h
index 7df7f3f5fed7..d949ced66b8b 100644
--- a/subversion/include/svn_delta.h
+++ b/subversion/include/svn_delta.h
@@ -249,6 +249,7 @@ svn_txdelta_compose_windows(const svn_txdelta_window_t *window_A,
*
* @since New in 1.4
*
+ * @since Since 1.9, @a tbuf may be NULL if @a *tlen is 0.
*/
void
svn_txdelta_apply_instructions(svn_txdelta_window_t *window,
@@ -545,10 +546,26 @@ svn_txdelta_to_svndiff(svn_stream_t *output,
/** Return a writable generic stream which will parse svndiff-format
* data into a text delta, invoking @a handler with @a handler_baton
- * whenever a new window is ready. If @a error_on_early_close is @c
- * TRUE, attempting to close this stream before it has handled the entire
- * svndiff data set will result in #SVN_ERR_SVNDIFF_UNEXPECTED_END,
- * else this error condition will be ignored.
+ * whenever a new window is ready.
+ *
+ * When the caller closes this stream, this will signal completion to
+ * the window handler by invoking @a handler once more, passing zero for
+ * the @c window argument.
+ *
+ * If @a error_on_early_close is @c TRUE, then attempt to avoid
+ * signaling completion to the window handler if the delta was
+ * incomplete. Specifically, attempting to close the stream will be
+ * successful only if the data written to the stream consisted of one or
+ * more complete windows of svndiff data and no extra bytes. Otherwise,
+ * closing the stream will not signal completion to the window handler,
+ * and will return a #SVN_ERR_SVNDIFF_UNEXPECTED_END error. Note that if
+ * no data at all was written, the delta is considered incomplete.
+ *
+ * If @a error_on_early_close is @c FALSE, closing the stream will
+ * signal completion to the window handler, regardless of how much data
+ * was written, and discard any pending incomplete data.
+ *
+ * Allocate the stream in @a pool.
*/
svn_stream_t *
svn_txdelta_parse_svndiff(svn_txdelta_window_handler_t handler,
diff --git a/subversion/include/svn_diff.h b/subversion/include/svn_diff.h
index ac9f8fcb4db4..5b8f8d7fc9f2 100644
--- a/subversion/include/svn_diff.h
+++ b/subversion/include/svn_diff.h
@@ -55,6 +55,7 @@
#include "svn_types.h"
#include "svn_io.h" /* for svn_stream_t */
#include "svn_string.h"
+#include "svn_mergeinfo.h"
#ifdef __cplusplus
extern "C" {
@@ -402,12 +403,32 @@ typedef enum svn_diff_conflict_display_style_t
/** Like svn_diff_conflict_display_modified_original_latest, but
*only* showing conflicts. */
svn_diff_conflict_display_only_conflicts
+
+ /* IMPORTANT: If you extend this enum note that it is mapped in
+ tools/diff/diff3.c. */
} svn_diff_conflict_display_style_t;
/** Given a vtable of @a output_fns/@a output_baton for consuming
* differences, output the differences in @a diff.
+ *
+ * If not @c NULL, call @a cancel_func with @a cancel_baton once or multiple
+ * times while processing larger diffs.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_diff_output2(svn_diff_t *diff,
+ void *output_baton,
+ const svn_diff_output_fns_t *output_fns,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton);
+
+/** Similar to svn_diff_output2(), but without cancel support.
+ *
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
*/
+SVN_DEPRECATED
svn_error_t *
svn_diff_output(svn_diff_t *diff,
void *output_baton,
@@ -457,8 +478,15 @@ typedef struct svn_diff_file_options_t
* of the nearest preceding line that starts with a character that might be
* the initial character of a C language identifier. The default is
* @c FALSE.
+ * @since New in 1.5.
*/
svn_boolean_t show_c_function;
+
+ /** The number of context lines produced above and below modifications, if
+ * available. The number of context lines must be >= 0.
+ *
+ * @since New in 1.9 */
+ int context_size;
} svn_diff_file_options_t;
/** Allocate a @c svn_diff_file_options_t structure in @a pool, initializing
@@ -481,6 +509,7 @@ svn_diff_file_options_create(apr_pool_t *pool);
* - --ignore-all-space, -w
* - --ignore-eol-style
* - --show-c-function, -p @since New in 1.5.
+ * - --context, -U ARG @since New in 1.9.
* - --unified, -u (for compatibility, does nothing).
*/
svn_error_t *
@@ -585,8 +614,6 @@ svn_diff_file_diff4(svn_diff_t **diff,
/** A convenience function to produce unified diff output from the
* diff generated by svn_diff_file_diff().
*
- * @since New in 1.5.
- *
* Output a @a diff between @a original_path and @a modified_path in unified
* context diff format to @a output_stream. Optionally supply
* @a original_header and/or @a modified_header to be displayed in the header
@@ -599,7 +626,38 @@ svn_diff_file_diff4(svn_diff_t **diff,
* @a relative_to_dir is not @c NULL but @a relative_to_dir is not a parent
* path of the target, an error is returned. Finally, if @a relative_to_dir
* is a URL, an error will be returned.
+ *
+ * If @a context_size is not negative, then this number of context lines
+ * will be used in the generated diff output. Otherwise the legacy compile
+ * time default will be used.
+ *
+ * If not @c NULL, call @a cancel_func with @a cancel_baton once or multiple
+ * times while processing larger diffs.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_diff_file_output_unified4(svn_stream_t *output_stream,
+ svn_diff_t *diff,
+ const char *original_path,
+ const char *modified_path,
+ const char *original_header,
+ const char *modified_header,
+ const char *header_encoding,
+ const char *relative_to_dir,
+ svn_boolean_t show_c_function,
+ int context_size,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+/** Similar to svn_diff_file_output_unified4(), but without cancel
+ * support and with @a context_size set to -1.
+ *
+ * @since New in 1.5.
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
*/
+SVN_DEPRECATED
svn_error_t *
svn_diff_file_output_unified3(svn_stream_t *output_stream,
svn_diff_t *diff,
@@ -653,10 +711,36 @@ svn_diff_file_output_unified(svn_stream_t *output_stream,
* @a conflict_latest to be displayed as conflict markers in the output.
* If @a conflict_original, @a conflict_modified, @a conflict_latest and/or
* @a conflict_separator is @c NULL, a default marker will be displayed.
- * @a conflict_style dictates how conflicts are displayed.
+ * @a conflict_style dictates how conflicts are displayed.
+ * Uses @a scratch_pool for temporary allocations.
+ *
+ * If not @c NULL, call @a cancel_func with @a cancel_baton once or multiple
+ * times while processing larger diffs.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_diff_file_output_merge3(svn_stream_t *output_stream,
+ svn_diff_t *diff,
+ const char *original_path,
+ const char *modified_path,
+ const char *latest_path,
+ const char *conflict_original,
+ const char *conflict_modified,
+ const char *conflict_latest,
+ const char *conflict_separator,
+ svn_diff_conflict_display_style_t conflict_style,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+/** Similar to svn_diff_file_output_merge3, but without cancel support.
*
* @since New in 1.6.
+ *
+ * @deprecated Provided for backward compatibility with the 1.8 API.
*/
+SVN_DEPRECATED
svn_error_t *
svn_diff_file_output_merge2(svn_stream_t *output_stream,
svn_diff_t *diff,
@@ -700,7 +784,28 @@ svn_diff_file_output_merge(svn_stream_t *output_stream,
svn_boolean_t display_resolved_conflicts,
apr_pool_t *pool);
-
+/** Creates a git-like binary diff hunk describing the differences between
+ * @a original and @a latest. It does this by either producing either the
+ * literal content of both versions in a compressed format, or by describing
+ * one way transforms.
+ *
+ * Either @a original or @a latest may be NULL to describe that the version
+ * didn't exist.
+ *
+ * Writes the output to @a output_stream.
+ *
+ * If not @c NULL, call @a cancel_func with @a cancel_baton once or multiple
+ * times while processing larger diffs.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_diff_output_binary(svn_stream_t *output_stream,
+ svn_stream_t *original,
+ svn_stream_t *latest,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
/* Diffs on in-memory structures */
@@ -762,8 +867,40 @@ svn_diff_mem_string_diff4(svn_diff_t **diff,
* final line use the text "\ No newline at end of property" instead of
* "\ No newline at end of file".
*
+ * If @a context_size is not negative, then this number of context lines
+ * will be used in the generated diff output. Otherwise the legacy compile
+ * time default will be used.
+ *
+ * If not @c NULL, call @a cancel_func with @a cancel_baton once or multiple
+ * times while processing larger diffs.
+ *
+ * Uses @a scratch_pool for temporary allocations.
+ *
+ * @since New in 1.9
+ */
+svn_error_t *
+svn_diff_mem_string_output_unified3(svn_stream_t *output_stream,
+ svn_diff_t *diff,
+ svn_boolean_t with_diff_header,
+ const char *hunk_delimiter,
+ const char *original_header,
+ const char *modified_header,
+ const char *header_encoding,
+ const svn_string_t *original,
+ const svn_string_t *modified,
+ int context_size,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+/** Similar to svn_diff_mem_string_output_unified3() but without
+ * cancel support and with @a context_size set to -1.
+ *
* @since New in 1.7. Hunk delimiter "##" has the special meaning since 1.8.
+ *
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
*/
+SVN_DEPRECATED
svn_error_t *
svn_diff_mem_string_output_unified2(svn_stream_t *output_stream,
svn_diff_t *diff,
@@ -781,7 +918,10 @@ svn_diff_mem_string_output_unified2(svn_stream_t *output_stream,
* set to NULL.
*
* @since New in 1.5.
+ *
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
*/
+SVN_DEPRECATED
svn_error_t *
svn_diff_mem_string_output_unified(svn_stream_t *output_stream,
svn_diff_t *diff,
@@ -802,8 +942,35 @@ svn_diff_mem_string_output_unified(svn_stream_t *output_stream,
*
* @a conflict_style dictates how conflicts are displayed.
*
+ * If not @c NULL, call @a cancel_func with @a cancel_baton once or multiple
+ * times while processing larger diffs.
+ *
+ * Uses @a scratch_pool for temporary allocations.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_diff_mem_string_output_merge3(svn_stream_t *output_stream,
+ svn_diff_t *diff,
+ const svn_string_t *original,
+ const svn_string_t *modified,
+ const svn_string_t *latest,
+ const char *conflict_original,
+ const char *conflict_modified,
+ const char *conflict_latest,
+ const char *conflict_separator,
+ svn_diff_conflict_display_style_t style,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+/** Similar to svn_diff_mem_string_output_merge2(), but without cancel support.
+ *
* @since New in 1.6.
+ *
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
*/
+SVN_DEPRECATED
svn_error_t *
svn_diff_mem_string_output_merge2(svn_stream_t *output_stream,
svn_diff_t *diff,
@@ -912,7 +1079,7 @@ typedef struct svn_diff_hunk_t svn_diff_hunk_t;
/**
* Allocate @a *stringbuf in @a result_pool, and read into it one line
* of the diff text of @a hunk. The hunk header is not returned only the
- * unidiff data lines (starting with '+', '-', or ' ') are returned.
+ * unidiff data lines (starting with '+', '-', or ' ') are returned.
* If the @a hunk is being interpreted in reverse (i.e. the reverse
* parameter of svn_diff_parse_next_patch() was @c TRUE), the diff
* text will be returned in reversed form.
@@ -922,8 +1089,8 @@ typedef struct svn_diff_hunk_t svn_diff_hunk_t;
* hunk does not end with a newline character and @a eol is not NULL.
* Temporary allocations will be performed in @a scratch_pool.
*
- * @note The hunk header information can be retrievied with the following
- * functions:
+ * @note The hunk header information can be retrieved with the following
+ * functions:
* @see svn_diff_hunk_get_original_start()
* @see svn_diff_hunk_get_original_length()
* @see svn_diff_hunk_get_modified_start()
@@ -1074,6 +1241,14 @@ typedef struct svn_patch_t {
/**
* Indicates whether the patch is being interpreted in reverse. */
svn_boolean_t reverse;
+
+ /**
+ * Mergeinfo parsed from svn:mergeinfo diff data, with one entry for
+ * forward merges and one for reverse merges.
+ * Either entry can be @c NULL if no such merges are part of the diff.
+ * @since New in 1.9. */
+ svn_mergeinfo_t mergeinfo;
+ svn_mergeinfo_t reverse_mergeinfo;
} svn_patch_t;
/** An opaque type representing an open patch file.
diff --git a/subversion/include/svn_dirent_uri.h b/subversion/include/svn_dirent_uri.h
index c4374d7a32aa..94856f2295e6 100644
--- a/subversion/include/svn_dirent_uri.h
+++ b/subversion/include/svn_dirent_uri.h
@@ -202,7 +202,7 @@ svn_dirent_join(const char *base,
apr_pool_t *result_pool);
/** Join multiple components onto a @a base dirent. The components are
- * terminated by a @c NULL.
+ * terminated by a @c SVN_VA_NULL.
*
* If any component is the empty string, it will be ignored.
*
@@ -218,7 +218,7 @@ svn_dirent_join(const char *base,
char *
svn_dirent_join_many(apr_pool_t *result_pool,
const char *base,
- ...);
+ ...) SVN_NEEDS_SENTINEL_NULL;
/** Join a base relpath (@a base) with a component (@a component).
* @a component need not be a single component.
@@ -354,6 +354,19 @@ char *
svn_relpath_dirname(const char *relpath,
apr_pool_t *result_pool);
+/** Return a maximum of @a max_components components of @a relpath. This is
+ * an efficient way of calling svn_relpath_dirname() multiple times until only
+ * a specific number of components is left.
+ *
+ * Allocate the result in @a result_pool (or statically in case of 0)
+ *
+ * @since New in 1.9.
+ */
+const char *
+svn_relpath_prefix(const char *relpath,
+ int max_components,
+ apr_pool_t *result_pool);
+
/** Divide the canonicalized @a uri into a uri @a *dirpath and a
* (URI-decoded) relpath @a *base_name.
diff --git a/subversion/include/svn_error.h b/subversion/include/svn_error.h
index 3a6e4c5ac2ac..5681644fd194 100644
--- a/subversion/include/svn_error.h
+++ b/subversion/include/svn_error.h
@@ -105,7 +105,7 @@ svn_error_symbolic_name(apr_status_t statcode);
* @note @a buf and @a bufsize are provided in the interface so that
* this function is thread-safe and yet does no allocation.
*/
-const char *svn_err_best_message(svn_error_t *err,
+const char *svn_err_best_message(const svn_error_t *err,
char *buf,
apr_size_t bufsize);
@@ -173,6 +173,19 @@ svn_error_t *
svn_error_quick_wrap(svn_error_t *child,
const char *new_msg);
+/** A quick n' easy way to create a wrapped exception with your own
+ * printf-style error message produced by passing @a fmt, using
+ * apr_psprintf(), before throwing it up the stack. (It uses all of the
+ * @a child's fields.)
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_error_quick_wrapf(svn_error_t *child,
+ const char *fmt,
+ ...)
+ __attribute__((format(printf, 2, 3)));
+
/** Compose two errors, returning the composition as a brand new error
* and consuming the original errors. Either or both of @a err1 and
* @a err2 may be @c SVN_NO_ERROR. If both are not @c SVN_NO_ERROR,
@@ -202,7 +215,8 @@ svn_error_compose(svn_error_t *chain,
/** Return the root cause of @a err by finding the last error in its
* chain (e.g. it or its children). @a err may be @c SVN_NO_ERROR, in
- * which case @c SVN_NO_ERROR is returned.
+ * which case @c SVN_NO_ERROR is returned. The returned error should
+ * @em not be cleared as it shares memory with @a err.
*
* @since New in 1.5.
*/
@@ -225,7 +239,7 @@ svn_error_find_cause(svn_error_t *err, apr_status_t apr_err);
* @since New in 1.2.
*/
svn_error_t *
-svn_error_dup(svn_error_t *err);
+svn_error_dup(const svn_error_t *err);
/** Free the memory used by @a error, as well as all ancestors and
* descendants of @a error.
@@ -255,6 +269,8 @@ svn_error__locate(const char *file,
(svn_error__locate(__FILE__,__LINE__), (svn_error_wrap_apr))
#define svn_error_quick_wrap \
(svn_error__locate(__FILE__,__LINE__), (svn_error_quick_wrap))
+#define svn_error_quick_wrapf \
+ (svn_error__locate(__FILE__,__LINE__), (svn_error_quick_wrapf))
#endif
@@ -268,6 +284,10 @@ svn_error__locate(const char *file,
* what code that used to call svn_handle_error() and now calls
* svn_handle_error2() does.
*
+ * Note that this should only be used from commandline specific code, or
+ * code that knows that @a stream is really where the application wants
+ * to receive its errors on.
+ *
* @since New in 1.2.
*/
void
@@ -293,11 +313,13 @@ svn_handle_error(svn_error_t *error,
*
* @a error may not be @c NULL.
*
+ * @note This does not clear @a error.
+ *
* @since New in 1.2.
*/
void
svn_handle_warning2(FILE *stream,
- svn_error_t *error,
+ const svn_error_t *error,
const char *prefix);
/** Like svn_handle_warning2() but with @c prefix set to "svn: "
@@ -387,10 +409,17 @@ svn_error_t *svn_error_purge_tracing(svn_error_t *err);
} while (0)
-/** A statement macro, similar to @c SVN_ERR, but returns an integer.
+/** A statement macro intended for the main() function of the 'svn' program.
+ *
+ * Evaluate @a expr. If it yields an error, display the error on stdout
+ * and return @c EXIT_FAILURE.
*
- * Evaluate @a expr. If it yields an error, handle that error and
- * return @c EXIT_FAILURE.
+ * @note Not for use in the library, as it prints to stderr. This macro
+ * no longer suits the needs of the 'svn' program, and is not generally
+ * suitable for third-party use as it assumes the program name is 'svn'.
+ *
+ * @deprecated Provided for backward compatibility with the 1.8 API. Consider
+ * using svn_handle_error2() or svn_cmdline_handle_exit_error() instead.
*/
#define SVN_INT_ERR(expr) \
do { \
@@ -417,18 +446,26 @@ svn_error_t *svn_error_purge_tracing(svn_error_t *err);
* SVN_ERR_FS_OUT_OF_DATE and SVN_ERR_FS_NOT_FOUND are in here because it's a
* non-fatal error that can be thrown when attempting to lock an item.
*
+ * SVN_ERR_REPOS_HOOK_FAILURE refers to the pre-lock hook.
+ *
* @since New in 1.2.
*/
#define SVN_ERR_IS_LOCK_ERROR(err) \
(err->apr_err == SVN_ERR_FS_PATH_ALREADY_LOCKED || \
err->apr_err == SVN_ERR_FS_NOT_FOUND || \
err->apr_err == SVN_ERR_FS_OUT_OF_DATE || \
- err->apr_err == SVN_ERR_FS_BAD_LOCK_TOKEN)
+ err->apr_err == SVN_ERR_FS_BAD_LOCK_TOKEN || \
+ err->apr_err == SVN_ERR_REPOS_HOOK_FAILURE || \
+ err->apr_err == SVN_ERR_FS_NO_SUCH_REVISION || \
+ err->apr_err == SVN_ERR_FS_OUT_OF_DATE || \
+ err->apr_err == SVN_ERR_FS_NOT_FILE)
/**
* Return TRUE if @a err is an error specifically related to unlocking
* a path in the repository, FALSE otherwise.
*
+ * SVN_ERR_REPOS_HOOK_FAILURE refers to the pre-unlock hook.
+ *
* @since New in 1.2.
*/
#define SVN_ERR_IS_UNLOCK_ERROR(err) \
@@ -437,7 +474,8 @@ svn_error_t *svn_error_purge_tracing(svn_error_t *err);
err->apr_err == SVN_ERR_FS_LOCK_OWNER_MISMATCH || \
err->apr_err == SVN_ERR_FS_NO_SUCH_LOCK || \
err->apr_err == SVN_ERR_RA_NOT_LOCKED || \
- err->apr_err == SVN_ERR_FS_LOCK_EXPIRED)
+ err->apr_err == SVN_ERR_FS_LOCK_EXPIRED || \
+ err->apr_err == SVN_ERR_REPOS_HOOK_FAILURE)
/** Evaluates to @c TRUE iff @a apr_err (of type apr_status_t) is in the given
* @a category, which should be one of the @c SVN_ERR_*_CATEGORY_START
@@ -626,6 +664,11 @@ typedef svn_error_t *(*svn_error_malfunction_handler_t)
svn_error_malfunction_handler_t
svn_error_set_malfunction_handler(svn_error_malfunction_handler_t func);
+/** Return the malfunction handler that is currently in effect.
+ * @since New in 1.9. */
+svn_error_malfunction_handler_t
+svn_error_get_malfunction_handler(void);
+
/** Handle a malfunction by returning an error object that describes it.
*
* When @a can_return is false, abort()
diff --git a/subversion/include/svn_error_codes.h b/subversion/include/svn_error_codes.h
index 222bc2bbbeef..f8348f48dec9 100644
--- a/subversion/include/svn_error_codes.h
+++ b/subversion/include/svn_error_codes.h
@@ -150,6 +150,8 @@ extern "C" {
+ (22 * SVN_ERR_CATEGORY_SIZE))
#define SVN_ERR_MALFUNC_CATEGORY_START (APR_OS_START_USERERR \
+ (23 * SVN_ERR_CATEGORY_SIZE))
+#define SVN_ERR_X509_CATEGORY_START (APR_OS_START_USERERR \
+ + (24 * SVN_ERR_CATEGORY_SIZE))
#endif /* DOXYGEN_SHOULD_SKIP_THIS */
@@ -233,6 +235,11 @@ SVN_ERROR_START
SVN_ERR_BAD_CATEGORY_START + 15,
"Invalid atomic")
+ /** @since New in 1.9. */
+ SVN_ERRDEF(SVN_ERR_BAD_COMPRESSION_METHOD,
+ SVN_ERR_BAD_CATEGORY_START + 16,
+ "Invalid compression method")
+
/* xml errors */
SVN_ERRDEF(SVN_ERR_XML_ATTRIB_NOT_FOUND,
@@ -255,6 +262,11 @@ SVN_ERROR_START
SVN_ERR_XML_CATEGORY_START + 4,
"Data cannot be safely XML-escaped")
+ /** @since New in 1.9. */
+ SVN_ERRDEF(SVN_ERR_XML_UNEXPECTED_ELEMENT,
+ SVN_ERR_XML_CATEGORY_START + 5,
+ "Unexpected XML element found")
+
/* io errors */
SVN_ERRDEF(SVN_ERR_IO_INCONSISTENT_EOL,
@@ -312,6 +324,11 @@ SVN_ERROR_START
SVN_ERR_STREAM_CATEGORY_START + 3,
"Stream doesn't support seeking")
+ /** Since New in 1.9. */
+ SVN_ERRDEF(SVN_ERR_STREAM_NOT_SUPPORTED,
+ SVN_ERR_STREAM_CATEGORY_START + 4,
+ "Stream doesn't support this capability")
+
/* node errors */
SVN_ERRDEF(SVN_ERR_NODE_UNKNOWN_KIND,
@@ -796,6 +813,61 @@ SVN_ERROR_START
SVN_ERR_FS_CATEGORY_START + 52,
"Could not initialize the revprop caching infrastructure.")
+ /** @since New in 1.9. */
+ SVN_ERRDEF(SVN_ERR_FS_MALFORMED_TXN_ID,
+ SVN_ERR_FS_CATEGORY_START + 53,
+ "Malformed transaction ID string.")
+
+ /** @since New in 1.9. */
+ SVN_ERRDEF(SVN_ERR_FS_INDEX_CORRUPTION,
+ SVN_ERR_FS_CATEGORY_START + 54,
+ "Corrupt index file.")
+
+ /** @since New in 1.9. */
+ SVN_ERRDEF(SVN_ERR_FS_INDEX_REVISION,
+ SVN_ERR_FS_CATEGORY_START + 55,
+ "Revision not covered by index.")
+
+ /** @since New in 1.9. */
+ SVN_ERRDEF(SVN_ERR_FS_INDEX_OVERFLOW,
+ SVN_ERR_FS_CATEGORY_START + 56,
+ "Item index too large for this revision.")
+
+ /** @since New in 1.9. */
+ SVN_ERRDEF(SVN_ERR_FS_CONTAINER_INDEX,
+ SVN_ERR_FS_CATEGORY_START + 57,
+ "Container index out of range.")
+
+ /** @since New in 1.9. */
+ SVN_ERRDEF(SVN_ERR_FS_INDEX_INCONSISTENT,
+ SVN_ERR_FS_CATEGORY_START + 58,
+ "Index files are inconsistent.")
+
+ /** @since New in 1.9. */
+ SVN_ERRDEF(SVN_ERR_FS_LOCK_OPERATION_FAILED,
+ SVN_ERR_FS_CATEGORY_START + 59,
+ "Lock operation failed")
+
+ /** @since New in 1.9. */
+ SVN_ERRDEF(SVN_ERR_FS_UNSUPPORTED_TYPE,
+ SVN_ERR_FS_CATEGORY_START + 60,
+ "Unsupported FS type")
+
+ /** @since New in 1.9. */
+ SVN_ERRDEF(SVN_ERR_FS_CONTAINER_SIZE,
+ SVN_ERR_FS_CATEGORY_START + 61,
+ "Container capacity exceeded.")
+
+ /** @since New in 1.9. */
+ SVN_ERRDEF(SVN_ERR_FS_MALFORMED_NODEREV_ID,
+ SVN_ERR_FS_CATEGORY_START + 62,
+ "Malformed node revision ID string.")
+
+ /** @since New in 1.9. */
+ SVN_ERRDEF(SVN_ERR_FS_INVALID_GENERATION,
+ SVN_ERR_FS_CATEGORY_START + 63,
+ "Invalid generation number data.")
+
/* repos errors */
SVN_ERRDEF(SVN_ERR_REPOS_LOCKED,
@@ -910,6 +982,11 @@ SVN_ERROR_START
SVN_ERR_RA_CATEGORY_START + 12,
"Can't create tunnel")
+ /** @since New in 1.9. */
+ SVN_ERRDEF(SVN_ERR_RA_CANNOT_CREATE_SESSION,
+ SVN_ERR_RA_CATEGORY_START + 13,
+ "Can't create session")
+
/* ra_dav errors */
SVN_ERRDEF(SVN_ERR_RA_DAV_SOCK_INIT,
@@ -979,6 +1056,16 @@ SVN_ERROR_START
SVN_ERR_RA_DAV_CATEGORY_START + 13,
"URL access forbidden for unknown reason")
+ /** @since New in 1.9 */
+ SVN_ERRDEF(SVN_ERR_RA_DAV_PRECONDITION_FAILED,
+ SVN_ERR_RA_DAV_CATEGORY_START + 14,
+ "The server state conflicts with the requested preconditions")
+
+ /** @since New in 1.9 */
+ SVN_ERRDEF(SVN_ERR_RA_DAV_METHOD_NOT_ALLOWED,
+ SVN_ERR_RA_DAV_CATEGORY_START + 15,
+ "The URL doesn't allow the requested method")
+
/* ra_local errors */
SVN_ERRDEF(SVN_ERR_RA_LOCAL_REPOS_NOT_FOUND,
@@ -1330,6 +1417,31 @@ SVN_ERROR_START
SVN_ERR_MISC_CATEGORY_START + 38,
"Atomic data storage is corrupt")
+ /** @since New in 1.8. */
+ SVN_ERRDEF(SVN_ERR_UTF8PROC_ERROR,
+ SVN_ERR_MISC_CATEGORY_START + 39,
+ "utf8proc library error")
+
+ /** @since New in 1.8. */
+ SVN_ERRDEF(SVN_ERR_UTF8_GLOB,
+ SVN_ERR_MISC_CATEGORY_START + 40,
+ "Bad arguments to SQL operators GLOB or LIKE")
+
+ /** @since New in 1.9. */
+ SVN_ERRDEF(SVN_ERR_CORRUPT_PACKED_DATA,
+ SVN_ERR_MISC_CATEGORY_START + 41,
+ "Packed data stream is corrupt")
+
+ /** @since New in 1.9. */
+ SVN_ERRDEF(SVN_ERR_COMPOSED_ERROR,
+ SVN_ERR_MISC_CATEGORY_START + 42,
+ "Additional errors:")
+
+ /** @since New in 1.9. */
+ SVN_ERRDEF(SVN_ERR_INVALID_INPUT,
+ SVN_ERR_MISC_CATEGORY_START + 43,
+ "Parser error: invalid input")
+
/* command-line client errors */
SVN_ERRDEF(SVN_ERR_CL_ARG_PARSING_ERROR,
@@ -1380,6 +1492,11 @@ SVN_ERROR_START
SVN_ERR_CL_CATEGORY_START + 11,
"Failed processing one or more externals definitions")
+ /** @since New in 1.9. */
+ SVN_ERRDEF(SVN_ERR_CL_REPOS_VERIFY_FAILED,
+ SVN_ERR_CL_CATEGORY_START + 12,
+ "Repository verification failed")
+
/* ra_svn errors */
SVN_ERRDEF(SVN_ERR_RA_SVN_CMD_ERR,
@@ -1478,11 +1595,14 @@ SVN_ERROR_START
"Diff data source modified unexpectedly")
/* libsvn_ra_serf errors */
- /** @since New in 1.5. */
+ /** @since New in 1.5.
+ @deprecated SSPI now handled by serf rather than libsvn_ra_serf. */
SVN_ERRDEF(SVN_ERR_RA_SERF_SSPI_INITIALISATION_FAILED,
SVN_ERR_RA_SERF_CATEGORY_START + 0,
"Initialization of SSPI library failed")
- /** @since New in 1.5. */
+ /** @since New in 1.5.
+ @deprecated Certificate verification now handled by serf rather
+ than libsvn_ra_serf. */
SVN_ERRDEF(SVN_ERR_RA_SERF_SSL_CERT_UNTRUSTED,
SVN_ERR_RA_SERF_CATEGORY_START + 1,
"Server SSL certificate untrusted")
@@ -1507,6 +1627,90 @@ SVN_ERROR_START
SVN_ERR_MALFUNC_CATEGORY_START + 1,
"No non-tracing links found in the error chain")
+ /* X509 parser errors.
+ * Names of these error codes are based on tropicssl error codes.
+ * @since New in 1.9 */
+
+ SVN_ERRDEF(SVN_ERR_ASN1_OUT_OF_DATA,
+ SVN_ERR_X509_CATEGORY_START + 0,
+ "Unexpected end of ASN1 data")
+
+ SVN_ERRDEF(SVN_ERR_ASN1_UNEXPECTED_TAG,
+ SVN_ERR_X509_CATEGORY_START + 1,
+ "Unexpected ASN1 tag")
+
+ SVN_ERRDEF(SVN_ERR_ASN1_INVALID_LENGTH,
+ SVN_ERR_X509_CATEGORY_START + 2,
+ "Invalid ASN1 length")
+
+ SVN_ERRDEF(SVN_ERR_ASN1_LENGTH_MISMATCH,
+ SVN_ERR_X509_CATEGORY_START + 3,
+ "ASN1 length mismatch")
+
+ SVN_ERRDEF(SVN_ERR_ASN1_INVALID_DATA,
+ SVN_ERR_X509_CATEGORY_START + 4,
+ "Invalid ASN1 data")
+
+ SVN_ERRDEF(SVN_ERR_X509_FEATURE_UNAVAILABLE,
+ SVN_ERR_X509_CATEGORY_START + 5,
+ "Unavailable X509 feature")
+
+ SVN_ERRDEF(SVN_ERR_X509_CERT_INVALID_PEM,
+ SVN_ERR_X509_CATEGORY_START + 6,
+ "Invalid PEM certificate")
+
+ SVN_ERRDEF(SVN_ERR_X509_CERT_INVALID_FORMAT,
+ SVN_ERR_X509_CATEGORY_START + 7,
+ "Invalid certificate format")
+
+ SVN_ERRDEF(SVN_ERR_X509_CERT_INVALID_VERSION,
+ SVN_ERR_X509_CATEGORY_START + 8,
+ "Invalid certificate version")
+
+ SVN_ERRDEF(SVN_ERR_X509_CERT_INVALID_SERIAL,
+ SVN_ERR_X509_CATEGORY_START + 9,
+ "Invalid certificate serial number")
+
+ SVN_ERRDEF(SVN_ERR_X509_CERT_INVALID_ALG,
+ SVN_ERR_X509_CATEGORY_START + 10,
+ "Found invalid algorithm in certificate")
+
+ SVN_ERRDEF(SVN_ERR_X509_CERT_INVALID_NAME,
+ SVN_ERR_X509_CATEGORY_START + 11,
+ "Found invalid name in certificate")
+
+ SVN_ERRDEF(SVN_ERR_X509_CERT_INVALID_DATE,
+ SVN_ERR_X509_CATEGORY_START + 12,
+ "Found invalid date in certificate")
+
+ SVN_ERRDEF(SVN_ERR_X509_CERT_INVALID_PUBKEY,
+ SVN_ERR_X509_CATEGORY_START + 13,
+ "Found invalid public key in certificate")
+
+ SVN_ERRDEF(SVN_ERR_X509_CERT_INVALID_SIGNATURE,
+ SVN_ERR_X509_CATEGORY_START + 14,
+ "Found invalid signature in certificate")
+
+ SVN_ERRDEF(SVN_ERR_X509_CERT_INVALID_EXTENSIONS,
+ SVN_ERR_X509_CATEGORY_START + 15,
+ "Found invalid extensions in certificate")
+
+ SVN_ERRDEF(SVN_ERR_X509_CERT_UNKNOWN_VERSION,
+ SVN_ERR_X509_CATEGORY_START + 16,
+ "Unknown certificate version")
+
+ SVN_ERRDEF(SVN_ERR_X509_CERT_UNKNOWN_PK_ALG,
+ SVN_ERR_X509_CATEGORY_START + 17,
+ "Certificate uses unknown public key algorithm")
+
+ SVN_ERRDEF(SVN_ERR_X509_CERT_SIG_MISMATCH,
+ SVN_ERR_X509_CATEGORY_START + 18,
+ "Certificate signature mismatch")
+
+ SVN_ERRDEF(SVN_ERR_X509_CERT_VERIFY_FAILED,
+ SVN_ERR_X509_CATEGORY_START + 19,
+ "Certficate verification failed")
+
SVN_ERROR_END
diff --git a/subversion/include/svn_fs.h b/subversion/include/svn_fs.h
index 8cef9a3e2a53..7773ac667f9a 100644
--- a/subversion/include/svn_fs.h
+++ b/subversion/include/svn_fs.h
@@ -65,6 +65,30 @@ svn_fs_version(void);
/** An object representing a Subversion filesystem. */
typedef struct svn_fs_t svn_fs_t;
+/**
+ * @defgroup svn_fs_backend_names Built-in back-ends
+ * Constants defining the currently supported built-in filesystem backends.
+ *
+ * @see svn_fs_type
+ * @{
+ */
+/** @since New in 1.1. */
+#define SVN_FS_TYPE_BDB "bdb"
+/** @since New in 1.1. */
+#define SVN_FS_TYPE_FSFS "fsfs"
+
+/**
+ * EXPERIMENTAL filesystem backend.
+ *
+ * It is not ready for general production use. Please consult the
+ * respective release notes on suggested usage scenarios.
+ *
+ * @since New in 1.9.
+ */
+#define SVN_FS_TYPE_FSX "fsx"
+
+/** @} */
+
/**
* @name Filesystem configuration options
@@ -110,16 +134,39 @@ typedef struct svn_fs_t svn_fs_t;
*/
#define SVN_FS_CONFIG_FSFS_CACHE_NS "fsfs-cache-namespace"
+/** Enable / disable the FSFS format 7 "block read" feature.
+ *
+ * @since New in 1.9.
+ */
+#define SVN_FS_CONFIG_FSFS_BLOCK_READ "fsfs-block-read"
+
+/** String with a decimal representation of the FSFS format shard size.
+ * Zero ("0") means that a repository with linear layout should be created.
+ *
+ * This option will only be used during the creation of new repositories
+ * and is otherwise ignored.
+ *
+ * @since New in 1.9.
+ */
+#define SVN_FS_CONFIG_FSFS_SHARD_SIZE "fsfs-shard-size"
+
+/** Enable / disable the FSFS format 7 logical addressing feature for a
+ * newly created repository.
+ *
+ * This option will only be used during the creation of new repositories
+ * and is otherwise ignored.
+ *
+ * @since New in 1.9.
+ */
+#define SVN_FS_CONFIG_FSFS_LOG_ADDRESSING "fsfs-log-addressing"
+
/* Note to maintainers: if you add further SVN_FS_CONFIG_FSFS_CACHE_* knobs,
update fs_fs.c:verify_as_revision_before_current_plus_plus(). */
-/* See also svn_fs_type(). */
-/** @since New in 1.1. */
+/** Select the filesystem type. See also #svn_fs_type().
+ *
+ * @since New in 1.1. */
#define SVN_FS_CONFIG_FS_TYPE "fs-type"
-/** @since New in 1.1. */
-#define SVN_FS_TYPE_BDB "bdb"
-/** @since New in 1.1. */
-#define SVN_FS_TYPE_FSFS "fsfs"
/** Create repository format compatible with Subversion versions
* earlier than 1.4.
@@ -148,6 +195,18 @@ typedef struct svn_fs_t svn_fs_t;
* @since New in 1.8.
*/
#define SVN_FS_CONFIG_PRE_1_8_COMPATIBLE "pre-1.8-compatible"
+
+/** Create repository format compatible with the specified Subversion
+ * release. The value must be a version in the same format as
+ * #SVN_VER_NUMBER and cannot exceed the current version.
+ *
+ * @note The @c patch component would often be ignored, due to our forward
+ * compatibility promises within minor release lines. It should therefore
+ * usually be set to @c 0.
+ *
+ * @since New in 1.9.
+ */
+#define SVN_FS_CONFIG_COMPATIBLE_VERSION "compatible-version"
/** @} */
@@ -222,6 +281,7 @@ svn_fs_set_warning_func(svn_fs_t *fs,
*
* SVN_FS_TYPE_BDB Berkeley-DB implementation
* SVN_FS_TYPE_FSFS Native-filesystem implementation
+ * SVN_FS_TYPE_FSX Experimental filesystem implementation
*
* If @a fs_config is @c NULL or does not contain a value for
* #SVN_FS_CONFIG_FS_TYPE then the default filesystem type will be used.
@@ -242,40 +302,113 @@ svn_fs_create(svn_fs_t **fs_p,
* return a pointer to it in @a *fs_p. If @a fs_config is not @c
* NULL, the options it contains modify the behavior of the
* filesystem. The interpretation of @a fs_config is specific to the
- * filesystem back-end. The opened filesystem may be closed by
- * destroying @a pool.
+ * filesystem back-end. The opened filesystem will be allocated in
+ * @a result_pool may be closed by clearing or destroying that pool.
+ * Use @a scratch_pool for temporary allocations.
*
* @note The lifetime of @a fs_config must not be shorter than @a
- * pool's. It's a good idea to allocate @a fs_config from @a pool or
- * one of its ancestors.
+ * result_pool's. It's a good idea to allocate @a fs_config from
+ * @a result_pool or one of its ancestors.
*
* Only one thread may operate on any given filesystem object at once.
* Two threads may access the same filesystem simultaneously only if
* they open separate filesystem objects.
*
* @note You probably don't want to use this directly. Take a look at
- * svn_repos_open2() instead.
+ * svn_repos_open3() instead.
*
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_fs_open2(svn_fs_t **fs_p,
+ const char *path,
+ apr_hash_t *fs_config,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/**
+ * Like svn_fs_open2(), but without @a scratch_pool.
+ *
+ * @deprecated Provided for backward compatibility with the 1.8 API.
* @since New in 1.1.
*/
+SVN_DEPRECATED
svn_error_t *
svn_fs_open(svn_fs_t **fs_p,
const char *path,
apr_hash_t *fs_config,
apr_pool_t *pool);
+/** The kind of action being taken by 'upgrade'.
+ *
+ * @since New in 1.9.
+ */
+typedef enum svn_fs_upgrade_notify_action_t
+{
+ /** Packing of the revprop shard has completed.
+ * The number parameter is the shard being processed. */
+ svn_fs_upgrade_pack_revprops = 0,
+
+ /** Removal of the non-packed revprop shard is completed.
+ * The number parameter is the shard being processed */
+ svn_fs_upgrade_cleanup_revprops,
+
+ /** DB format has been set to the new value.
+ * The number parameter is the new format number. */
+ svn_fs_upgrade_format_bumped
+} svn_fs_upgrade_notify_action_t;
+
+/** The type of an upgrade notification function. @a number is specifc
+ * to @a action (see #svn_fs_upgrade_notify_action_t); @a action is the
+ * type of action being performed. @a baton is the corresponding baton
+ * for the notification function, and @a scratch_pool can be used for
+ * temporary allocations, but will be cleared between invocations.
+ *
+ * @since New in 1.9.
+ */
+typedef svn_error_t *(*svn_fs_upgrade_notify_t)(void *baton,
+ apr_uint64_t number,
+ svn_fs_upgrade_notify_action_t action,
+ apr_pool_t *scratch_pool);
+
/**
* Upgrade the Subversion filesystem located in the directory @a path
* to the latest version supported by this library. Return
* #SVN_ERR_FS_UNSUPPORTED_UPGRADE and make no changes to the
- * filesystem if the requested upgrade is not supported. Use @a pool
- * for necessary allocations.
+ * filesystem if the requested upgrade is not supported. Use
+ * @a scratch_pool for temporary allocations.
+ *
+ * The optional @a notify_func callback is only a general feedback that
+ * the operation is still in process but may be called in e.g. random shard
+ * order and more than once for the same shard.
+ *
+ * The optional @a cancel_func callback will be invoked as usual to allow
+ * the user to preempt this potentially lengthy operation.
*
* @note You probably don't want to use this directly. Take a look at
- * svn_repos_upgrade() instead.
+ * svn_repos_upgrade2() instead.
+ *
+ * @note Canceling an upgrade is legal but may leave remnants of previous
+ * format data that may not be cleaned up automatically by later calls.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_fs_upgrade2(const char *path,
+ svn_fs_upgrade_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+/**
+ * Like svn_fs_upgrade2 but with notify_func, notify_baton, cancel_func
+ * and cancel_baton being set to NULL.
*
+ * @deprecated Provided for backward compatibility with the 1.8 API.
* @since New in 1.5.
*/
+SVN_DEPRECATED
svn_error_t *
svn_fs_upgrade(const char *path,
apr_pool_t *pool);
@@ -283,7 +416,7 @@ svn_fs_upgrade(const char *path,
/**
* Callback function type for progress notification.
*
- * @a revision is the number of the revision currently begin processed,
+ * @a revision is the number of the revision currently being processed,
* #SVN_INVALID_REVNUM if the current stage is not linked to any specific
* revision. @a baton is the callback baton.
*
@@ -328,7 +461,7 @@ svn_fs_path(svn_fs_t *fs,
* Return a shallow copy of the configuration parameters used to open
* @a fs, allocated in @a pool. It may be @c NULL. The contents of the
* hash contents remains valid only for @a fs's lifetime.
- *
+ *
* @note This is just what was passed to svn_fs_create() or svn_fs_open().
* You may not modify it.
*
@@ -351,6 +484,17 @@ svn_error_t *
svn_fs_delete_fs(const char *path,
apr_pool_t *pool);
+/** The type of a hotcopy notification function. @a start_revision and
+ * @a end_revision indicate the copied revision range. @a baton is the
+ * corresponding baton for the notification function, and @a scratch_pool
+ * can be used for temporary allocations, but will be cleared between
+ * invocations.
+ */
+typedef void (*svn_fs_hotcopy_notify_t)(void *baton,
+ svn_revnum_t start_revision,
+ svn_revnum_t end_revision,
+ apr_pool_t *scratch_pool);
+
/**
* Copy a possibly live Subversion filesystem from @a src_path to
* @a dest_path. If @a clean is @c TRUE, perform cleanup on the
@@ -363,10 +507,39 @@ svn_fs_delete_fs(const char *path,
* incremental hotcopy is not implemented, raise
* #SVN_ERR_UNSUPPORTED_FEATURE.
*
+ * For each revision range copied, @a notify_func will be called with
+ * staring and ending revision numbers (both inclusive and not necessarily
+ * different) and with the @a notify_baton. Currently, this notification
+ * is not triggered by the BDB backend. @a notify_func may be @c NULL
+ * if this notification is not required.
+ *
+ * The optional @a cancel_func callback will be invoked with
+ * @a cancel_baton as usual to allow the user to preempt this potentially
+ * lengthy operation.
+ *
* Use @a scratch_pool for temporary allocations.
*
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_fs_hotcopy3(const char *src_path,
+ const char *dest_path,
+ svn_boolean_t clean,
+ svn_boolean_t incremental,
+ svn_fs_hotcopy_notify_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+/**
+ * Like svn_fs_hotcopy3(), but with @a notify_func and @a notify_baton
+ * always passed as @c NULL.
+ *
+ * @deprecated Provided for backward compatibility with the 1.8 API.
* @since New in 1.8.
*/
+SVN_DEPRECATED
svn_error_t *
svn_fs_hotcopy2(const char *src_path,
const char *dest_path,
@@ -443,6 +616,11 @@ typedef svn_error_t *(*svn_fs_freeze_func_t)(void *baton, apr_pool_t *pool);
* Take an exclusive lock on @a fs to prevent commits and then invoke
* @a freeze_func passing @a freeze_baton.
*
+ * @note @a freeze_func must not, directly or indirectly, call any function
+ * that attempts to take out a lock on the underlying repository. These
+ * include functions for packing, hotcopying, setting revprops and commits.
+ * Attempts to do so may result in a deadlock.
+ *
* @note The BDB backend doesn't implement this feature so most
* callers should not call this function directly but should use the
* higher level svn_repos_freeze() instead.
@@ -710,12 +888,54 @@ svn_fs_access_add_lock_token(svn_fs_access_t *access_ctx,
* @{
*/
+/** Defines the possible ways two arbitrary (root, path)-pairs may be
+ * related.
+ *
+ * @since New in 1.9.
+ */
+typedef enum svn_fs_node_relation_t
+{
+ /** The (root, path)-pairs are not related, i.e. none of the other cases
+ * apply. If the roots refer to different @c svn_fs_t instances, then
+ * they are always considered unrelated - even if the underlying
+ * repository is the same.
+ */
+ svn_fs_node_unrelated = 0,
+
+ /** No changes have been made between the (root, path)-pairs, i.e. they
+ * have the same (relative) nodes in their sub-trees, corresponding sub-
+ * tree nodes have the same contents as well as properties and report the
+ * same "created-path" and "created-rev" data. This implies having a
+ * common ancestor.
+ *
+ * However, due to efficiency considerations, the FS implementation may
+ * report some combinations as merely having a common ancestor
+ * (@a svn_fs_node_common_ancestor) instead of actually being unchanged.
+ */
+ svn_fs_node_unchanged,
+
+ /** The (root, path)-pairs have a common ancestor (which may be one of
+ * them) but there are changes between them, i.e. they don't fall into
+ * the @c svn_fs_node_unchanged category.
+ *
+ * Due to efficiency considerations, the FS implementation may falsely
+ * classify some combinations as merely having a common ancestor that
+ * are, in fact, unchanged (@a svn_fs_node_unchanged).
+ */
+ svn_fs_node_common_ancestor
+
+} svn_fs_node_relation_t;
+
/** An object representing a node-revision id. */
typedef struct svn_fs_id_t svn_fs_id_t;
/** Return -1, 0, or 1 if node revisions @a a and @a b are respectively
* unrelated, equivalent, or otherwise related (part of the same node).
+ *
+ * @note Consider using the more expressive #svn_fs_node_relation() instead.
+ *
+ * @see #svn_fs_node_relation
*/
int
svn_fs_compare_ids(const svn_fs_id_t *a,
@@ -725,6 +945,10 @@ svn_fs_compare_ids(const svn_fs_id_t *a,
/** Return TRUE if node revisions @a id1 and @a id2 are related (part of the
* same node), else return FALSE.
+ *
+ * @note Consider using the more expressive #svn_fs_node_relation() instead.
+ *
+ * @see #svn_fs_node_relation
*/
svn_boolean_t
svn_fs_check_related(const svn_fs_id_t *id1,
@@ -827,10 +1051,9 @@ svn_fs_unparse_id(const svn_fs_id_t *id,
* pairs. When you commit a transaction, all of its properties become
* unversioned revision properties of the new revision. (There is one
* exception: the svn:date property will be automatically set on new
- * transactions to the date that the transaction was created, and will
+ * transactions to the date that the transaction was created, and can
* be overwritten when the transaction is committed by the current
- * time; changes to a transaction's svn:date property will not affect
- * its committed value.)
+ * time; see svn_fs_commit_txn.)
*
* Transaction names are guaranteed to contain only letters (upper-
* and lower-case), digits, `-', and `.', from the ASCII character
@@ -872,6 +1095,14 @@ typedef struct svn_fs_txn_t svn_fs_txn_t;
*/
#define SVN_FS_TXN_CHECK_LOCKS 0x00002
+/** Allow the client to specify the final svn:date of the revision by
+ * setting or deleting the corresponding transaction property rather
+ * than have it set automatically when the transaction is committed.
+ *
+ * @since New in 1.9.
+ */
+#define SVN_FS_TXN_CLIENT_DATE 0x00004
+
/** @} */
/**
@@ -925,6 +1156,17 @@ svn_fs_begin_txn(svn_fs_txn_t **txn_p,
* a new filesystem revision containing the changes made in @a txn,
* storing that new revision number in @a *new_rev, and return zero.
*
+ * If #SVN_FS_TXN_CLIENT_DATE was passed to #svn_fs_begin_txn2 any
+ * svn:date on the transaction will be become the unversioned property
+ * svn:date on the revision. svn:date can have any value, it does not
+ * have to be a timestamp. If the transaction has no svn:date the
+ * revision will have no svn:date.
+ *
+ * If #SVN_FS_TXN_CLIENT_DATE was not passed to #svn_fs_begin_txn2 the
+ * new revision will have svn:date set to the current time at some
+ * point during the commit and any svn:date on the transaction will be
+ * lost.
+ *
* If @a conflict_p is non-zero, use it to provide details on any
* conflicts encountered merging @a txn with the most recent committed
* revisions. If a conflict occurs, set @a *conflict_p to the path of
@@ -962,6 +1204,7 @@ svn_fs_begin_txn(svn_fs_txn_t **txn_p,
* ### conflict string
* ### *new_rev will always be initialized to SVN_INVALID_REVNUM, or
* ### to a valid, committed revision number
+ *
*/
svn_error_t *
svn_fs_commit_txn(const char **conflict_p,
@@ -1218,7 +1461,6 @@ typedef enum svn_fs_path_change_kind_t
/** ignore all previous change items for path (internal-use only) */
svn_fs_path_change_reset
-
} svn_fs_path_change_kind_t;
/** Change descriptor.
@@ -1227,6 +1469,11 @@ typedef enum svn_fs_path_change_kind_t
* versions. Therefore, to preserve binary compatibility, users
* should not directly allocate structures of this type.
*
+ * @note The @c text_mod, @c prop_mod and @c mergeinfo_mod flags mean the
+ * text, properties and mergeinfo property (respectively) were "touched"
+ * by the commit API; this does not mean the new value is different from
+ * the old value.
+ *
* @since New in 1.6. */
typedef struct svn_fs_path_change2_t
{
@@ -1236,10 +1483,23 @@ typedef struct svn_fs_path_change2_t
/** kind of change */
svn_fs_path_change_kind_t change_kind;
- /** were there text mods? */
+ /** was the text touched?
+ * For node_kind=dir: always false. For node_kind=file:
+ * modify: true iff text touched.
+ * add (copy): true iff text touched.
+ * add (plain): always true.
+ * delete: always false.
+ * replace: as for the add/copy part of the replacement.
+ */
svn_boolean_t text_mod;
- /** were there property mods? */
+ /** were the properties touched?
+ * modify: true iff props touched.
+ * add (copy): true iff props touched.
+ * add (plain): true iff props touched.
+ * delete: always false.
+ * replace: as for the add/copy part of the replacement.
+ */
svn_boolean_t prop_mod;
/** what node kind is the path?
@@ -1252,6 +1512,15 @@ typedef struct svn_fs_path_change2_t
svn_revnum_t copyfrom_rev;
const char *copyfrom_path;
+ /** was the mergeinfo property touched?
+ * modify: } true iff svn:mergeinfo property add/del/mod
+ * add (copy): } and fs format supports this flag.
+ * add (plain): }
+ * delete: always false.
+ * replace: as for the add/copy part of the replacement.
+ * (Note: Pre-1.9 repositories will report #svn_tristate_unknown.)
+ * @since New in 1.9. */
+ svn_tristate_t mergeinfo_mod;
/* NOTE! Please update svn_fs_path_change2_create() when adding new
fields here. */
} svn_fs_path_change2_t;
@@ -1349,8 +1618,24 @@ typedef struct svn_fs_history_t svn_fs_history_t;
/** Set @a *history_p to an opaque node history object which
* represents @a path under @a root. @a root must be a revision root.
- * Use @a pool for all allocations.
+ * Allocate the result in @a result_pool and use @a scratch_pool for
+ * temporary allocations.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_fs_node_history2(svn_fs_history_t **history_p,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/** Same as svn_fs_node_history2() but using a single @a pool for all
+ * allocations.
+ *
+ * @deprecated Provided for backward compatibility with the 1.8 API.
*/
+SVN_DEPRECATED
svn_error_t *
svn_fs_node_history(svn_fs_history_t **history_p,
svn_fs_root_t *root,
@@ -1383,7 +1668,25 @@ svn_fs_node_history(svn_fs_history_t **history_p,
* the same age as the revision of that path in @a root. That is, if
* @a root is a revision root based on revision X, and @a path was
* modified in some revision(s) younger than X, those revisions
- * younger than X will not be included for @a path. */
+ * younger than X will not be included for @a path.
+ *
+ * Allocate the result in @a result_pool and use @a scratch_pool for
+ * temporary allocations.
+ *
+ * @since New in 1.9. */
+svn_error_t *
+svn_fs_history_prev2(svn_fs_history_t **prev_history_p,
+ svn_fs_history_t *history,
+ svn_boolean_t cross_copies,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/** Same as svn_fs_history_prev2() but using a single @a pool for all
+ * allocations.
+ *
+ * @deprecated Provided for backward compatibility with the 1.8 API.
+ */
+SVN_DEPRECATED
svn_error_t *
svn_fs_history_prev(svn_fs_history_t **prev_history_p,
svn_fs_history_t *history,
@@ -1437,6 +1740,25 @@ svn_fs_node_id(const svn_fs_id_t **id_p,
const char *path,
apr_pool_t *pool);
+/** Determine how @a path_a under @a root_a and @a path_b under @a root_b
+ * are related and return the result in @a relation. There is no restriction
+ * concerning the roots: They may refer to different repositories, be in
+ * arbitrary revision order and any of them may pertain to a transaction.
+ * @a scratch_pool is used for temporary allocations.
+ *
+ * @note Paths from different svn_fs_t will be reported as unrelated even
+ * if the underlying physical repository is the same.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_fs_node_relation(svn_fs_node_relation_t *relation,
+ svn_fs_root_t *root_a,
+ const char *path_a,
+ svn_fs_root_t *root_b,
+ const char *path_b,
+ apr_pool_t *scratch_pool);
+
/** Set @a *revision to the revision in which @a path under @a root was
* created. Use @a pool for any temporary allocations. @a *revision will
* be set to #SVN_INVALID_REVNUM for uncommitted nodes (i.e. modified nodes
@@ -1501,6 +1823,18 @@ svn_fs_node_proplist(apr_hash_t **table_p,
const char *path,
apr_pool_t *pool);
+/** Set @a *has_props to TRUE if the node @a path in @a root has properties
+ * and to FALSE if it doesn't have properties. Perform temporary allocations
+ * in @a scratch_pool.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_fs_node_has_props(svn_boolean_t *has_props,
+ svn_fs_root_t *root,
+ const char *path,
+ apr_pool_t *scratch_pool);
+
/** Change a node's property's value, or add/delete a property.
*
@@ -1521,10 +1855,42 @@ svn_fs_change_node_prop(svn_fs_root_t *root,
/** Determine if the properties of two path/root combinations are different.
*
- * Set @a *changed_p to 1 if the properties at @a path1 under @a root1 differ
- * from those at @a path2 under @a root2, or set it to 0 if they are the
- * same. Both paths must exist under their respective roots, and both
- * roots must be in the same filesystem.
+ * Set @a *different_p to #TRUE if the properties at @a path1 under @a root1
+ * differ from those at @a path2 under @a root2, or set it to #FALSE if they
+ * are the same. Both paths must exist under their respective roots, and
+ * both roots must be in the same filesystem.
+ * Do any necessary temporary allocation in @a scratch_pool.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_fs_props_different(svn_boolean_t *different_p,
+ svn_fs_root_t *root1,
+ const char *path1,
+ svn_fs_root_t *root2,
+ const char *path2,
+ apr_pool_t *scratch_pool);
+
+
+/** Determine if the properties of two path/root combinations are different.
+ * In contrast to #svn_fs_props_different, we only perform a quick test and
+ * allow for false positives.
+ *
+ * Set @a *changed_p to #TRUE if the properties at @a path1 under @a root1
+ * differ from those at @a path2 under @a root2, or set it to #FALSE if they
+ * are the same. Both paths must exist under their respective roots, and
+ * both roots must be in the same filesystem.
+ * Do any necessary temporary allocation in @a pool.
+ *
+ * @note The behavior is implementation dependent in that the false
+ * positives reported may differ from release to release and backend to
+ * backend. There is also no guarantee that there will be false positives
+ * at all.
+ *
+ * @note Prior to Subversion 1.9, this function would return false negatives
+ * for FSFS: If @a root1 and @a root2 were both transaction roots
+ * and the proplists of both paths had been changed in their respective
+ * transactions, @a changed_p would be set to #FALSE.
*/
svn_error_t *
svn_fs_props_changed(svn_boolean_t *changed_p,
@@ -1624,12 +1990,14 @@ svn_fs_closest_copy(svn_fs_root_t **root_p,
*
* If @a adjust_inherited_mergeinfo is @c TRUE, then any inherited
* mergeinfo returned in @a *catalog is normalized to represent the
- * inherited mergeinfo on the path which inherits it. If
+ * inherited mergeinfo on the path which inherits it. This adjusted
+ * mergeinfo is keyed by the path which inherits it. If
* @a adjust_inherited_mergeinfo is @c FALSE, then any inherited
* mergeinfo is the raw explicit mergeinfo from the nearest parent
* of the path with explicit mergeinfo, unadjusted for the path-wise
* difference between the path and its parent. This may include
- * non-inheritable mergeinfo.
+ * non-inheritable mergeinfo. This unadjusted mergeinfo is keyed by
+ * the path at which it was found.
*
* If @a include_descendants is TRUE, then additionally return the
* mergeinfo for any descendant of any element of @a paths which has
@@ -1738,6 +2106,21 @@ svn_fs_dir_entries(apr_hash_t **entries_p,
const char *path,
apr_pool_t *pool);
+/** Take the #svn_fs_dirent_t structures in @a entries as returned by
+ * #svn_fs_dir_entries for @a root and determine an optimized ordering
+ * in which data access would most likely be efficient. Set @a *ordered_p
+ * to a newly allocated APR array of pointers to these #svn_fs_dirent_t
+ * structures. Allocate the array (but not its contents) in @a result_pool
+ * and use @a scratch_pool for temporaries.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_fs_dir_optimal_order(apr_array_header_t **ordered_p,
+ svn_fs_root_t *root,
+ apr_hash_t *entries,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
/** Create a new directory named @a path in @a root. The new directory has
* no entries, and no properties. @a root must be the root of a transaction,
@@ -1811,6 +2194,7 @@ svn_fs_revision_link(svn_fs_root_t *from_root,
svn_fs_root_t *to_root,
const char *path,
apr_pool_t *pool);
+
/* Files. */
@@ -1921,13 +2305,13 @@ typedef svn_error_t *
* upon doing so. Use @a pool for allocations.
*
* This function is intended to support zero copy data processing. It may
- * not be implemented for all data backends or not applicable for certain
- * content. In that case, @a *success will always be @c FALSE. Also, this
- * is a best-effort function which means that there is no guarantee that
- * @a processor gets called at all for some content.
+ * not be implemented for all data backends or not be applicable for certain
+ * content. In those cases, @a *success will always be @c FALSE. Also,
+ * this is a best-effort function which means that there is no guarantee
+ * that @a processor gets called at all.
*
- * @note @a processor is expected to be relatively short function with
- * at most O(content size) runtime.
+ * @note @a processor is expected to be a relatively simple function with
+ * a runtime of O(content size) or less.
*
* @since New in 1.8.
*/
@@ -2015,11 +2399,8 @@ svn_fs_apply_textdelta(svn_txdelta_window_handler_t *contents_p,
*
* Do any necessary temporary allocation in @a pool.
*
- * ### This is like svn_fs_apply_textdelta(), but takes the text
- * straight. It is currently used only by the loader, see
- * libsvn_repos/load.c. It should accept a checksum, of course, which
- * would come from an (optional) header in the dump file. See
- * http://subversion.tigris.org/issues/show_bug.cgi?id=1102 for more.
+ * @note This is like svn_fs_apply_textdelta(), but takes the text
+ * straight.
*/
svn_error_t *
svn_fs_apply_text(svn_stream_t **contents_p,
@@ -2031,10 +2412,36 @@ svn_fs_apply_text(svn_stream_t **contents_p,
/** Check if the contents of two root/path combos have changed.
*
- * Set @a *changed_p to 1 if the contents at @a path1 under @a root1 differ
- * from those at @a path2 under @a root2, or set it to 0 if they are the
- * same. Both paths must exist under their respective roots, and both
- * roots must be in the same filesystem.
+ * Set @a *different_p to #TRUE if the file contents at @a path1 under
+ * @a root1 differ from those at @a path2 under @a root2, or set it to
+ * #FALSE if they are the same. Both paths must exist under their
+ * respective roots, and both roots must be in the same filesystem.
+ * Do any necessary temporary allocation in @a scratch_pool.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_fs_contents_different(svn_boolean_t *different_p,
+ svn_fs_root_t *root1,
+ const char *path1,
+ svn_fs_root_t *root2,
+ const char *path2,
+ apr_pool_t *scratch_pool);
+
+/** Check if the contents of two root/path combos have changed. In
+ * contrast to #svn_fs_contents_different, we only perform a quick test
+ * and allow for false positives.
+ *
+ * Set @a *changed_p to #TRUE if the file contents at @a path1 under
+ * @a root1 differ from those at @a path2 under @a root2, or set it to
+ * #FALSE if they are the same. Both paths must exist under their
+ * respective roots, and both roots must be in the same filesystem.
+ * Do any necessary temporary allocation in @a pool.
+ *
+ * @note The behavior is implementation dependent in that the false
+ * positives reported may differ from release to release and backend to
+ * backend. There is also no guarantee that there will be false positives
+ * at all.
*/
svn_error_t *
svn_fs_contents_changed(svn_boolean_t *changed_p,
@@ -2060,6 +2467,41 @@ svn_fs_youngest_rev(svn_revnum_t *youngest_p,
apr_pool_t *pool);
+/**
+ * Return filesystem format information for @a fs.
+ *
+ * Set @a *fs_format to the filesystem format number of @a fs, which is
+ * an integer that increases when incompatible changes are made (such as
+ * by #svn_fs_upgrade).
+ *
+ * Set @a *supports_version to the version number of the minimum Subversion GA
+ * release that can read and write @a fs.
+ *
+ * @see svn_repos_info_format
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_fs_info_format(int *fs_format,
+ svn_version_t **supports_version,
+ svn_fs_t *fs,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/**
+ * Return a list of admin-serviceable config files for @a fs. @a *files
+ * will be set to an array containing paths as C strings.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_fs_info_config_files(apr_array_header_t **files,
+ svn_fs_t *fs,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+
+
/** Provide filesystem @a fs the opportunity to compress storage relating to
* associated with @a revision in filesystem @a fs. Use @a pool for all
* allocations.
@@ -2186,12 +2628,6 @@ svn_fs_set_uuid(svn_fs_t *fs,
apr_pool_t *pool);
-/* Non-historical properties. */
-
-/* [[Yes, do tell.]] */
-
-
-
/** @defgroup svn_fs_locks Filesystem locks
* @{
* @since New in 1.2. */
@@ -2210,7 +2646,7 @@ svn_fs_set_uuid(svn_fs_t *fs,
* mainly due to the serialization for tokens for pre-commit hook.
*
* Locks are not secret; anyone can view existing locks in a
- * filesystem. Locks are not omnipotent: they can broken and stolen
+ * filesystem. Locks are not omnipotent: they can be broken and stolen
* by people who don't "own" the lock. (Though admins can tailor a
* custom break/steal policy via libsvn_repos pre-lock hook script.)
*
@@ -2220,16 +2656,64 @@ svn_fs_set_uuid(svn_fs_t *fs,
* expiration error (depending on the API).
*/
+/** Lock information for use with svn_fs_lock_many() [and svn_repos_fs_...].
+ *
+ * @see svn_fs_lock_target_create
+ *
+ * @since New in 1.9.
+ */
+typedef struct svn_fs_lock_target_t svn_fs_lock_target_t;
+
+/** Create an <tt>svn_fs_lock_target_t</tt> allocated in @a result_pool.
+ * @a token can be NULL and @a current_rev can be SVN_INVALID_REVNUM.
+ *
+ * The @a token is not duplicated and so must have a lifetime at least as
+ * long as the returned target object.
+ *
+ * @since New in 1.9.
+ */
+svn_fs_lock_target_t *svn_fs_lock_target_create(const char *token,
+ svn_revnum_t current_rev,
+ apr_pool_t *result_pool);
+
+/** Update @a target changing the token to @a token, @a token can be NULL.
+ *
+ * The @a token is not duplicated and so must have a lifetime at least as
+ * long as @a target.
+ *
+ * @since New in 1.9.
+ */
+void svn_fs_lock_target_set_token(svn_fs_lock_target_t *target,
+ const char *token);
-/** Lock @a path in @a fs, and set @a *lock to a lock
- * representing the new lock, allocated in @a pool.
+/** The callback invoked by svn_fs_lock_many() and svn_fs_unlock_many().
+ *
+ * @a path and @a lock are allocated in the result_pool passed to
+ * svn_fs_lock_many/svn_fs_unlock_many and so will persist beyond the
+ * callback invocation. @a fs_err will be cleared after the callback
+ * returns, use svn_error_dup() to preserve the error.
+ *
+ * If the callback returns an error no further callbacks will be made
+ * and svn_fs_lock_many/svn_fs_unlock_many will return an error. The
+ * caller cannot rely on any particular order for these callbacks and
+ * cannot rely on interrupting the underlying operation by returning
+ * an error. Returning an error stops the callbacks but any locks
+ * that would have been reported in further callbacks may, or may not,
+ * still be created/released.
*
- * @warning You may prefer to use svn_repos_fs_lock() instead,
- * which see.
+ * @since New in 1.9.
+ */
+typedef svn_error_t *(*svn_fs_lock_callback_t)(void *baton,
+ const char *path,
+ const svn_lock_t *lock,
+ svn_error_t *fs_err,
+ apr_pool_t *scratch_pool);
+
+/** Lock the paths in @a lock_targets in @a fs.
*
* @a fs must have a username associated with it (see
* #svn_fs_access_t), else return #SVN_ERR_FS_NO_USER. Set the
- * 'owner' field in the new lock to the fs username.
+ * 'owner' field in each new lock to the fs username.
*
* @a comment is optional: it's either an xml-escapable UTF8 string
* which describes the lock, or it is @c NULL.
@@ -2238,28 +2722,63 @@ svn_fs_set_uuid(svn_fs_t *fs,
* generic DAV client; only mod_dav_svn's autoversioning feature needs
* to use it. If in doubt, pass 0.
*
- * If path is already locked, then return #SVN_ERR_FS_PATH_ALREADY_LOCKED,
+ * The paths to be locked are passed as the <tt>const char *</tt> keys
+ * of the @a lock_targets hash. The hash values are
+ * <tt>svn_fs_lock_target_t *</tt> and provide the token and
+ * @a current_rev for each path. The token is a lock token such as can
+ * be generated using svn_fs_generate_lock_token() (indicating that
+ * the caller wants to dictate the lock token used), or it is @c NULL
+ * (indicating that the caller wishes to have a new token generated by
+ * this function). If the token is not @c NULL, and represents an
+ * existing lock, then the path must match the path associated with
+ * that existing lock. If @a current_rev is a valid revnum, then do an
+ * out-of-dateness check. If the revnum is less than the
+ * last-changed-revision of the path (or if the path doesn't exist in
+ * HEAD), yield an #SVN_ERR_FS_OUT_OF_DATE error for this path.
+ *
+ * If a path is already locked, then yield #SVN_ERR_FS_PATH_ALREADY_LOCKED,
* unless @a steal_lock is TRUE, in which case "steal" the existing
* lock, even if the FS access-context's username does not match the
- * current lock's owner: delete the existing lock on @a path, and
+ * current lock's owner: delete the existing lock on the path, and
* create a new one.
*
- * @a token is a lock token such as can be generated using
- * svn_fs_generate_lock_token() (indicating that the caller wants to
- * dictate the lock token used), or it is @c NULL (indicating that the
- * caller wishes to have a new token generated by this function). If
- * @a token is not @c NULL, and represents an existing lock, then @a
- * path must match the path associated with that existing lock.
- *
* If @a expiration_date is zero, then create a non-expiring lock.
* Else, the lock will expire at @a expiration_date.
*
- * If @a current_rev is a valid revnum, then do an out-of-dateness
- * check. If the revnum is less than the last-changed-revision of @a
- * path (or if @a path doesn't exist in HEAD), return
- * #SVN_ERR_FS_OUT_OF_DATE.
+ * For each path in @a lock_targets @a lock_callback will be invoked
+ * passing @a lock_baton and the lock and error that apply to path.
+ * @a lock_callback can be NULL in which case it is not called and any
+ * errors that would have been passed to the callback are not reported.
+ *
+ * The lock and path passed to @a lock_callback will be allocated in
+ * @a result_pool. Use @a scratch_pool for temporary allocations.
*
* @note At this time, only files can be locked.
+ *
+ * @note This function is not atomic. If it returns an error, some targets
+ * may remain unlocked while others may have been locked.
+ *
+ * @note You probably don't want to use this directly. Take a look at
+ * svn_repos_fs_lock_many() instead.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_fs_lock_many(svn_fs_t *fs,
+ apr_hash_t *lock_targets,
+ const char *comment,
+ svn_boolean_t is_dav_comment,
+ apr_time_t expiration_date,
+ svn_boolean_t steal_lock,
+ svn_fs_lock_callback_t lock_callback,
+ void *lock_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/** Similar to svn_fs_lock_many() but locks only a single @a path and
+ * returns the lock in @a *lock, allocated in @a pool, or an error.
+ *
+ * @since New in 1.2.
*/
svn_error_t *
svn_fs_lock(svn_lock_t **lock,
@@ -2286,20 +2805,52 @@ svn_fs_generate_lock_token(const char **token,
apr_pool_t *pool);
-/** Remove the lock on @a path represented by @a token in @a fs.
+/** Remove the locks on the paths in @a unlock_targets in @a fs.
+ *
+ * The paths to be unlocked are passed as <tt>const char *</tt> keys
+ * of the @a unlock_targets hash with the corresponding lock tokens as
+ * <tt>const char *</tt> values. If the token doesn't point to a
+ * lock, yield an #SVN_ERR_FS_BAD_LOCK_TOKEN error for this path. If
+ * the token points to an expired lock, yield an
+ * #SVN_ERR_FS_LOCK_EXPIRED error for this path. If @a fs has no
+ * username associated with it, yield an #SVN_ERR_FS_NO_USER unless @a
+ * break_lock is specified.
+ *
+ * If the token points to a lock, but the username of @a fs's access
+ * context doesn't match the lock's owner, yield an
+ * #SVN_ERR_FS_LOCK_OWNER_MISMATCH. If @a break_lock is TRUE,
+ * however, don't return error; allow the lock to be "broken" in any
+ * case. In the latter case, the token shall be @c NULL.
+ *
+ * For each path in @a unlock_targets @a lock_callback will be invoked
+ * passing @a lock_baton and error that apply to path. The @a lock
+ * passed to the callback will be NULL. @a lock_callback can be NULL
+ * in which case it is not called and any errors that would have been
+ * passed to the callback are not reported.
*
- * If @a token doesn't point to a lock, return #SVN_ERR_FS_BAD_LOCK_TOKEN.
- * If @a token points to an expired lock, return #SVN_ERR_FS_LOCK_EXPIRED.
- * If @a fs has no username associated with it, return #SVN_ERR_FS_NO_USER
- * unless @a break_lock is specified.
+ * The path passed to lock_callback will be allocated in @a result_pool.
+ * Use @a scratch_pool for temporary allocations.
+ *
+ * @note This function is not atomic. If it returns an error, some targets
+ * may remain locked while others may have been unlocked.
+ *
+ * @note You probably don't want to use this directly. Take a look at
+ * svn_repos_fs_unlock_many() instead.
*
- * If @a token points to a lock, but the username of @a fs's access
- * context doesn't match the lock's owner, return
- * #SVN_ERR_FS_LOCK_OWNER_MISMATCH. If @a break_lock is TRUE, however, don't
- * return error; allow the lock to be "broken" in any case. In the latter
- * case, @a token shall be @c NULL.
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_fs_unlock_many(svn_fs_t *fs,
+ apr_hash_t *unlock_targets,
+ svn_boolean_t break_lock,
+ svn_fs_lock_callback_t lock_callback,
+ void *lock_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/** Similar to svn_fs_unlock_many() but only unlocks a single path.
*
- * Use @a pool for temporary allocations.
+ * @since New in 1.2.
*/
svn_error_t *
svn_fs_unlock(svn_fs_t *fs,
@@ -2312,7 +2863,7 @@ svn_fs_unlock(svn_fs_t *fs,
/** If @a path is locked in @a fs, set @a *lock to an svn_lock_t which
* represents the lock, allocated in @a pool.
*
- * If @a path is not locked, set @a *lock to NULL.
+ * If @a path is not locked or does not exist in HEAD, set @a *lock to NULL.
*/
svn_error_t *
svn_fs_get_lock(svn_lock_t **lock,
@@ -2523,6 +3074,113 @@ svn_fs_verify_root(svn_fs_root_t *root,
/** @} */
+/**
+ * @defgroup fs_info Filesystem information subsystem
+ * @{
+ */
+
+/**
+ * A structure that provides some information about a filesystem.
+ * Returned by svn_fs_info() for #SVN_FS_TYPE_FSFS filesystems.
+ *
+ * @note Fields may be added to the end of this structure in future
+ * versions. Therefore, users shouldn't allocate structures of this
+ * type, to preserve binary compatibility.
+ *
+ * @since New in 1.9.
+ */
+typedef struct svn_fs_fsfs_info_t {
+
+ /** Filesystem backend (#fs_type), i.e., the string #SVN_FS_TYPE_FSFS. */
+ const char *fs_type;
+
+ /** Shard size, or 0 if the filesystem is not currently sharded. */
+ int shard_size;
+
+ /** The smallest revision (as #svn_revnum_t) which is not in a pack file.
+ * @note Zero (0) if (but not iff) the format does not support packing. */
+ svn_revnum_t min_unpacked_rev;
+
+ /** TRUE if logical addressing is enabled for this repository.
+ * FALSE if repository uses physical addressing. */
+ svn_boolean_t log_addressing;
+ /* ### TODO: information about fsfs.conf? rep-cache.db? write locks? */
+
+ /* If you add fields here, check whether you need to extend svn_fs_info()
+ or svn_fs_info_dup(). */
+} svn_fs_fsfs_info_t;
+
+/**
+ * A structure that provides some information about a filesystem.
+ * Returned by svn_fs_info() for #SVN_FS_TYPE_FSX filesystems.
+ *
+ * @note Fields may be added to the end of this structure in future
+ * versions. Therefore, users shouldn't allocate structures of this
+ * type, to preserve binary compatibility.
+ *
+ * @since New in 1.9.
+ */
+typedef struct svn_fs_fsx_info_t {
+
+ /** Filesystem backend (#fs_type), i.e., the string #SVN_FS_TYPE_FSX. */
+ const char *fs_type;
+
+ /** Shard size, always > 0. */
+ int shard_size;
+
+ /** The smallest revision which is not in a pack file. */
+ svn_revnum_t min_unpacked_rev;
+
+ /* If you add fields here, check whether you need to extend svn_fs_info()
+ or svn_fs_info_dup(). */
+
+} svn_fs_fsx_info_t;
+
+/** @see svn_fs_info
+ * @since New in 1.9. */
+typedef struct svn_fs_info_placeholder_t {
+ /** @see svn_fs_type */
+ const char *fs_type;
+
+ /* Do not add new fields here, to maintain compatibility with the first
+ released version of svn_fs_fsfs_info_t. */
+} svn_fs_info_placeholder_t;
+
+/**
+ * Set @a *fs_info to a struct describing @a fs. The type of the
+ * struct depends on the backend: for #SVN_FS_TYPE_FSFS, the struct will be
+ * of type #svn_fs_fsfs_info_t; for #SVN_FS_TYPE_FSX, it will be of type
+ * #svn_fs_fsx_info_t; otherwise, the struct is guaranteed to be
+ * (compatible with) #svn_fs_info_placeholder_t.
+ *
+ * @see #svn_fs_fsfs_info_t, #svn_fs_fsx_info_t
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_fs_info(const svn_fs_info_placeholder_t **fs_info,
+ svn_fs_t *fs,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/**
+ * Return a duplicate of @a info, allocated in @a result_pool. The returned
+ * struct will be of the same type as the passed-in struct, which itself
+ * must have been returned from svn_fs_info() or svn_fs_info_dup(). No part
+ * of the new structure will be shared with @a info (except static string
+ * constants). Use @a scratch_pool for temporary allocations.
+ *
+ * @see #svn_fs_info_placeholder_t, #svn_fs_fsfs_info_t
+ *
+ * @since New in 1.9.
+ */
+void *
+svn_fs_info_dup(const void *info,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/** @} */
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/subversion/include/svn_hash.h b/subversion/include/svn_hash.h
index 46b4760068bf..50ed10a4b3f8 100644
--- a/subversion/include/svn_hash.h
+++ b/subversion/include/svn_hash.h
@@ -37,7 +37,6 @@
#include "svn_types.h"
#include "svn_io.h" /* for svn_stream_t */
-
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
diff --git a/subversion/include/svn_io.h b/subversion/include/svn_io.h
index 0082917a8c69..42eb422bfab9 100644
--- a/subversion/include/svn_io.h
+++ b/subversion/include/svn_io.h
@@ -682,8 +682,15 @@ svn_io_files_contents_three_same_p(svn_boolean_t *same12,
const char *file3,
apr_pool_t *scratch_pool);
-/** Create file at utf8-encoded @a file with contents @a contents.
- * @a file must not already exist.
+/** Create a file at utf8-encoded path @a file with the contents given
+ * by the null-terminated string @a contents.
+ *
+ * @a file must not already exist. If an error occurs while writing or
+ * closing the file, attempt to delete the file before returning the error.
+ *
+ * Write the data in 'binary' mode (#APR_FOPEN_BINARY). If @a contents
+ * is @c NULL, create an empty file.
+ *
* Use @a pool for memory allocations.
*/
svn_error_t *
@@ -691,6 +698,38 @@ svn_io_file_create(const char *file,
const char *contents,
apr_pool_t *pool);
+/** Create a file at utf8-encoded path @a file with the contents given
+ * by @a contents of @a length bytes.
+ *
+ * @a file must not already exist. If an error occurs while writing or
+ * closing the file, attempt to delete the file before returning the error.
+ *
+ * Write the data in 'binary' mode (#APR_FOPEN_BINARY). If @a length is
+ * zero, create an empty file; in this case @a contents may be @c NULL.
+ *
+ * Use @a scratch_pool for temporary allocations.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_io_file_create_bytes(const char *file,
+ const void *contents,
+ apr_size_t length,
+ apr_pool_t *scratch_pool);
+
+/** Create an empty file at utf8-encoded path @a file.
+ *
+ * @a file must not already exist. If an error occurs while
+ * closing the file, attempt to delete the file before returning the error.
+ *
+ * Use @a scratch_pool for temporary allocations.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_io_file_create_empty(const char *file,
+ apr_pool_t *scratch_pool);
+
/**
* Lock file at @a lock_file. If @a exclusive is TRUE,
* obtain exclusive lock, otherwise obtain shared lock.
@@ -759,6 +798,12 @@ svn_io_unlock_open_file(apr_file_t *lockfile_handle,
* Flush any unwritten data from @a file to disk. Use @a pool for
* memory allocations.
*
+ * @note This function uses advanced file control operations to flush buffers
+ * to disk that aren't always accessible and can be very expensive on systems
+ * that implement flushing on all IO layers, like Windows. Please avoid using
+ * this function in cases where the file should just work on any network
+ * filesystem. In many cases a normal svn_io_file_flush() will work just fine.
+ *
* @since New in 1.1.
*/
svn_error_t *
@@ -804,14 +849,16 @@ svn_io_dir_file_copy(const char *src_path,
* On entry to the handler, the pointed-to value should be the amount
* of data which can be read or the amount of data to write. When the
* handler returns, the value is reset to the amount of data actually
- * read or written. Handlers are obliged to complete a read or write
- * to the maximum extent possible; thus, a short read with no
- * associated error implies the end of the input stream, and a short
- * write should never occur without an associated error.
+ * read or written. The write and full read handler are obliged to
+ * complete a read or write to the maximum extent possible; thus, a
+ * short read with no associated error implies the end of the input
+ * stream, and a short write should never occur without an associated
+ * error. In Subversion 1.9 the stream api was extended to also support
+ * limited reads via the new svn_stream_read2() api.
*
- * In Subversion 1.7 reset support was added as an optional feature of
- * streams. If a stream implements resetting it allows reading the data
- * again after a successful call to svn_stream_reset().
+ * In Subversion 1.7 mark, seek and reset support was added as an optional
+ * feature of streams. If a stream implements resetting it allows reading
+ * the data again after a successful call to svn_stream_reset().
*/
typedef struct svn_stream_t svn_stream_t;
@@ -861,7 +908,15 @@ typedef svn_error_t *(*svn_stream_mark_fn_t)(void *baton,
* @since New in 1.7.
*/
typedef svn_error_t *(*svn_stream_seek_fn_t)(void *baton,
- const svn_stream_mark_t *mark);
+ const svn_stream_mark_t *mark);
+
+/** Poll handler for generic streams that support incomplete reads, @see
+ * svn_stream_t and svn_stream_data_available().
+ *
+ * @since New in 1.9.
+ */
+typedef svn_error_t *(*svn_stream_data_available_fn_t)(void *baton,
+ svn_boolean_t *data_available);
/** Create a generic stream. @see svn_stream_t. */
svn_stream_t *
@@ -873,7 +928,24 @@ void
svn_stream_set_baton(svn_stream_t *stream,
void *baton);
-/** Set @a stream's read function to @a read_fn */
+/** Set @a stream's read functions to @a read_fn and @a read_full_fn. If
+ * @a read_full_fn is NULL a default implementation based on multiple calls
+ * to @a read_fn will be used.
+ *
+ * @since New in 1.9.
+ */
+void
+svn_stream_set_read2(svn_stream_t *stream,
+ svn_read_fn_t read_fn,
+ svn_read_fn_t read_full_fn);
+
+/** Set @a stream's read function to @a read_fn.
+ *
+ * This function sets only the full read function to read_fn.
+ *
+ * @deprecated Provided for backward compatibility with the 1.8 API.
+ */
+SVN_DEPRECATED
void
svn_stream_set_read(svn_stream_t *stream,
svn_read_fn_t read_fn);
@@ -912,6 +984,14 @@ void
svn_stream_set_seek(svn_stream_t *stream,
svn_stream_seek_fn_t seek_fn);
+/** Set @a stream's data available function to @a data_available_fn
+ *
+ * @since New in 1.9.
+ */
+void
+svn_stream_set_data_available(svn_stream_t *stream,
+ svn_stream_data_available_fn_t data_available);
+
/** Create a stream that is empty for reading and infinite for writing. */
svn_stream_t *
svn_stream_empty(apr_pool_t *pool);
@@ -1049,6 +1129,20 @@ svn_error_t *
svn_stream_for_stdout(svn_stream_t **out,
apr_pool_t *pool);
+/** Set @a *str to a string buffer allocated in @a result_pool that contains
+ * all data from the current position in @a stream to its end. @a len_hint
+ * specifies the initial capacity of the string buffer and may be 0. The
+ * buffer gets automatically resized to fit the actual amount of data being
+ * read from @a stream.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_stringbuf_from_stream(svn_stringbuf_t **str,
+ svn_stream_t *stream,
+ apr_size_t len_hint,
+ apr_pool_t *result_pool);
+
/** Return a generic stream connected to stringbuf @a str. Allocate the
* stream in @a pool.
*/
@@ -1131,7 +1225,48 @@ svn_stream_checksummed(svn_stream_t *stream,
svn_boolean_t read_all,
apr_pool_t *pool);
-/** Read from a generic stream. @see svn_stream_t. */
+/** Read from a generic stream until @a buffer is filled upto @a *len or
+ * until EOF is reached. @see svn_stream_t
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_stream_read_full(svn_stream_t *stream,
+ char *buffer,
+ apr_size_t *len);
+
+
+/** Returns @c TRUE if the generic @c stream supports svn_stream_read2().
+ *
+ * @since New in 1.9.
+ */
+svn_boolean_t
+svn_stream_supports_partial_read(svn_stream_t *stream);
+
+/** Read all currently available upto @a *len into @a buffer. Use
+ * svn_stream_read_full() if you want to wait for the buffer to be filled
+ * or EOF. If the stream doesn't support limited reads this function will
+ * return an #SVN_ERR_STREAM_NOT_SUPPORTED error.
+ *
+ * A 0 byte read signals the end of the stream.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_stream_read2(svn_stream_t *stream,
+ char *buffer,
+ apr_size_t *len);
+
+
+/** Read from a generic stream until the buffer is completely filled or EOF.
+ * @see svn_stream_t.
+ *
+ * @note This function is a wrapper of svn_stream_read_full() now, which name
+ * better documents the behavior of this function.
+ *
+ * @deprecated Provided for backward compatibility with the 1.8 API
+ */
+SVN_DEPRECATED
svn_error_t *
svn_stream_read(svn_stream_t *stream,
char *buffer,
@@ -1209,6 +1344,20 @@ svn_stream_mark(svn_stream_t *stream,
svn_error_t *
svn_stream_seek(svn_stream_t *stream, const svn_stream_mark_t *mark);
+/** When a stream supports polling for available data, obtain a boolean
+ * indicating whether data is waiting to be read. If the stream doesn't
+ * support polling this function returns a #SVN_ERR_STREAM_NOT_SUPPORTED
+ * error.
+ *
+ * If the data_available callback is implemented and the stream is at the end
+ * the stream will set @a *data_available to FALSE.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_stream_data_available(svn_stream_t *stream,
+ svn_boolean_t *data_available);
+
/** Return a writable stream which, when written to, writes to both of the
* underlying streams. Both of these streams will be closed upon closure of
* the returned stream; use svn_stream_disown() if this is not the desired
@@ -1405,6 +1554,10 @@ typedef svn_error_t *
* If the only "access" the returned stream gets is to close it
* then @a open_func will only be called if @a open_on_close is TRUE.
*
+ * Allocate the returned stream in @a result_pool. Also arrange for
+ * @a result_pool to be passed as the @c result_pool parameter to
+ * @a open_func when it is called.
+ *
* @since New in 1.8.
*/
svn_stream_t *
@@ -2067,6 +2220,28 @@ svn_io_file_seek(apr_file_t *file,
apr_off_t *offset,
apr_pool_t *pool);
+/** Set the file pointer of the #APR_BUFFERED @a file to @a offset. In
+ * contrast to #svn_io_file_seek, this function will attempt to resize the
+ * internal data buffer to @a block_size bytes and to read data aligned to
+ * multiples of that value. The beginning of the block will be returned
+ * in @a buffer_start, if that is not NULL.
+ * Uses @a scratch_pool for temporary allocations.
+ *
+ * @note Due to limitations of the APR API, the alignment may not be
+ * successful. If you never use any other seek function on @a file,
+ * however, you are virtually guaranteed to get at least 4kByte alignment
+ * for all reads.
+ *
+ * @note Calling this for non-buffered files is legal but inefficient.
+ *
+ * @since New in 1.9
+ */
+svn_error_t *
+svn_io_file_aligned_seek(apr_file_t *file,
+ apr_off_t block_size,
+ apr_off_t *buffer_start,
+ apr_off_t offset,
+ apr_pool_t *scratch_pool);
/** Wrapper for apr_file_write(). */
svn_error_t *
@@ -2075,6 +2250,14 @@ svn_io_file_write(apr_file_t *file,
apr_size_t *nbytes,
apr_pool_t *pool);
+/** Wrapper for apr_file_flush().
+ * @since New in 1.9
+ */
+svn_error_t *
+svn_io_file_flush(apr_file_t *file,
+ apr_pool_t *scratch_pool);
+
+
/** Wrapper for apr_file_write_full(). */
svn_error_t *
@@ -2085,6 +2268,29 @@ svn_io_file_write_full(apr_file_t *file,
apr_pool_t *pool);
/**
+ * Writes @a nbytes bytes from @a *buf to a temporary file inside the same
+ * directory as @a *final_path. Then syncs the temporary file to disk and
+ * closes the file. After this rename the temporary file to @a final_path,
+ * possibly replacing an existing file.
+ *
+ * If @a copy_perms_path is not NULL, copy the permissions applied on @a
+ * @a copy_perms_path on the temporary file before renaming.
+ *
+ * @note This function uses advanced file control operations to flush buffers
+ * to disk that aren't always accessible and can be very expensive. Avoid
+ * using this function in cases where the file should just work on any
+ * network filesystem.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_io_write_atomic(const char *final_path,
+ const void *buf,
+ apr_size_t nbytes,
+ const char* copy_perms_path,
+ apr_pool_t *scratch_pool);
+
+/**
* Open a unique file in @a dirpath, and write @a nbytes from @a buf to
* the file before flushing it to disk and closing it. Return the name
* of the newly created file in @a *tmp_path, allocated in @a pool.
diff --git a/subversion/include/svn_iter.h b/subversion/include/svn_iter.h
index ab889358a20d..78044b830a58 100644
--- a/subversion/include/svn_iter.h
+++ b/subversion/include/svn_iter.h
@@ -77,7 +77,7 @@ svn_iter_apr_hash(svn_boolean_t *completed,
void *baton,
apr_pool_t *pool);
-/** Iteration callback used in conjuction with svn_iter_apr_array().
+/** Iteration callback used in conjunction with svn_iter_apr_array().
*
* Use @a pool for temporary allocation, it's cleared between invocations.
*
diff --git a/subversion/include/svn_mergeinfo.h b/subversion/include/svn_mergeinfo.h
index ada70a200964..ad1bd47f17f0 100644
--- a/subversion/include/svn_mergeinfo.h
+++ b/subversion/include/svn_mergeinfo.h
@@ -102,7 +102,7 @@ extern "C" {
* both acceptable).
*/
-/* Suffix for SVN_PROP_MERGEINFO revision ranges indicating a given
+/** Suffix for SVN_PROP_MERGEINFO revision ranges indicating a given
range is non-inheritable. */
#define SVN_MERGEINFO_NONINHERITABLE_STR "*"
@@ -113,39 +113,44 @@ extern "C" {
*
* (a) Strings (@c svn_string_t *) containing "unparsed mergeinfo".
*
- * (b) @c svn_rangelist_t, called a "rangelist". An array of non-
- * overlapping merge ranges (@c svn_merge_range_t *), sorted as said by
- * @c svn_sort_compare_ranges(). An empty range list is represented by
- * an empty array. Unless specifically noted otherwise, all APIs require
- * rangelists that describe only forward ranges, i.e. the range's start
- * revision is less than its end revision.
+ * (b) @c svn_rangelist_t, called a "rangelist".
*
- * (c) @c svn_mergeinfo_t, called "mergeinfo". A hash mapping merge
- * source paths (@c const char *, starting with slashes) to
- * non-empty rangelist arrays. A @c NULL hash is used to represent
- * no mergeinfo and an empty hash is used to represent empty
- * mergeinfo.
+ * (c) @c svn_mergeinfo_t, called "mergeinfo".
*
- * (d) @c svn_mergeinfo_catalog_t, called a "mergeinfo catalog". A hash
- * mapping paths (@c const char *) to @c svn_mergeinfo_t.
+ * (d) @c svn_mergeinfo_catalog_t, called a "mergeinfo catalog".
*
* Both @c svn_mergeinfo_t and @c svn_mergeinfo_catalog_t are just
* typedefs for @c apr_hash_t *; there is no static type-checking, and
* you still use standard @c apr_hash_t functions to interact with
* them.
- *
- * Note that while the keys of mergeinfos are always absolute from the
- * repository root, the keys of a catalog may be relative to something
- * else, such as an RA session root.
*/
+/** An array of non-overlapping merge ranges (@c svn_merge_range_t *),
+ * sorted as said by @c svn_sort_compare_ranges(). An empty range list is
+ * represented by an empty array.
+ *
+ * Unless specifically noted otherwise, all APIs require rangelists that
+ * describe only forward ranges, i.e. the range's start revision is less
+ * than its end revision. */
typedef apr_array_header_t svn_rangelist_t;
+
+/** A hash mapping merge source paths to non-empty rangelist arrays.
+ *
+ * The keys are (@c const char *) absolute paths from the repository root,
+ * starting with slashes. A @c NULL hash represents no mergeinfo and an
+ * empty hash represents empty mergeinfo. */
typedef apr_hash_t *svn_mergeinfo_t;
+
+/** A hash mapping paths (@c const char *) to @c svn_mergeinfo_t.
+ *
+ * @note While the keys of #svn_mergeinfo_t are always absolute from the
+ * repository root, the keys of a catalog may be relative to something
+ * else, such as an RA session root.
+ * */
typedef apr_hash_t *svn_mergeinfo_catalog_t;
/** Parse the mergeinfo from @a input into @a *mergeinfo. If no
* mergeinfo is available, return an empty mergeinfo (never @c NULL).
- * Perform temporary allocations in @a pool.
*
* If @a input is not a grammatically correct @c SVN_PROP_MERGEINFO
* property, contains overlapping revision ranges of differing
@@ -160,6 +165,9 @@ typedef apr_hash_t *svn_mergeinfo_catalog_t;
* @a input may contain relative merge source paths, but these are
* converted to absolute paths in @a *mergeinfo.
*
+ * Allocate the result deeply in @a pool. Also perform temporary
+ * allocations in @a pool.
+ *
* @since New in 1.5.
*/
svn_error_t *
@@ -357,6 +365,8 @@ svn_rangelist_merge(svn_rangelist_t **rangelist,
* @c svn_merge_range_t inheritable field when comparing @a whiteboard's
* and @a *eraser's rangelists for equality. @see svn_mergeinfo_diff().
*
+ * Allocate the entire output in @a pool.
+ *
* @since New in 1.5.
*/
svn_error_t *
@@ -411,6 +421,9 @@ svn_mergeinfo_intersect(svn_mergeinfo_t *mergeinfo,
* Note: @a rangelist1 and @a rangelist2 must be sorted as said by @c
* svn_sort_compare_ranges(). @a *rangelist is guaranteed to be in sorted
* order.
+ *
+ * Allocate the entire output in @a pool.
+ *
* @since New in 1.5.
*/
svn_error_t *
@@ -444,14 +457,21 @@ svn_rangelist_to_string(svn_string_t **output,
const svn_rangelist_t *rangelist,
apr_pool_t *pool);
-/** Return a deep copy of @c svn_merge_range_t *'s in @a rangelist excluding
+/** Remove non-inheritable or inheritable revision ranges from a rangelist.
+ *
+ * Set @a *inheritable_rangelist to a deep copy of @a rangelist, excluding
* all non-inheritable @c svn_merge_range_t if @a inheritable is TRUE or
- * excluding all inheritable @c svn_merge_range_t otherwise. If @a start and
- * @a end are valid revisions and @a start is less than or equal to @a end,
- * then exclude only the non-inheritable revision ranges that intersect
- * inclusively with the range defined by @a start and @a end. If
- * @a rangelist contains no elements, return an empty array. Allocate the
- * copy in @a result_pool, use @a scratch_pool for temporary allocations.
+ * excluding all inheritable @c svn_merge_range_t otherwise.
+ *
+ * If @a start and @a end are valid revisions and @a start is less than or
+ * equal to @a end, then exclude only the (non-inheritable or inheritable)
+ * revision ranges that intersect inclusively with the range defined by
+ * @a start and @a end.
+ *
+ * If there are no remaining ranges, return an empty array.
+ *
+ * Allocate the copy in @a result_pool, and use @a scratch_pool for
+ * temporary allocations.
*
* @since New in 1.7.
*/
@@ -477,17 +497,26 @@ svn_rangelist_inheritable(svn_rangelist_t **inheritable_rangelist,
svn_revnum_t end,
apr_pool_t *pool);
-/** Return a deep copy of @a mergeinfo, excluding all non-inheritable
- * @c svn_merge_range_t if @a inheritable is TRUE or excluding all
- * inheritable @c svn_merge_range_t otherwise. If @a start and @a end
- * are valid revisions and @a start is less than or equal to @a end,
- * then exclude only the non-inheritable revisions that intersect
- * inclusively with the range defined by @a start and @a end. If @a path
- * is not NULL remove non-inheritable ranges only for @a path. If all
- * ranges are removed for a given path then remove that path as well.
- * If all paths are removed or @a rangelist is empty then set
- * @a *inheritable_rangelist to an empty array. Allocate the copy in
- * @a result_pool, use @a scratch_pool for temporary allocations.
+/** Remove non-inheritable or inheritable revision ranges from mergeinfo.
+ *
+ * Set @a *inheritable_mergeinfo to a deep copy of @a mergeinfo, excluding
+ * all non-inheritable @c svn_merge_range_t if @a inheritable is TRUE or
+ * excluding all inheritable @c svn_merge_range_t otherwise.
+ *
+ * If @a start and @a end are valid revisions and @a start is less than or
+ * equal to @a end, then exclude only the (non-inheritable or inheritable)
+ * revisions that intersect inclusively with the range defined by @a start
+ * and @a end.
+ *
+ * If @a path is not NULL remove (non-inheritable or inheritable) ranges
+ * only for @a path.
+ *
+ * If all ranges are removed for a given path then remove that path as well.
+ * If @a mergeinfo is initially empty or all paths are removed from it then
+ * set @a *inheritable_mergeinfo to an empty mergeinfo.
+ *
+ * Allocate the copy in @a result_pool, and use @a scratch_pool for
+ * temporary allocations.
*
* @since New in 1.7.
*/
diff --git a/subversion/include/svn_opt.h b/subversion/include/svn_opt.h
index 25da44fd0813..1c85b61682d3 100644
--- a/subversion/include/svn_opt.h
+++ b/subversion/include/svn_opt.h
@@ -24,8 +24,8 @@
* @brief Option and argument parsing for Subversion command lines
*/
-#ifndef SVN_OPTS_H
-#define SVN_OPTS_H
+#ifndef SVN_OPT_H
+#define SVN_OPT_H
#include <apr.h>
#include <apr_pools.h>
@@ -656,6 +656,10 @@ svn_opt_parse_all_args(apr_array_header_t **args_p,
* canonical form if @a path is in canonical form.
*
* @since New in 1.1.
+ * @since Since 1.6.5, this returns an error if @a path contains a peg
+ * specifier with no path before it, such as "@abc".
+ * @since Since 1.9.0, this no longer returns an error if @a path contains a peg
+ * specifier with no path before it, such as "@abc".
*/
svn_error_t *
svn_opt_parse_path(svn_opt_revision_t *rev,
@@ -776,4 +780,4 @@ svn_opt_print_help(apr_getopt_t *os,
}
#endif /* __cplusplus */
-#endif /* SVN_OPTS_H */
+#endif /* SVN_OPT_H */
diff --git a/subversion/include/svn_path.h b/subversion/include/svn_path.h
index 347800391987..20452c129d83 100644
--- a/subversion/include/svn_path.h
+++ b/subversion/include/svn_path.h
@@ -114,7 +114,7 @@ char *
svn_path_join(const char *base, const char *component, apr_pool_t *pool);
/** Join multiple components onto a @a base path, allocated in @a pool. The
- * components are terminated by a @c NULL.
+ * components are terminated by a @c SVN_VA_NULL.
*
* If any component is the empty string, it will be ignored.
*
@@ -131,7 +131,9 @@ svn_path_join(const char *base, const char *component, apr_pool_t *pool);
*/
SVN_DEPRECATED
char *
-svn_path_join_many(apr_pool_t *pool, const char *base, ...);
+svn_path_join_many(apr_pool_t *pool,
+ const char *base,
+ ...) SVN_NEEDS_SENTINEL_NULL;
/** Get the basename of the specified canonicalized @a path. The
@@ -716,10 +718,10 @@ svn_path_resolve_repos_relative_url(const char **absolute_url,
const char *repos_root_url,
apr_pool_t *pool);
-/* Return a copy of @a path, allocated from @a pool, for which control
- * characters have been escaped using the form \NNN (where NNN is the
+/** Return a copy of @a path, allocated from @a pool, for which control
+ * characters have been escaped using the form "\NNN" (where NNN is the
* octal representation of the byte's ordinal value).
- *
+ *
* @since New in 1.8. */
const char *
svn_path_illegal_path_escape(const char *path, apr_pool_t *pool);
diff --git a/subversion/include/svn_props.h b/subversion/include/svn_props.h
index 1f2bbbf0eb98..e920b03dee6d 100644
--- a/subversion/include/svn_props.h
+++ b/subversion/include/svn_props.h
@@ -440,13 +440,20 @@ svn_prop_name_is_valid(const char *prop_name);
* @verbatim
/trunk: 1-6,9,37-38
/trunk/foo: 10 @endverbatim
+ * @since New in 1.5.
*/
#define SVN_PROP_MERGEINFO SVN_PROP_PREFIX "mergeinfo"
-/** Property used to record inheritable configuration auto-props. */
+/** Property used to record inheritable configuration auto-props.
+ *
+ * @since New in 1.8.
+ */
#define SVN_PROP_INHERITABLE_AUTO_PROPS SVN_PROP_PREFIX "auto-props"
-/** Property used to record inheritable configuration ignores. */
+/** Property used to record inheritable configuration ignores.
+ *
+ * @since New in 1.8.
+ */
#define SVN_PROP_INHERITABLE_IGNORES SVN_PROP_PREFIX "global-ignores"
/** Meta-data properties.
@@ -671,7 +678,7 @@ svn_prop_name_is_valid(const char *prop_name);
*/
#define SVN_PROP_TXN_PREFIX SVN_PROP_PREFIX "txn-"
-/** Identifies the client version compability level. For clients
+/** Identifies the client version compatibility level. For clients
* compiled against Subversion libraries, this is @c SVN_VER_NUMBER.
* Third-party implementations are advised to use similar formatting
* for values of this property.
diff --git a/subversion/include/svn_ra.h b/subversion/include/svn_ra.h
index cf6f6129aa0f..a3ab672dda92 100644
--- a/subversion/include/svn_ra.h
+++ b/subversion/include/svn_ra.h
@@ -134,7 +134,10 @@ typedef svn_error_t *
apr_pool_t *pool);
-/** A function type for retrieving the youngest revision from a repos. */
+/** A function type for retrieving the youngest revision from a repos.
+ * @deprecated Provided for backward compatibility with the 1.8 API.
+ */
+/* ### It seems this type was never used by the API, since 1.0.0. */
typedef svn_error_t *(*svn_ra_get_latest_revnum_func_t)(
void *session_baton,
svn_revnum_t *latest_revnum);
@@ -267,6 +270,64 @@ typedef svn_error_t *(*svn_ra_replay_revfinish_callback_t)(
apr_hash_t *rev_props,
apr_pool_t *pool);
+
+/**
+ * Callback function that checks if an ra_svn tunnel called
+ * @a tunnel_name is handled by the callbakcs or the default
+ * implementation.
+ *
+ * @a tunnel_baton is the baton as originally passed to ra_open.
+ *
+ * @since New in 1.9.
+ */
+typedef svn_boolean_t (*svn_ra_check_tunnel_func_t)(
+ void *tunnel_baton, const char *tunnel_name);
+
+/**
+ * Callback function for closing a tunnel in ra_svn.
+ *
+ * This function will be called when the pool that owns the tunnel
+ * connection is cleared or destroyed.
+ *
+ * @a close_baton is the baton as returned from the
+ * svn_ra_open_tunnel_func_t.
+ *
+ * @a tunnel_baton was returned by the open-tunnel callback.
+ *
+ * @since New in 1.9.
+ */
+typedef void (*svn_ra_close_tunnel_func_t)(
+ void *close_baton, void *tunnel_baton);
+
+/**
+ * Callback function for opening a tunnel in ra_svn.
+ *
+ * Given the @a tunnel_name, tunnel @a user and server @a hostname and
+ * @a port, open a tunnel to the server and return its file handles,
+ * which are owned by @a pool, in @a request and @a response.
+ *
+ * @a request and @a response represent the standard input and output,
+ * respectively, of the process on the other end of the tunnel.
+ *
+ * If @a *close_func is set it will be called with @a close_baton when
+ * the tunnel is closed.
+ *
+ * The optional @a cancel_func callback can be invoked as usual to allow
+ * the user to preempt potentially lengthy operations.
+ *
+ * @a tunnel_baton is the baton as set in the callbacks.
+ *
+ * @since New in 1.9.
+ */
+typedef svn_error_t *(*svn_ra_open_tunnel_func_t)(
+ svn_stream_t **request, svn_stream_t **response,
+ svn_ra_close_tunnel_func_t *close_func, void **close_baton,
+ void *tunnel_baton,
+ const char *tunnel_name, const char *user,
+ const char *hostname, int port,
+ svn_cancel_func_t cancel_func, void *cancel_baton,
+ apr_pool_t *pool);
+
/**
* The update Reporter.
@@ -535,6 +596,31 @@ typedef struct svn_ra_callbacks2_t
*/
svn_ra_get_wc_contents_func_t get_wc_contents;
+ /** Check-tunnel callback
+ *
+ * If not @c NULL, and open_tunnel_func is also not @c NULL, this
+ * callback will be invoked to check if open_tunnel_func should be
+ * used to create a specific tunnel, or if the default tunnel
+ * implementation (either built-in or configured in the client
+ * configuration file) should be used instead.
+ * @since New in 1.9.
+ */
+ svn_ra_check_tunnel_func_t check_tunnel_func;
+
+ /** Open-tunnel callback
+ *
+ * If not @c NULL, this callback will be invoked to create a tunnel
+ * for a ra_svn connection that needs one, overriding any tunnel
+ * definitions in the client config file. This callback is used only
+ * for ra_svn and ignored by the other RA modules.
+ * @since New in 1.9.
+ */
+ svn_ra_open_tunnel_func_t open_tunnel_func;
+
+ /** A baton used with open_tunnel_func and close_tunnel_func.
+ * @since New in 1.9.
+ */
+ void *tunnel_baton;
} svn_ra_callbacks2_t;
/** Similar to svn_ra_callbacks2_t, except that the progress
@@ -899,6 +985,10 @@ svn_ra_rev_prop(svn_ra_session_t *session,
* Use @a pool for memory allocation.
*
* @since New in 1.5.
+ *
+ * @note Like most commit editors, the returned editor requires that the
+ * @c copyfrom_path parameter passed to its @c add_file and @c add_directory
+ * methods is a URL, not a relative path.
*/
svn_error_t *
svn_ra_get_commit_editor3(svn_ra_session_t *session,
@@ -1004,11 +1094,10 @@ svn_ra_get_file(svn_ra_session_t *session,
* callers want to know, and some don't.)
*
* If @a props is non @c NULL, set @a *props to contain the properties of
- * the directory. This means @em all properties: not just ones controlled by
- * the user and stored in the repository fs, but non-tweakable ones
- * generated by the SCM system itself (e.g. 'wcprops', 'entryprops',
- * etc.) The keys are <tt>const char *</tt>, values are
- * <tt>@c svn_string_t *</tt>.
+ * the directory, including properties that are non-tweakable and
+ * generated by the SCM system itself (such as #svn_prop_wc_kind and
+ * #svn_prop_entry_kind properties). The keys are <tt>const char *</tt>,
+ * values are <tt>@c svn_string_t *</tt>.
*
* @since New in 1.4.
*/
@@ -1463,8 +1552,8 @@ svn_ra_do_diff(svn_ra_session_t *session,
* was added or deleted). Each path is an <tt>const char *</tt>, relative
* to the @a session's common parent.
*
- * If @a limit is non-zero only invoke @a receiver on the first @a limit
- * logs.
+ * If @a limit is greater than zero only invoke @a receiver on the first
+ * @a limit logs.
*
* If @a discover_changed_paths, then each call to @a receiver passes a
* <tt>const apr_hash_t *</tt> for the receiver's @a changed_paths argument;
@@ -1507,7 +1596,6 @@ svn_ra_do_diff(svn_ra_session_t *session,
*
* @since New in 1.5.
*/
-
svn_error_t *
svn_ra_get_log2(svn_ra_session_t *session,
const apr_array_header_t *paths,
@@ -1708,6 +1796,12 @@ svn_ra_get_location_segments(svn_ra_session_t *session,
* to support reversion of the revision range for @a include_merged_revision
* @c FALSE reporting by switching @a end with @a start.
*
+ * @note Prior to Subversion 1.9, this function may request delta handlers
+ * from @a handler even for empty text deltas. Starting with 1.9, the
+ * delta handler / baton return arguments passed to @a handler will be
+ * #NULL unless there is an actual difference in the file contents between
+ * the current and the previous call.
+ *
* @since New in 1.5.
*/
svn_error_t *
@@ -1811,8 +1905,12 @@ svn_ra_unlock(svn_ra_session_t *session,
/**
* If @a path is locked, set @a *lock to an svn_lock_t which
- * represents the lock, allocated in @a pool. If @a path is not
- * locked, set @a *lock to NULL.
+ * represents the lock, allocated in @a pool.
+ *
+ * If @a path is not locked or does not exist in HEAD, set @a *lock to NULL.
+ *
+ * @note Before 1.9, this function could return SVN_ERR_FS_NOT_FOUND
+ * when @a path didn't exist in HEAD on specific ra layers.
*
* @since New in 1.2.
*/
diff --git a/subversion/include/svn_ra_svn.h b/subversion/include/svn_ra_svn.h
index 9c556b8b87e7..c968e400805f 100644
--- a/subversion/include/svn_ra_svn.h
+++ b/subversion/include/svn_ra_svn.h
@@ -165,9 +165,9 @@ typedef struct svn_ra_svn_item_t
typedef svn_error_t *(*svn_ra_svn_edit_callback)(void *baton);
/** Initialize a connection structure for the given socket or
- * input/output files.
+ * input/output streams.
*
- * Either @a sock or @a in_file/@a out_file must be set, not both.
+ * Either @a sock or @a in_stream/@a out_stream must be set, not both.
* @a compression_level specifies the desired network data compression
* level (zlib) from 0 (no compression) to 9 (best but slowest).
*
@@ -184,10 +184,29 @@ typedef svn_error_t *(*svn_ra_svn_edit_callback)(void *baton);
* It defines the number of bytes that must have been sent since the last
* check before the next check will be made.
*
+ * @note If @a out_stream is an wrapped apr_file_t* the backing file will be
+ * used for some operations.
+ *
* Allocate the result in @a pool.
*
+ * @since New in 1.9
+ */
+svn_ra_svn_conn_t *svn_ra_svn_create_conn4(apr_socket_t *sock,
+ svn_stream_t *in_stream,
+ svn_stream_t *out_stream,
+ int compression_level,
+ apr_size_t zero_copy_limit,
+ apr_size_t error_check_interval,
+ apr_pool_t *result_pool);
+
+
+/** Similar to svn_ra_svn_create_conn4() but only supports apr_file_t handles
+ * instead of the more generic streams.
+ *
* @since New in 1.8
+ * @deprecated Provided for backward compatibility with the 1.8 API.
*/
+SVN_DEPRECATED
svn_ra_svn_conn_t *svn_ra_svn_create_conn3(apr_socket_t *sock,
apr_file_t *in_file,
apr_file_t *out_file,
@@ -268,6 +287,12 @@ svn_ra_svn_conn_remote_host(svn_ra_svn_conn_t *conn);
*
* Upon successful completion of the edit, the editor will invoke @a callback
* with @a callback_baton as an argument.
+ *
+ * @note The @c copyfrom_path parameter passed to the @c add_file and
+ * @c add_directory methods of the returned editor may be either a URL or a
+ * relative path, and is transferred verbatim to the receiving end of the
+ * connection. See svn_ra_svn_drive_editor2() for information on the
+ * receiving end of the connection.
*/
void
svn_ra_svn_get_editor(const svn_delta_editor_t **editor,
@@ -283,6 +308,13 @@ svn_ra_svn_get_editor(const svn_delta_editor_t **editor,
* if @a for_replay is TRUE.
*
* @since New in 1.4.
+ *
+ * @note The @c copyfrom_path parameter passed to the @c add_file and
+ * @c add_directory methods of the receiving editor will be canonicalized
+ * either as a URL or as a relative path (starting with a slash) according
+ * to which kind was sent by the driving end of the connection. See
+ * svn_ra_svn_get_editor() for information on the driving end of the
+ * connection.
*/
svn_error_t *
svn_ra_svn_drive_editor2(svn_ra_svn_conn_t *conn,
diff --git a/subversion/include/svn_repos.h b/subversion/include/svn_repos.h
index 6ffa84257ba0..45b7a8fe579b 100644
--- a/subversion/include/svn_repos.h
+++ b/subversion/include/svn_repos.h
@@ -66,20 +66,12 @@ enum svn_node_action
svn_node_action_replace
};
-/** The different policies for processing the UUID in the dumpfile. */
-enum svn_repos_load_uuid
-{
- /** only update uuid if the repos has no revisions. */
- svn_repos_load_uuid_default,
- /** never update uuid. */
- svn_repos_load_uuid_ignore,
- /** always update uuid. */
- svn_repos_load_uuid_force
-};
-
-/** Callback type for checking authorization on paths produced by (at
- * least) svn_repos_dir_delta2().
+/** @defgroup svn_repos_authz_callbacks Repository authorization callbacks
+ * @{
+ */
+
+/** Callback type for checking authorization on a path.
*
* Set @a *allowed to TRUE to indicate that some operation is
* authorized for @a path in @a root, or set it to FALSE to indicate
@@ -167,24 +159,13 @@ typedef svn_error_t *(*svn_repos_authz_callback_t)
void *baton,
apr_pool_t *pool);
-/**
- * Similar to #svn_file_rev_handler_t, but without the @a
- * result_of_merge parameter.
- *
- * @deprecated Provided for backward compatibility with 1.4 API.
- * @since New in 1.1.
+/** @} */
+
+
+/** @defgroup svn_repos_notifications Repository notifications
+ * @{
*/
-typedef svn_error_t *(*svn_repos_file_rev_handler_t)
- (void *baton,
- const char *path,
- svn_revnum_t rev,
- apr_hash_t *rev_props,
- svn_txdelta_window_handler_t *delta_handler,
- void **delta_baton,
- apr_array_header_t *prop_diffs,
- apr_pool_t *pool);
-
/* Notification system. */
/** The type of action occurring.
@@ -251,11 +232,22 @@ typedef enum svn_repos_notify_action_t
svn_repos_notify_load_skipped_rev,
/** The structure of a revision is being verified. @since New in 1.8. */
- svn_repos_notify_verify_rev_structure
+ svn_repos_notify_verify_rev_structure,
+
+ /** A revprop shard got packed. @since New in 1.9. */
+ svn_repos_notify_pack_revprops,
+ /** A non-packed revprop shard got removed. @since New in 1.9. */
+ svn_repos_notify_cleanup_revprops,
+
+ /** The repository format got bumped. @since New in 1.9. */
+ svn_repos_notify_format_bumped,
+
+ /** A revision range was copied. @since New in 1.9. */
+ svn_repos_notify_hotcopy_rev_range
} svn_repos_notify_action_t;
-/** The type of error occurring.
+/** The type of warning occurring.
*
* @since New in 1.7.
*/
@@ -273,8 +265,33 @@ typedef enum svn_repos_notify_warning_t
* @see svn_fs.h:"Directory entry names and directory paths" */
/* ### TODO(doxygen): make that a proper doxygen link */
/* See svn_fs__path_valid(). */
- svn_repos_notify_warning_invalid_fspath
+ svn_repos_notify_warning_invalid_fspath,
+
+ /**
+ * Detected a name collision. Reported when the names of two or more
+ * entries in the same directory differ only in character
+ * representation (normalization), but are otherwise identical.
+ *
+ * @since New in 1.9.
+ */
+ svn_repos_notify_warning_name_collision,
+ /**
+ * Detected a mergeinfo path collision. Reported when the paths in
+ * two or more entries in the same svn:mergeinfo property differ
+ * only in character representation (normalization), but are
+ * otherwise identical.
+ *
+ * @since New in 1.9.
+ */
+ svn_repos_notify_warning_mergeinfo_collision,
+
+ /**
+ * Detected invalid mergeinfo.
+ *
+ * @since New in 1.9.
+ */
+ svn_repos_notify_warning_invalid_mergeinfo
} svn_repos_notify_warning_t;
/**
@@ -295,25 +312,30 @@ typedef struct svn_repos_notify_t
svn_repos_notify_action_t action;
/** For #svn_repos_notify_dump_rev_end and #svn_repos_notify_verify_rev_end,
- * the revision which just completed. */
+ * the revision which just completed.
+ * For #svn_fs_upgrade_format_bumped, the new format version. */
svn_revnum_t revision;
- /** For #svn_repos_notify_warning, the warning object. */
+ /** For #svn_repos_notify_warning, the warning message. */
const char *warning_str;
+ /** For #svn_repos_notify_warning, the warning type. */
svn_repos_notify_warning_t warning;
/** For #svn_repos_notify_pack_shard_start,
#svn_repos_notify_pack_shard_end,
+ #svn_repos_notify_pack_revprops,
+ #svn_repos_notify_cleanup_revprops
#svn_repos_notify_pack_shard_start_revprop, and
#svn_repos_notify_pack_shard_end_revprop, the shard processed. */
apr_int64_t shard;
- /** For #svn_repos_notify_load_node_done, the revision committed. */
+ /** For #svn_repos_notify_load_txn_committed, the revision committed. */
svn_revnum_t new_revision;
- /** For #svn_repos_notify_load_node_done, the source revision, if
+ /** For #svn_repos_notify_load_txn_committed, the source revision, if
different from @a new_revision, otherwise #SVN_INVALID_REVNUM.
- For #svn_repos_notify_load_txn_start, the source revision. */
+ For #svn_repos_notify_load_txn_start and
+ #svn_repos_notify_load_skipped_rev, the source revision. */
svn_revnum_t old_revision;
/** For #svn_repos_notify_load_node_start, the action being taken on the
@@ -323,6 +345,16 @@ typedef struct svn_repos_notify_t
/** For #svn_repos_notify_load_node_start, the path of the node. */
const char *path;
+ /** For #svn_repos_notify_hotcopy_rev_range, the start of the copied
+ revision range.
+ @since New in 1.9. */
+ svn_revnum_t start_revision;
+
+ /** For #svn_repos_notify_hotcopy_rev_range, the end of the copied
+ revision range (might be the same as @a start_revision).
+ @since New in 1.9. */
+ svn_revnum_t end_revision;
+
/* NOTE: Add new fields at the end to preserve binary compatibility.
Also, if you add fields here, you have to update
svn_repos_notify_create(). */
@@ -347,7 +379,9 @@ svn_repos_notify_t *
svn_repos_notify_create(svn_repos_notify_action_t action,
apr_pool_t *result_pool);
-
+ /** @} */
+
+
/** The repository object. */
typedef struct svn_repos_t svn_repos_t;
@@ -366,16 +400,31 @@ svn_repos_find_root_path(const char *path,
/** Set @a *repos_p to a repository object for the repository at @a path.
*
- * Allocate @a *repos_p in @a pool.
+ * Allocate @a *repos_p in @a result_pool.
*
* Acquires a shared lock on the repository, and attaches a cleanup
- * function to @a pool to remove the lock. If no lock can be acquired,
+ * function to @a result_pool to remove the lock. If no lock can be acquired,
* returns error, with undefined effect on @a *repos_p. If an exclusive
* lock is present, this blocks until it's gone. @a fs_config will be
* passed to the filesystem initialization function and may be @c NULL.
*
+ * Use @a scratch_pool for temporary allocations.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_repos_open3(svn_repos_t **repos_p,
+ const char *path,
+ apr_hash_t *fs_config,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/** Similar to svn_repos_open3() but without @a scratch_pool.
+ *
+ * @deprecated Provided for backward compatibility with 1.8 API.
* @since New in 1.7.
*/
+SVN_DEPRECATED
svn_error_t *
svn_repos_open2(svn_repos_t **repos_p,
const char *path,
@@ -478,6 +527,11 @@ svn_error_t *
svn_repos_delete(const char *path,
apr_pool_t *pool);
+
+/** @defgroup svn_repos_capabilities Repository capabilities
+ * @{
+ */
+
/**
* Set @a *has to TRUE if @a repos has @a capability (one of the
* capabilities beginning with @c "SVN_REPOS_CAPABILITY_"), else set
@@ -496,7 +550,27 @@ svn_repos_has_capability(svn_repos_t *repos,
const char *capability,
apr_pool_t *pool);
-/** @} */
+/**
+ * Return a set of @a capabilities supported by the running Subversion
+ * library and by @a repos. (Capabilities supported by this version of
+ * Subversion but not by @a repos are not listed. This may happen when
+ * svn_repos_upgrade2() has not been called after a software upgrade.)
+ *
+ * The set is represented as a hash whose const char * keys are the set
+ * members. The values are not defined.
+ *
+ * Allocate @a capabilities in @a result_pool and use @a scratch_pool for
+ * temporary allocations.
+ *
+ * @see svn_repos_info_format
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_repos_capabilities(apr_hash_t **capabilities,
+ svn_repos_t *repos,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
/**
* The capability of doing the right thing with merge-tracking
@@ -516,11 +590,46 @@ svn_repos_has_capability(svn_repos_t *repos,
* If you add a capability, update svn_repos_capabilities().
*/
+/** @} */
+
+
+/**
+ * Store in @a repos the client-reported capabilities @a capabilities,
+ * which must be allocated in memory at least as long-lived as @a repos.
+ *
+ * The elements of @a capabilities are 'const char *', a subset of
+ * the constants beginning with @c SVN_RA_CAPABILITY_.
+ * @a capabilities is not copied, so changing it later will affect
+ * what is remembered by @a repos.
+ *
+ * @note The capabilities are passed along to the start-commit hook;
+ * see that hook's template for details.
+ *
+ * @note As of Subversion 1.5, there are no error conditions defined,
+ * so this always returns SVN_NO_ERROR. In future releases it may
+ * return error, however, so callers should check.
+ *
+ * @since New in 1.5.
+ */
+svn_error_t *
+svn_repos_remember_client_capabilities(svn_repos_t *repos,
+ const apr_array_header_t *capabilities);
+
/** Return the filesystem associated with repository object @a repos. */
svn_fs_t *
svn_repos_fs(svn_repos_t *repos);
+/** Return the type of filesystem associated with repository object
+ * @a repos allocated in @a result_pool.
+ *
+ * @see #svn_fs_backend_names
+ *
+ * @since New in 1.9.
+ */
+const char *
+svn_repos_fs_type(svn_repos_t *repos,
+ apr_pool_t *result_pool);
/** Make a hot copy of the Subversion repository found at @a src_path
* to @a dst_path.
@@ -535,8 +644,41 @@ svn_repos_fs(svn_repos_t *repos);
* already present in the destination. If incremental hotcopy is not
* implemented by the filesystem backend, raise SVN_ERR_UNSUPPORTED_FEATURE.
*
+ * For each revision range copied, the @a notify_func function will be
+ * called with the @a notify_baton and a notification structure containing
+ * appropriate values in @c start_revision and @c end_revision (both
+ * inclusive). @c start_revision might be equal to @c end_revision in
+ * case the copied range consists of a single revision. Currently, this
+ * notification is not triggered by the BDB backend. @a notify_func
+ * may be @c NULL if this notification is not required.
+ *
+ * The optional @a cancel_func callback will be invoked with
+ * @a cancel_baton as usual to allow the user to preempt this potentially
+ * lengthy operation.
+ *
+ * Use @a scratch_pool for temporary allocations.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_repos_hotcopy3(const char *src_path,
+ const char *dst_path,
+ svn_boolean_t clean_logs,
+ svn_boolean_t incremental,
+ svn_repos_notify_func_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+/**
+ * Like svn_repos_hotcopy3(), but with @a notify_func and @a notify_baton
+ * always passed as @c NULL.
+ *
* @since New in 1.8.
+ * @deprecated Provided for backward compatibility with the 1.8 API.
*/
+SVN_DEPRECATED
svn_error_t *
svn_repos_hotcopy2(const char *src_path,
const char *dst_path,
@@ -682,6 +824,11 @@ typedef svn_error_t *(*svn_repos_freeze_func_t)(void *baton, apr_pool_t *pool);
* FS backend the repository uses. Repositories are locked in the
* order in which they are specified in the array.
*
+ * @note @a freeze_func must not, directly or indirectly, call any function
+ * that attempts to take out a lock on the underlying repository. These
+ * include functions for packing, hotcopying, setting revprops and commits.
+ * Attempts to do so may result in a deadlock.
+ *
* @note On some platforms the exclusive lock does not exclude other
* threads in the same process so this function should only be called
* by a single threaded process, or by a multi-threaded process when
@@ -879,7 +1026,7 @@ svn_repos_hooks_setenv(svn_repos_t *repos,
* when using larger values here. Pass 0 for @a zero_copy_limit to
* disable this optimization altogether.
*
- * @a note Never activate this optimization if @a editor might access
+ * @note Never activate this optimization if @a editor might access
* any FSFS data structures (and, hence, caches). So, it is basically
* safe for networked editors only.
*
@@ -1355,10 +1502,9 @@ svn_repos_replay(svn_fs_root_t *root,
* filesystem of @a repos, beginning at location 'rev:@a base_path',
* where "rev" is the argument given to open_root().
*
- * @a repos is a previously opened repository. @a repos_url is the
+ * @a repos is a previously opened repository. @a repos_url_decoded is the
* decoded URL to the base of the repository, and is used to check
- * copyfrom paths. copyfrom paths passed to the editor must be full,
- * URI-encoded, URLs. @a txn is a filesystem transaction object to use
+ * copyfrom paths. @a txn is a filesystem transaction object to use
* during the commit, or @c NULL to indicate that this function should
* create (and fully manage) a new transaction.
*
@@ -1380,29 +1526,34 @@ svn_repos_replay(svn_fs_root_t *root,
* If @a commit_callback is non-NULL, then before @c close_edit returns (but
* after the commit has succeeded) @c close_edit will invoke
* @a commit_callback with a filled-in #svn_commit_info_t *, @a commit_baton,
- * and @a pool or some subpool thereof as arguments. If @a commit_callback
+ * and @a pool or some subpool thereof as arguments. The @c repos_root field
+ * of the #svn_commit_info_t is @c NULL. If @a commit_callback
* returns an error, that error will be returned from @c close_edit,
* otherwise if there was a post-commit hook failure, then that error
* will be returned with code SVN_ERR_REPOS_POST_COMMIT_HOOK_FAILED.
- * (Note that prior to Subversion 1.6, @a commit_callback cannot be NULL; if
- * you don't need a callback, pass a dummy function.)
+ * (Note that prior to Subversion 1.6, @a commit_callback cannot be @c NULL;
+ * if you don't need a callback, pass a dummy function.)
*
* Calling @a (*editor)->abort_edit aborts the commit, and will also
* abort the commit transaction unless @a txn was supplied (not @c
* NULL). Callers who supply their own transactions are responsible
* for cleaning them up (either by committing them, or aborting them).
*
- * @since New in 1.5.
+ * @since New in 1.5. Since 1.6, @a commit_callback can be @c NULL.
*
- * @note Yes, @a repos_url is a <em>decoded</em> URL. We realize
+ * @note Yes, @a repos_url_decoded is a <em>decoded</em> URL. We realize
* that's sorta wonky. Sorry about that.
+ *
+ * @note Like most commit editors, the returned editor requires that the
+ * @c copyfrom_path parameter passed to its @c add_file and @c add_directory
+ * methods is a full, URI-encoded URL, not a relative path.
*/
svn_error_t *
svn_repos_get_commit_editor5(const svn_delta_editor_t **editor,
void **edit_baton,
svn_repos_t *repos,
svn_fs_txn_t *txn,
- const char *repos_url,
+ const char *repos_url_decoded,
const char *base_path,
apr_hash_t *revprop_table,
svn_commit_callback2_t commit_callback,
@@ -1709,16 +1860,6 @@ svn_repos_node_location_segments(svn_repos_t *repos,
apr_pool_t *pool);
-/* ### other queries we can do someday --
-
- * fetch the last revision created by <user>
- (once usernames become revision properties!)
- * fetch the last revision where <path> was modified
-
-*/
-
-
-
/* ---------------------------------------------------------------*/
/* Retrieving log messages. */
@@ -1740,7 +1881,7 @@ svn_repos_node_location_segments(svn_repos_t *repos,
* show all revisions regardless of what paths were changed in those
* revisions.
*
- * If @a limit is non-zero then only invoke @a receiver on the first
+ * If @a limit is greater than zero then only invoke @a receiver on the first
* @a limit logs.
*
* If @a discover_changed_paths, then each call to @a receiver passes a
@@ -1946,6 +2087,12 @@ svn_repos_fs_get_mergeinfo(svn_mergeinfo_catalog_t *catalog,
* the revision range for @a include_merged_revision @c FALSE reporting by
* switching @a start with @a end.
*
+ * @note Prior to Subversion 1.9, this function may request delta handlers
+ * from @a handler even for empty text deltas. Starting with 1.9, the
+ * delta handler / baton return arguments passed to @a handler will be
+ * #NULL unless there is an actual difference in the file contents between
+ * the current and the previous call.
+ *
* @since New in 1.5.
*/
svn_error_t *
@@ -1961,6 +2108,23 @@ svn_repos_get_file_revs2(svn_repos_t *repos,
apr_pool_t *pool);
/**
+ * Similar to #svn_file_rev_handler_t, but without the @a
+ * result_of_merge parameter.
+ *
+ * @deprecated Provided for backward compatibility with 1.4 API.
+ * @since New in 1.1.
+ */
+typedef svn_error_t *(*svn_repos_file_rev_handler_t)
+ (void *baton,
+ const char *path,
+ svn_revnum_t rev,
+ apr_hash_t *rev_props,
+ svn_txdelta_window_handler_t *delta_handler,
+ void **delta_baton,
+ apr_array_header_t *prop_diffs,
+ apr_pool_t *pool);
+
+/**
* Similar to svn_repos_get_file_revs2(), with @a include_merged_revisions
* set to FALSE.
*
@@ -2087,19 +2251,50 @@ svn_repos_fs_begin_txn_for_update(svn_fs_txn_t **txn_p,
* @{
*/
-/** Like svn_fs_lock(), but invoke the @a repos's pre- and
- * post-lock hooks before and after the locking action. Use @a pool
- * for any necessary allocations.
+/** Like svn_fs_lock_many(), but invoke the @a repos's pre- and
+ * post-lock hooks before and after the locking action.
+ *
+ * The pre-lock is run for every path in @a targets. Those targets for
+ * which the pre-lock is successful are passed to svn_fs_lock_many and
+ * the post-lock is run for those that are successfully locked.
+ * Pre-lock hook errors are passed to @a lock_callback.
*
- * If the pre-lock hook or svn_fs_lock() fails, throw the original
- * error to caller. If an error occurs when running the post-lock
- * hook, return the original error wrapped with
- * SVN_ERR_REPOS_POST_LOCK_HOOK_FAILED. If the caller sees this
- * error, it knows that the lock succeeded anyway.
+ * For each path in @a targets @a lock_callback will be invoked
+ * passing @a lock_baton and the lock and error that apply to path.
+ * @a lock_callback can be NULL in which case it is not called and any
+ * errors that would have been passed to the callback are not reported.
+ *
+ * If an error occurs when running the post-lock hook the error is
+ * returned wrapped with #SVN_ERR_REPOS_POST_LOCK_HOOK_FAILED. If the
+ * caller sees this error, it knows that some locks succeeded.
*
* The pre-lock hook may cause a different token to be used for the
- * lock, instead of @a token; see the pre-lock-hook documentation for
- * more.
+ * lock, instead of the token supplied; see the pre-lock-hook
+ * documentation for more.
+ *
+ * The lock and path passed to @a lock_callback will be allocated in
+ * @a result_pool. Use @a scratch_pool for temporary allocations.
+ *
+ * @note This function is not atomic. If it returns an error, some targets
+ * may remain unlocked while others may have been locked.
+ *
+ * @see svn_fs_lock_many
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_repos_fs_lock_many(svn_repos_t *repos,
+ apr_hash_t *lock_targets,
+ const char *comment,
+ svn_boolean_t is_dav_comment,
+ apr_time_t expiration_date,
+ svn_boolean_t steal_lock,
+ svn_fs_lock_callback_t lock_callback,
+ void *lock_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/** Similar to svn_repos_fs_lock_many() but locks only a single path.
*
* @since New in 1.2.
*/
@@ -2116,15 +2311,46 @@ svn_repos_fs_lock(svn_lock_t **lock,
apr_pool_t *pool);
-/** Like svn_fs_unlock(), but invoke the @a repos's pre- and
- * post-unlock hooks before and after the unlocking action. Use @a
- * pool for any necessary allocations.
+/** Like svn_fs_unlock_many(), but invoke the @a repos's pre- and
+ * post-unlock hooks before and after the unlocking action.
+ *
+ * The pre-unlock hook is run for every path in @a targets. Those
+ * targets for which the pre-unlock is successful are passed to
+ * svn_fs_unlock_many and the post-unlock is run for those that are
+ * successfully unlocked. Pre-unlock hook errors are passed to @a
+ * lock_callback.
+ *
+ * For each path in @a targets @a lock_callback will be invoked
+ * passing @a lock_baton and error that apply to path. The lock
+ * passed to the callback will be NULL. @a lock_callback can be NULL
+ * in which case it is not called and any errors that would have been
+ * passed to the callback are not reported.
+ *
+ * If an error occurs when running the post-unlock hook, return the
+ * original error wrapped with #SVN_ERR_REPOS_POST_UNLOCK_HOOK_FAILED.
+ * If the caller sees this error, it knows that some unlocks
+ * succeeded.
+ *
+ * The path passed to @a lock_callback will be allocated in @a result_pool.
+ * Use @a scratch_pool for temporary allocations.
*
- * If the pre-unlock hook or svn_fs_unlock() fails, throw the original
- * error to caller. If an error occurs when running the post-unlock
- * hook, return the original error wrapped with
- * SVN_ERR_REPOS_POST_UNLOCK_HOOK_FAILED. If the caller sees this
- * error, it knows that the unlock succeeded anyway.
+ * @note This function is not atomic. If it returns an error, some targets
+ * may remain locked while others may have been unlocked.
+ *
+ * @see svn_fs_unlock_many
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_repos_fs_unlock_many(svn_repos_t *repos,
+ apr_hash_t *unlock_targets,
+ svn_boolean_t break_lock,
+ svn_fs_lock_callback_t lock_callback,
+ void *lock_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/** Similar to svn_repos_fs_unlock_many() but only unlocks a single path.
*
* @since New in 1.2.
*/
@@ -2178,6 +2404,12 @@ svn_repos_fs_get_locks(apr_hash_t **locks,
/** @} */
+/** @defgroup svn_repos_properties Versioned and Unversioned Properties
+ *
+ * Prop-changing and prop-reading wrappers for libsvn_fs routines.
+ * @{
+ */
+
/**
* Like svn_fs_change_rev_prop2(), but validate the name and value of the
* property and invoke the @a repos's pre- and post-revprop-change hooks
@@ -2210,12 +2442,9 @@ svn_repos_fs_change_rev_prop4(svn_repos_t *repos,
const char *name,
const svn_string_t *const *old_value_p,
const svn_string_t *new_value,
- svn_boolean_t
- use_pre_revprop_change_hook,
- svn_boolean_t
- use_post_revprop_change_hook,
- svn_repos_authz_func_t
- authz_read_func,
+ svn_boolean_t use_pre_revprop_change_hook,
+ svn_boolean_t use_post_revprop_change_hook,
+ svn_repos_authz_func_t authz_read_func,
void *authz_read_baton,
apr_pool_t *pool);
@@ -2234,12 +2463,9 @@ svn_repos_fs_change_rev_prop3(svn_repos_t *repos,
const char *author,
const char *name,
const svn_string_t *new_value,
- svn_boolean_t
- use_pre_revprop_change_hook,
- svn_boolean_t
- use_post_revprop_change_hook,
- svn_repos_authz_func_t
- authz_read_func,
+ svn_boolean_t use_pre_revprop_change_hook,
+ svn_boolean_t use_post_revprop_change_hook,
+ svn_repos_authz_func_t authz_read_func,
void *authz_read_baton,
apr_pool_t *pool);
@@ -2257,8 +2483,7 @@ svn_repos_fs_change_rev_prop2(svn_repos_t *repos,
const char *author,
const char *name,
const svn_string_t *new_value,
- svn_repos_authz_func_t
- authz_read_func,
+ svn_repos_authz_func_t authz_read_func,
void *authz_read_baton,
apr_pool_t *pool);
@@ -2299,8 +2524,7 @@ svn_repos_fs_revision_prop(svn_string_t **value_p,
svn_repos_t *repos,
svn_revnum_t rev,
const char *propname,
- svn_repos_authz_func_t
- authz_read_func,
+ svn_repos_authz_func_t authz_read_func,
void *authz_read_baton,
apr_pool_t *pool);
@@ -2325,21 +2549,10 @@ svn_error_t *
svn_repos_fs_revision_proplist(apr_hash_t **table_p,
svn_repos_t *repos,
svn_revnum_t rev,
- svn_repos_authz_func_t
- authz_read_func,
+ svn_repos_authz_func_t authz_read_func,
void *authz_read_baton,
apr_pool_t *pool);
-
-
-/* ---------------------------------------------------------------*/
-
-/* Prop-changing wrappers for libsvn_fs routines. */
-
-/* NOTE: svn_repos_fs_change_rev_prop() also exists, but is located
- above with the hook-related functions. */
-
-
/** Validating wrapper for svn_fs_change_node_prop() (which see for
* argument descriptions).
*
@@ -2348,9 +2561,9 @@ svn_repos_fs_revision_proplist(apr_hash_t **table_p,
* @a value and return SVN_ERR_BAD_PROPERTY_VALUE if it is invalid for the
* property.
*
- * @note Currently, the only properties validated are the "svn:" properties
- * #SVN_PROP_REVISION_LOG and #SVN_PROP_REVISION_DATE. This may change
- * in future releases.
+ * @note Originally, the only properties validated were the "svn:" properties
+ * #SVN_PROP_REVISION_LOG and #SVN_PROP_REVISION_DATE. For the current
+ * validation rules see the private function svn_repos__validate_prop().
*/
svn_error_t *
svn_repos_fs_change_node_prop(svn_fs_root_t *root,
@@ -2359,6 +2572,36 @@ svn_repos_fs_change_node_prop(svn_fs_root_t *root,
const svn_string_t *value,
apr_pool_t *pool);
+/**
+ * Set @a *inherited_values to a depth-first ordered array of
+ * #svn_prop_inherited_item_t * structures (the path_or_url members of
+ * which are relative filesystem paths) representing the properties
+ * inherited by @a path in @a root. If no properties are inherited,
+ * then set @a *inherited_values to an empty array.
+ *
+ * if @a propname is NULL then retrieve all explicit and/or inherited
+ * properties. Otherwise retrieve only the properties named @a propname.
+ *
+ * If optional @a authz_read_func is non-NULL, then use this function
+ * (along with optional @a authz_read_baton) to check the readability
+ * of each parent path from which properties are inherited. Silently omit
+ * properties for unreadable parent paths.
+ *
+ * Allocate @a *inherited_props in @a result_pool. Use @a scratch_pool for
+ * temporary allocations.
+ *
+ * @since New in 1.8.
+ */
+svn_error_t *
+svn_repos_fs_get_inherited_props(apr_array_header_t **inherited_props,
+ svn_fs_root_t *root,
+ const char *path,
+ const char *propname,
+ svn_repos_authz_func_t authz_read_func,
+ void *authz_read_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
/** Validating wrapper for svn_fs_change_txn_prop() (which see for
* argument descriptions). See svn_repos_fs_change_txn_props() for more
* information.
@@ -2380,6 +2623,8 @@ svn_repos_fs_change_txn_props(svn_fs_txn_t *txn,
const apr_array_header_t *props,
apr_pool_t *pool);
+/** @} */
+
/* ---------------------------------------------------------------*/
@@ -2470,12 +2715,34 @@ svn_repos_node_editor(const svn_delta_editor_t **editor,
svn_repos_node_t *
svn_repos_node_from_baton(void *edit_baton);
+/**
+ * Return repository format information for @a repos.
+ *
+ * Set @a *repos_format to the repository format number of @a repos, which is
+ * an integer that increases when incompatible changes are made (such as
+ * by #svn_repos_upgrade2).
+ *
+ * Set @a *supports_version to the version number of the minimum Subversion
+ * GA release that can read and write @a repos; allocate it in
+ * @a result_pool. Use @a scratch_pool for temporary allocations.
+ *
+ * @see svn_fs_info_format, svn_repos_capabilities
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_repos_info_format(int *repos_format,
+ svn_version_t **supports_version,
+ svn_repos_t *repos,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
/** @} */
/* ---------------------------------------------------------------*/
/**
- * @defgroup svn_repos_dump_load Dumping and loading filesystem data
+ * @defgroup svn_repos_dump_load Dumping, loading and verifying filesystem data
* @{
*
* The filesystem 'dump' format contains nothing but the abstract
@@ -2539,26 +2806,132 @@ svn_repos_node_from_baton(void *edit_baton);
#define SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_CHECKSUM \
SVN_REPOS_DUMPFILE_TEXT_DELTA_BASE_MD5
-/**
- * Verify the contents of the file system in @a repos.
+/** The different policies for processing the UUID in the dumpfile. */
+enum svn_repos_load_uuid
+{
+ /** only update uuid if the repos has no revisions. */
+ svn_repos_load_uuid_default,
+ /** never update uuid. */
+ svn_repos_load_uuid_ignore,
+ /** always update uuid. */
+ svn_repos_load_uuid_force
+};
+
+/** Callback type for use with svn_repos_verify_fs3(). @a revision
+ * and @a verify_err are the details of a single verification failure
+ * that occurred during the svn_repos_verify_fs3() call. @a baton is
+ * the same baton given to svn_repos_verify_fs3(). @a scratch_pool is
+ * provided for the convenience of the implementor, who should not
+ * expect it to live longer than a single callback call.
*
- * If @a feedback_stream is not @c NULL, write feedback to it (lines of
- * the form "* Verified revision %ld\n").
+ * @a verify_err will be cleared and becomes invalid after the callback
+ * returns, use svn_error_dup() to preserve the error. If a callback uses
+ * @a verify_err as the return value or as a part of the return value, it
+ * should also call svn_error_dup() for @a verify_err. Implementors of this
+ * callback are forbidden to call svn_error_clear() for @a verify_err.
+ *
+ * @see svn_repos_verify_fs3
*
- * If @a start_rev is #SVN_INVALID_REVNUM, then start verifying at
- * revision 0. If @a end_rev is #SVN_INVALID_REVNUM, then verify
- * through the @c HEAD revision.
+ * @since New in 1.9.
+ */
+typedef svn_error_t *(*svn_repos_verify_callback_t)(void *baton,
+ svn_revnum_t revision,
+ svn_error_t *verify_err,
+ apr_pool_t *scratch_pool);
+
+/**
+ * Verify the contents of the file system in @a repos.
*
- * For every verified revision call @a notify_func with @a rev set to
- * the verified revision and @a warning_text @c NULL. For warnings call @a
- * notify_func with @a warning_text set.
+ * Verify the revisions from @a start_rev to @a end_rev inclusive. If
+ * @a start_rev is #SVN_INVALID_REVNUM, start at revision 0; if @a end_rev
+ * is #SVN_INVALID_REVNUM, end at the head revision. @a start_rev must be
+ * older than or equal to @a end_rev. If revision 0 is included in the
+ * range, then also verify "global invariants" of the repository, as
+ * described in svn_fs_verify().
+ *
+ * If @a check_normalization is @c TRUE, report any name collisions
+ * within the same directory or svn:mergeinfo property where the names
+ * differ only in character representation, but are otherwise
+ * identical.
+ *
+ * If @a metadata_only is @c TRUE, backends that have a concept of separate
+ * metadata verification will only perform that and skip the more expensive
+ * file context reconstruction and verification. For FSFS format 7+ and
+ * FSX, this allows for a very fast check against external corruption.
+ *
+ * If @a verify_callback is not @c NULL, call it with @a verify_baton upon
+ * receiving an FS-specific structure failure or a revision verification
+ * failure. Set @c revision callback argument to #SVN_INVALID_REVNUM or
+ * to the revision number respectively. Set @c verify_err to svn_error_t
+ * describing the reason of the failure. @c verify_err will be cleared
+ * after the callback returns, use svn_error_dup() to preserve the error.
+ * If @a verify_callback returns an error different from #SVN_NO_ERROR,
+ * stop verifying the repository and immediately return the error from
+ * @a verify_callback.
+ *
+ * If @a verify_callback is @c NULL, this function returns the first
+ * encountered verification error or #SVN_NO_ERROR if there were no failures
+ * during the verification. Errors that prevent the verification process
+ * from continuing, such as #SVN_ERR_CANCELLED, are returned immediately
+ * and do not trigger an invocation of @a verify_callback.
+ *
+ * If @a notify_func is not null, then call it with @a notify_baton and
+ * with a notification structure in which the fields are set as follows.
+ * (For a warning that does not apply to a specific revision, the revision
+ * number is #SVN_INVALID_REVNUM.)
+ *
+ * For each FS-specific structure warning:
+ * @c action = svn_repos_notify_verify_rev_structure
+ * @c revision = the revision or #SVN_INVALID_REVNUM
+ *
+ * For each revision verification warning:
+ * @c action = #svn_repos_notify_warning
+ * @c warning and @c warning_str fields set accordingly
+ * ### TODO: Set @c revision = the revision?
+ *
+ * For each successfully verified revision:
+ * @c action = #svn_repos_notify_verify_rev_end
+ * @c revision = the revision
+ *
+ * At the end:
+ * @c action = svn_repos_notify_verify_end
+ * ### Do we really need a callback to tell us the function we
+ * called has reached its end and is about to return?
+ * ### Not sent, currently, if a FS structure error is found.
*
* If @a cancel_func is not @c NULL, call it periodically with @a
* cancel_baton as argument to see if the caller wishes to cancel the
* verification.
*
+ * Use @a scratch_pool for temporary allocation.
+ *
+ * @see svn_repos_verify_callback_t
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_repos_verify_fs3(svn_repos_t *repos,
+ svn_revnum_t start_rev,
+ svn_revnum_t end_rev,
+ svn_boolean_t check_normalization,
+ svn_boolean_t metadata_only,
+ svn_repos_notify_func_t notify_func,
+ void *notify_baton,
+ svn_repos_verify_callback_t verify_callback,
+ void *verify_baton,
+ svn_cancel_func_t cancel,
+ void *cancel_baton,
+ apr_pool_t *scratch_pool);
+
+/**
+ * Like svn_repos_verify_fs3(), but with @a verify_callback and
+ * @a verify_baton set to @c NULL and with @a check_normalization
+ * and @a metadata_only set to @c FALSE.
+ *
* @since New in 1.7.
+ * @deprecated Provided for backward compatibility with the 1.8 API.
*/
+SVN_DEPRECATED
svn_error_t *
svn_repos_verify_fs2(svn_repos_t *repos,
svn_revnum_t start_rev,
@@ -2571,7 +2944,10 @@ svn_repos_verify_fs2(svn_repos_t *repos,
/**
* Similar to svn_repos_verify_fs2(), but with a feedback_stream instead of
- * handling feedback via the notify_func handler
+ * handling feedback via the notify_func handler.
+ *
+ * If @a feedback_stream is not @c NULL, write feedback to it (lines of
+ * the form "* Verified revision %ld\n").
*
* @since New in 1.5.
* @deprecated Provided for backward compatibility with the 1.6 API.
@@ -2588,15 +2964,13 @@ svn_repos_verify_fs(svn_repos_t *repos,
/**
* Dump the contents of the filesystem within already-open @a repos into
- * writable @a dumpstream. Begin at revision @a start_rev, and dump every
- * revision up through @a end_rev. Use @a pool for all allocation. If
- * non-@c NULL, send feedback to @a feedback_stream. If @a dumpstream is
+ * writable @a dumpstream. If @a dumpstream is
* @c NULL, this is effectively a primitive verify. It is not complete,
- * however; svn_repos_verify_fs2() and svn_fs_verify().
+ * however; see instead svn_repos_verify_fs3().
*
- * If @a start_rev is #SVN_INVALID_REVNUM, then start dumping at revision
- * 0. If @a end_rev is #SVN_INVALID_REVNUM, then dump through the @c HEAD
- * revision.
+ * Begin at revision @a start_rev, and dump every revision up through
+ * @a end_rev. If @a start_rev is #SVN_INVALID_REVNUM, start at revision
+ * 0. If @a end_rev is #SVN_INVALID_REVNUM, end at the head revision.
*
* If @a incremental is @c TRUE, the first revision dumped will be a diff
* against the previous revision (usually it looks like a full dump of
@@ -2609,14 +2983,37 @@ svn_repos_verify_fs(svn_repos_t *repos,
* be done with full plain text. A dump with @a use_deltas set cannot
* be loaded by Subversion 1.0.x.
*
- * If @a notify_func is not @c NULL, then for every dumped revision call
- * @a notify_func with @a rev set to the dumped revision and @a warning_text
- * @c NULL. For warnings call @a notify_func with @a warning_text.
+ * If @a notify_func is not null, then call it with @a notify_baton and
+ * with a notification structure in which the fields are set as follows.
+ * (For a warning or error notification that does not apply to a specific
+ * revision, the revision number is #SVN_INVALID_REVNUM.)
+ *
+ * For each warning:
+ * @c action = #svn_repos_notify_warning
+ * @c warning and @c warning_str fields set accordingly
+ * ### TODO: Set @c revision = the revision or #SVN_INVALID_REVNUM?
+ *
+ * For each successfully dumped revision:
+ * @c action = #svn_repos_notify_dump_rev_end
+ * @c revision = the revision
+ *
+ * At the end:
+ * @c action = svn_repos_notify_verify_end
+ * ### Do we really need a callback to tell us the function we
+ * called has reached its end and is about to return?
+ *
+ * At the end, if there were certain warnings previously:
+ * @c action = #svn_repos_notify_warning
+ * @c warning and @c warning_str fields set accordingly,
+ * reiterating the existence of previous warnings
+ * ### This is a presentation issue. Caller could do this itself.
*
* If @a cancel_func is not @c NULL, it is called periodically with
* @a cancel_baton as argument to see if the client wishes to cancel
* the dump.
*
+ * Use @a scratch_pool for temporary allocation.
+ *
* @since New in 1.7.
*/
svn_error_t *
@@ -2709,6 +3106,11 @@ svn_repos_dump_fs(svn_repos_t *repos,
* node properties (those in the svn: namespace) against established
* rules for those things.
*
+ * If @a ignore_dates is set, ignore any revision datestamps found in
+ * @a dumpstream, allowing the revisions created by the load process
+ * to be stamped as if they were newly created via the normal commit
+ * process.
+ *
* If non-NULL, use @a notify_func and @a notify_baton to send notification
* of events to the caller.
*
@@ -2716,8 +3118,32 @@ svn_repos_dump_fs(svn_repos_t *repos,
* @a cancel_baton as argument to see if the client wishes to cancel
* the load.
*
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_repos_load_fs5(svn_repos_t *repos,
+ svn_stream_t *dumpstream,
+ svn_revnum_t start_rev,
+ svn_revnum_t end_rev,
+ enum svn_repos_load_uuid uuid_action,
+ const char *parent_dir,
+ svn_boolean_t use_pre_commit_hook,
+ svn_boolean_t use_post_commit_hook,
+ svn_boolean_t validate_props,
+ svn_boolean_t ignore_dates,
+ svn_repos_notify_func_t notify_func,
+ void *notify_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ apr_pool_t *pool);
+
+/** Similar to svn_repos_load_fs5(), but with @a ignore_dates
+ * always passed as FALSE.
+ *
* @since New in 1.8.
+ * @deprecated Provided for backward compatibility with the 1.8 API.
*/
+SVN_DEPRECATED
svn_error_t *
svn_repos_load_fs4(svn_repos_t *repos,
svn_stream_t *dumpstream,
@@ -2856,9 +3282,10 @@ typedef struct svn_repos_parse_fns3_t
/** For a given @a node_baton, remove all properties. */
svn_error_t *(*remove_node_props)(void *node_baton);
- /** For a given @a node_baton, receive a writable @a stream capable of
- * receiving the node's fulltext. After writing the fulltext, call
- * the stream's close() function.
+ /** For a given @a node_baton, set @a stream to a writable stream
+ * capable of receiving the node's fulltext. The parser will write
+ * the fulltext to the stream and then close the stream to signal
+ * completion.
*
* If a @c NULL is returned instead of a stream, the vtable is
* indicating that no text is desired, and the parser will not
@@ -2869,8 +3296,9 @@ typedef struct svn_repos_parse_fns3_t
/** For a given @a node_baton, set @a handler and @a handler_baton
* to a window handler and baton capable of receiving a delta
- * against the node's previous contents. A NULL window will be
- * sent to the handler after all the windows are sent.
+ * against the node's previous contents. The parser will send all
+ * the windows of data to this handler, and will then send a NULL
+ * window to signal completion.
*
* If a @c NULL is returned instead of a handler, the vtable is
* indicating that no delta is desired, and the parser will not
@@ -2927,6 +3355,12 @@ typedef struct svn_repos_parse_fns3_t
* but still allow expansion of the format: most headers do not have
* to be handled explicitly.
*
+ * ### [JAF] Wouldn't it be more efficient to support a start/end rev
+ * range here than only supporting it in receivers such as
+ * svn_repos_get_fs_build_parser4()? This parser could then skip over
+ * chunks of the input stream before the oldest required rev, and
+ * could stop reading entirely after the youngest required rev.
+ *
* @since New in 1.8.
*/
svn_error_t *
@@ -2946,26 +3380,72 @@ svn_repos_parse_dumpstream3(svn_stream_t *stream,
* to operate on the fs.
*
* @a start_rev and @a end_rev act as filters, the lower and upper
- * (inclusive) range values of revisions in @a dumpstream which will
+ * (inclusive) range values of revisions which will
* be loaded. Either both of these values are #SVN_INVALID_REVNUM (in
* which case no revision-based filtering occurs at all), or both are
* valid revisions (where @a start_rev is older than or equivalent to
- * @a end_rev).
+ * @a end_rev). They refer to dump stream revision numbers rather than
+ * committed revision numbers.
+ *
+ * If @a use_history is true, then when the parser encounters a node that
+ * is added-with-history, it will require 'copy-from' history to exist in
+ * the repository at the relative (adjusted) copy-from revision and path.
+ * It will perform a copy from that source location, and will fail if no
+ * suitable source exists there. If @a use_history is false, then it will
+ * instead convert every copy to a plain add.
*
- * If @a use_history is set, then the parser will require relative
- * 'copyfrom' history to exist in the repository when it encounters
- * nodes that are added-with-history.
+ * ### The 'use_history=FALSE' case is unused and untested in Subversion.
+ * It seems to me it would not work with a deltas dumpfile (a driver
+ * that calls the @c apply_textdelta method), as it would not have
+ * access to the delta base text.
+ *
+ * If @a use_pre_commit_hook is set, call the repository's pre-commit
+ * hook before committing each loaded revision.
+ *
+ * If @a use_post_commit_hook is set, call the repository's
+ * post-commit hook after committing each loaded revision.
*
* If @a validate_props is set, then validate Subversion revision and
* node properties (those in the svn: namespace) against established
* rules for those things.
*
+ * If @a ignore_dates is set, ignore any revision datestamps found in
+ * @a dumpstream, allowing the revisions created by the load process
+ * to be stamped as if they were newly created via the normal commit
+ * process.
+ *
* If @a parent_dir is not NULL, then the parser will reparent all the
* loaded nodes, from root to @a parent_dir. The directory @a parent_dir
* must be an existing directory in the repository.
*
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_repos_get_fs_build_parser5(const svn_repos_parse_fns3_t **parser,
+ void **parse_baton,
+ svn_repos_t *repos,
+ svn_revnum_t start_rev,
+ svn_revnum_t end_rev,
+ svn_boolean_t use_history,
+ svn_boolean_t validate_props,
+ enum svn_repos_load_uuid uuid_action,
+ const char *parent_dir,
+ svn_boolean_t use_pre_commit_hook,
+ svn_boolean_t use_post_commit_hook,
+ svn_boolean_t ignore_dates,
+ svn_repos_notify_func_t notify_func,
+ void *notify_baton,
+ apr_pool_t *pool);
+
+/**
+ * Similar to svn_repos_get_fs_build_parser5(), but with the
+ * @c use_pre_commit_hook, @c use_post_commit_hook and @c ignore_dates
+ * arguments all false.
+ *
* @since New in 1.8.
+ * @deprecated Provided for backward compatibility with the 1.8 API.
*/
+SVN_DEPRECATED
svn_error_t *
svn_repos_get_fs_build_parser4(const svn_repos_parse_fns3_t **parser,
void **parse_baton,
@@ -2981,10 +3461,11 @@ svn_repos_get_fs_build_parser4(const svn_repos_parse_fns3_t **parser,
apr_pool_t *pool);
+
/**
* A vtable that is driven by svn_repos_parse_dumpstream2().
* Similar to #svn_repos_parse_fns3_t except that it lacks
- * the delete_node_property and apply_textdelta callbacks.
+ * the magic_header_record callback.
*
* @deprecated Provided for backward compatibility with the 1.7 API.
*/
@@ -3312,7 +3793,7 @@ svn_repos_authz_check_access(svn_authz_t *authz,
typedef enum svn_repos_revision_access_level_t
{
/** no access allowed to the revision properties and all changed-paths
- * information. */
+ * information. */
svn_repos_revision_access_none,
/** access granted to some (svn:date and svn:author) revision properties and
* changed-paths information on paths the read has access to. */
@@ -3342,61 +3823,6 @@ svn_repos_check_revision_access(svn_repos_revision_access_level_t *access_level,
void *authz_read_baton,
apr_pool_t *pool);
-/**
- * Set @a *inherited_values to a depth-first ordered array of
- * #svn_prop_inherited_item_t * structures (the path_or_url members of
- * which are relative filesystem paths) representing the properties
- * inherited by @a path in @a root. If no properties are inherited,
- * then set @a *inherited_values to an empty array.
- *
- * if @a propname is NULL then retrieve all explicit and/or inherited
- * properties. Otherwise retrieve only the properties named @a propname.
- *
- * If optional @a authz_read_func is non-NULL, then use this function
- * (along with optional @a authz_read_baton) to check the readability
- * of each parent path from which properties are inherited. Silently omit
- * properties for unreadable parent paths.
- *
- * Allocate @a *inherited_props in @a result_pool. Use @a scratch_pool for
- * temporary allocations.
- *
- * @since New in 1.8.
- */
-svn_error_t *
-svn_repos_fs_get_inherited_props(apr_array_header_t **inherited_props,
- svn_fs_root_t *root,
- const char *path,
- const char *propname,
- svn_repos_authz_func_t authz_read_func,
- void *authz_read_baton,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool);
-
-
-/** Capabilities **/
-
-/**
- * Store in @a repos the client-reported capabilities @a capabilities,
- * which must be allocated in memory at least as long-lived as @a repos.
- *
- * The elements of @a capabilities are 'const char *', a subset of
- * the constants beginning with @c SVN_RA_CAPABILITY_.
- * @a capabilities is not copied, so changing it later will affect
- * what is remembered by @a repos.
- *
- * @note The capabilities are passed along to the start-commit hook;
- * see that hook's template for details.
- *
- * @note As of Subversion 1.5, there are no error conditions defined,
- * so this always returns SVN_NO_ERROR. In future releases it may
- * return error, however, so callers should check.
- *
- * @since New in 1.5.
- */
-svn_error_t *
-svn_repos_remember_client_capabilities(svn_repos_t *repos,
- const apr_array_header_t *capabilities);
-
#ifdef __cplusplus
}
diff --git a/subversion/include/svn_sorts.h b/subversion/include/svn_sorts.h
index b9e05e5257b1..3a6a838a3010 100644
--- a/subversion/include/svn_sorts.h
+++ b/subversion/include/svn_sorts.h
@@ -52,16 +52,7 @@ extern "C" {
/** This structure is used to hold a key/value from a hash table.
* @note Private. For use by Subversion's own code only. See issue #1644.
*/
-typedef struct svn_sort__item_t {
- /** pointer to the key */
- const void *key;
-
- /** size of the key */
- apr_ssize_t klen;
-
- /** pointer to the value */
- void *value;
-} svn_sort__item_t;
+typedef struct svn_sort__item_t svn_sort__item_t;
/** Compare two @c svn_sort__item_t's, returning an integer greater than,
@@ -149,73 +140,6 @@ int
svn_sort_compare_ranges(const void *a,
const void *b);
-/** Sort @a ht according to its keys, return an @c apr_array_header_t
- * containing @c svn_sort__item_t structures holding those keys and values
- * (i.e. for each @c svn_sort__item_t @a item in the returned array,
- * @a item->key and @a item->size are the hash key, and @a item->value points to
- * the hash value).
- *
- * Storage is shared with the original hash, not copied.
- *
- * @a comparison_func should take two @c svn_sort__item_t's and return an
- * integer greater than, equal to, or less than 0, according as the first item
- * is greater than, equal to, or less than the second.
- *
- * @note Private. For use by Subversion's own code only. See issue #1644.
- *
- * @note This function and the @c svn_sort__item_t should go over to APR.
- */
-apr_array_header_t *
-svn_sort__hash(apr_hash_t *ht,
- int (*comparison_func)(const svn_sort__item_t *,
- const svn_sort__item_t *),
- apr_pool_t *pool);
-
-/* Return the lowest index at which the element @a *key should be inserted into
- * the array @a array, according to the ordering defined by @a compare_func.
- * The array must already be sorted in the ordering defined by @a compare_func.
- * @a compare_func is defined as for the C stdlib function bsearch().
- *
- * @note Private. For use by Subversion's own code only.
- */
-int
-svn_sort__bsearch_lower_bound(const void *key,
- const apr_array_header_t *array,
- int (*compare_func)(const void *, const void *));
-
-/* Insert a shallow copy of @a *new_element into the array @a array at the index
- * @a insert_index, growing the array and shuffling existing elements along to
- * make room.
- *
- * @note Private. For use by Subversion's own code only.
- */
-void
-svn_sort__array_insert(const void *new_element,
- apr_array_header_t *array,
- int insert_index);
-
-
-/* Remove @a elements_to_delete elements starting at @a delete_index from the
- * array @a arr. If @a delete_index is not a valid element of @a arr,
- * @a elements_to_delete is not greater than zero, or
- * @a delete_index + @a elements_to_delete is greater than @a arr->nelts,
- * then do nothing.
- *
- * @note Private. For use by Subversion's own code only.
- */
-void
-svn_sort__array_delete(apr_array_header_t *arr,
- int delete_index,
- int elements_to_delete);
-
-/* Reverse the order of elements in @a array, in place.
- *
- * @note Private. For use by Subversion's own code only.
- */
-void
-svn_sort__array_reverse(apr_array_header_t *array,
- apr_pool_t *scratch_pool);
-
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/subversion/include/svn_string.h b/subversion/include/svn_string.h
index d8ce02b039fd..82c6fd693e20 100644
--- a/subversion/include/svn_string.h
+++ b/subversion/include/svn_string.h
@@ -140,6 +140,8 @@ svn_string_create_empty(apr_pool_t *pool);
/** Create a new string copied from a generic string of bytes, @a bytes, of
* length @a size bytes. @a bytes is NOT assumed to be null-terminated, but
* the new string will be.
+ *
+ * @since Since 1.9, @a bytes can be NULL if @a size is zero.
*/
svn_string_t *
svn_string_ncreate(const char *bytes, apr_size_t size, apr_pool_t *pool);
@@ -168,7 +170,11 @@ svn_string_createv(apr_pool_t *pool, const char *fmt, va_list ap)
svn_boolean_t
svn_string_isempty(const svn_string_t *str);
-/** Return a duplicate of @a original_string. */
+/** Return a duplicate of @a original_string.
+ *
+ * @since Since 1.9, @a original_string can be NULL in which case NULL will
+ * be returned.
+ */
svn_string_t *
svn_string_dup(const svn_string_t *original_string, apr_pool_t *pool);
@@ -205,6 +211,8 @@ svn_stringbuf_create(const char *cstring, apr_pool_t *pool);
/** Create a new stringbuf copied from the generic string of bytes, @a bytes,
* of length @a size bytes. @a bytes is NOT assumed to be null-terminated,
* but the new stringbuf will be.
+ *
+ * @since Since 1.9, @a bytes can be NULL if @a size is zero.
*/
svn_stringbuf_t *
svn_stringbuf_ncreate(const char *bytes, apr_size_t size, apr_pool_t *pool);
@@ -232,6 +240,15 @@ svn_stringbuf_create_ensure(apr_size_t minimum_size, apr_pool_t *pool);
svn_stringbuf_t *
svn_stringbuf_create_from_string(const svn_string_t *str, apr_pool_t *pool);
+/** Create a new stringbuf using the given @a str as initial buffer.
+ * Allocate the result in @a pool. In contrast to #svn_stringbuf_create,
+ * the contents of @a str may change when the stringbuf gets modified.
+ *
+ * @since New in 1.9
+ */
+svn_stringbuf_t *
+svn_stringbuf_create_wrap(char *str, apr_pool_t *pool);
+
/** Create a new stringbuf by printf-style formatting using @a fmt and the
* variable arguments, which are as appropriate for apr_psprintf().
*/
@@ -288,25 +305,37 @@ svn_stringbuf_fillchar(svn_stringbuf_t *str, unsigned char c);
* The advantages extend beyond the actual call because the reduced
* register pressure allows for more optimization within the caller.
*
- * reallocs if necessary. @a targetstr is affected, nothing else is.
+ * Reallocs if necessary. @a targetstr is affected, nothing else is.
* @since New in 1.7.
*/
void
svn_stringbuf_appendbyte(svn_stringbuf_t *targetstr,
char byte);
-/** Append an array of bytes onto @a targetstr.
+/** Append the array of bytes @a bytes of length @a count onto @a targetstr.
*
- * reallocs if necessary. @a targetstr is affected, nothing else is.
+ * Reallocs if necessary. @a targetstr is affected, nothing else is.
+ *
+ * @since 1.9 @a bytes can be NULL if @a count is zero.
*/
void
svn_stringbuf_appendbytes(svn_stringbuf_t *targetstr,
const char *bytes,
apr_size_t count);
+/** Append @a byte @a count times onto @a targetstr.
+ *
+ * Reallocs if necessary. @a targetstr is affected, nothing else is.
+ * @since New in 1.9.
+ */
+void
+svn_stringbuf_appendfill(svn_stringbuf_t *targetstr,
+ char byte,
+ apr_size_t count);
+
/** Append the stringbuf @c appendstr onto @a targetstr.
*
- * reallocs if necessary. @a targetstr is affected, nothing else is.
+ * Reallocs if necessary. @a targetstr is affected, nothing else is.
*/
void
svn_stringbuf_appendstr(svn_stringbuf_t *targetstr,
@@ -314,22 +343,25 @@ svn_stringbuf_appendstr(svn_stringbuf_t *targetstr,
/** Append the C string @a cstr onto @a targetstr.
*
- * reallocs if necessary. @a targetstr is affected, nothing else is.
+ * Reallocs if necessary. @a targetstr is affected, nothing else is.
*/
void
svn_stringbuf_appendcstr(svn_stringbuf_t *targetstr,
const char *cstr);
-/** Read @a count bytes from @a bytes and insert them into @a str at
- * position @a pos and following. The resulting string will be
- * @c count+str->len bytes long. If @c pos is larger or equal to the
- * number of bytes currently used in @a str, simply append @a bytes.
+/** Insert into @a str at position @a pos an array of bytes @a bytes
+ * which is @a count bytes long.
+ *
+ * The resulting string will be @c count+str->len bytes long. If
+ * @a pos is larger than or equal to @c str->len, simply append @a bytes.
*
* Reallocs if necessary. @a str is affected, nothing else is.
*
- * @note The inserted string may be a sub-range if @a str.
+ * @note The inserted string may be a sub-range of @a str.
*
* @since New in 1.8.
+ *
+ * @since Since 1.9, @a bytes can be NULL if @a count is zero.
*/
void
svn_stringbuf_insert(svn_stringbuf_t *str,
@@ -337,9 +369,10 @@ svn_stringbuf_insert(svn_stringbuf_t *str,
const char *bytes,
apr_size_t count);
-/** Removes @a count bytes from @a str, starting at position @a pos.
- * If that range exceeds the current string data, @a str gets truncated
- * at @a pos. If the latter is larger or equal to @c str->pos, this will
+/** Remove @a count bytes from @a str, starting at position @a pos.
+ *
+ * If that range exceeds the current string data, truncate @a str at
+ * @a pos. If @a pos is larger than or equal to @c str->len, this will
* be a no-op. Otherwise, the resulting string will be @c str->len-count
* bytes long.
*
@@ -351,8 +384,8 @@ svn_stringbuf_remove(svn_stringbuf_t *str,
apr_size_t count);
/** Replace in @a str the substring which starts at @a pos and is @a
- * old_count bytes long with a new substring @a bytes (which is @a
- * new_count bytes long).
+ * old_count bytes long with a new substring @a bytes which is @a
+ * new_count bytes long.
*
* This is faster but functionally equivalent to the following sequence:
* @code
@@ -361,6 +394,8 @@ svn_stringbuf_remove(svn_stringbuf_t *str,
* @endcode
*
* @since New in 1.8.
+ *
+ * @since Since 1.9, @a bytes can be NULL if @a new_count is zero.
*/
void
svn_stringbuf_replace(svn_stringbuf_t *str,
@@ -407,9 +442,11 @@ svn_string_compare_stringbuf(const svn_string_t *str1,
* @{
*/
-/** Divide @a input into substrings along @a sep_chars boundaries, return an
- * array of copies of those substrings (plain const char*), allocating both
- * the array and the copies in @a pool.
+/** Divide @a input into substrings, interpreting any char from @a sep
+ * as a token separator.
+ *
+ * Return an array of copies of those substrings (plain const char*),
+ * allocating both the array and the copies in @a pool.
*
* None of the elements added to the array contain any of the
* characters in @a sep_chars, and none of the new elements are empty
@@ -504,6 +541,7 @@ svn_cstring_casecmp(const char *str1, const char *str2);
* Assume that the number is represented in base @a base.
* Raise an error if conversion fails (e.g. due to overflow), or if the
* converted number is smaller than @a minval or larger than @a maxval.
+ * Leading whitespace in @a str is skipped in a locale-dependent way.
*
* @since New in 1.7.
*/
@@ -516,6 +554,7 @@ svn_cstring_strtoi64(apr_int64_t *n, const char *str,
* Parse the C string @a str into a 64 bit number, and return it in @a *n.
* Assume that the number is represented in base 10.
* Raise an error if conversion fails (e.g. due to overflow).
+ * Leading whitespace in @a str is skipped in a locale-dependent way.
*
* @since New in 1.7.
*/
@@ -526,6 +565,7 @@ svn_cstring_atoi64(apr_int64_t *n, const char *str);
* Parse the C string @a str into a 32 bit number, and return it in @a *n.
* Assume that the number is represented in base 10.
* Raise an error if conversion fails (e.g. due to overflow).
+ * Leading whitespace in @a str is skipped in a locale-dependent way.
*
* @since New in 1.7.
*/
@@ -537,6 +577,7 @@ svn_cstring_atoi(int *n, const char *str);
* it in @a *n. Assume that the number is represented in base @a base.
* Raise an error if conversion fails (e.g. due to overflow), or if the
* converted number is smaller than @a minval or larger than @a maxval.
+ * Leading whitespace in @a str is skipped in a locale-dependent way.
*
* @since New in 1.7.
*/
@@ -549,6 +590,7 @@ svn_cstring_strtoui64(apr_uint64_t *n, const char *str,
* Parse the C string @a str into an unsigned 64 bit number, and return
* it in @a *n. Assume that the number is represented in base 10.
* Raise an error if conversion fails (e.g. due to overflow).
+ * Leading whitespace in @a str is skipped in a locale-dependent way.
*
* @since New in 1.7.
*/
@@ -559,12 +601,23 @@ svn_cstring_atoui64(apr_uint64_t *n, const char *str);
* Parse the C string @a str into an unsigned 32 bit number, and return
* it in @a *n. Assume that the number is represented in base 10.
* Raise an error if conversion fails (e.g. due to overflow).
+ * Leading whitespace in @a str is skipped in a locale-dependent way.
*
* @since New in 1.7.
*/
svn_error_t *
svn_cstring_atoui(unsigned int *n, const char *str);
+/**
+ * Skip the common prefix @a prefix from the C string @a str, and return
+ * a pointer to the next character after the prefix.
+ * Return @c NULL if @a str does not start with @a prefix.
+ *
+ * @since New in 1.9.
+ */
+const char *
+svn_cstring_skip_prefix(const char *str, const char *prefix);
+
/** @} */
/** @} */
diff --git a/subversion/include/svn_types.h b/subversion/include/svn_types.h
index 1ad21942e6fe..f1a0850bcf8a 100644
--- a/subversion/include/svn_types.h
+++ b/subversion/include/svn_types.h
@@ -32,6 +32,7 @@
#include <limits.h> /* for ULONG_MAX */
#include <apr.h> /* for apr_size_t, apr_int64_t, ... */
+#include <apr_version.h>
#include <apr_errno.h> /* for apr_status_t */
#include <apr_pools.h> /* for apr_pool_t */
#include <apr_hash.h> /* for apr_hash_t */
@@ -64,6 +65,50 @@ extern "C" {
#endif
+/** Macro used to mark experimental functions.
+ *
+ * @since New in 1.9.
+ */
+#ifndef SVN_EXPERIMENTAL
+# if !defined(SWIGPERL) && !defined(SWIGPYTHON) && !defined(SWIGRUBY)
+# if defined(__has_attribute)
+# if __has_attribute(__warning__)
+# define SVN_EXPERIMENTAL __attribute__((warning("experimental function used")))
+# else
+# define SVN_EXPERIMENTAL
+# endif
+# elif !defined(__llvm__) && defined(__GNUC__) \
+ && (__GNUC__ >= 4 || (__GNUC__==3 && __GNUC_MINOR__>=1))
+# define SVN_EXPERIMENTAL __attribute__((warning("experimental function used")))
+# elif defined(_MSC_VER) && _MSC_VER >= 1300
+# define SVN_EXPERIMENTAL __declspec(deprecated("experimental function used"))
+# else
+# define SVN_EXPERIMENTAL
+# endif
+# else
+# define SVN_EXPERIMENTAL
+# endif
+#endif
+
+/** Macro used to mark functions that require a final null sentinel argument.
+ *
+ * @since New in 1.9.
+ */
+#ifndef SVN_NEEDS_SENTINEL_NULL
+# if defined(__has_attribute)
+# if __has_attribute(__sentinel__)
+# define SVN_NEEDS_SENTINEL_NULL __attribute__((sentinel))
+# else
+# define SVN_NEEDS_SENTINEL_NULL
+# endif
+# elif defined(__GNUC__) && (__GNUC__ >= 4)
+# define SVN_NEEDS_SENTINEL_NULL __attribute__((sentinel))
+# else
+# define SVN_NEEDS_SENTINEL_NULL
+# endif
+#endif
+
+
/** Indicate whether the current platform supports unaligned data access.
*
* On the majority of machines running SVN (x86 / x64), unaligned access
@@ -105,6 +150,26 @@ typedef int svn_boolean_t;
+/* Declaration of a unique type, never defined, for the SVN_VA_NULL macro.
+ *
+ * NOTE: Private. Not for direct use by third-party code.
+ */
+struct svn__null_pointer_constant_stdarg_sentinel_t;
+
+/** Null pointer constant used as a sentinel in variable argument lists.
+ *
+ * Use of this macro ensures that the argument is of the correct size when a
+ * pointer is expected. (The macro @c NULL is not defined as a pointer on
+ * all systems, and the arguments to variadic functions are not converted
+ * automatically to the expected type.)
+ *
+ * @since New in 1.9.
+ */
+#define SVN_VA_NULL ((struct svn__null_pointer_constant_stdarg_sentinel_t*)0)
+/* See? (char*)NULL -- They have the same length, but the cast looks ugly. */
+
+
+
/** Subversion error object.
*
* Defined here, rather than in svn_error.h, to avoid a recursive @#include
@@ -186,21 +251,26 @@ typedef struct svn_version_t svn_version_t;
* These functions enable the caller to dereference an APR hash table index
* without type casts or temporary variables.
*
- * ### These are private, and may go away when APR implements them natively.
+ * These functions are provided by APR itself from version 1.5.
+ * Definitions are provided here for when using older versions of APR.
* @{
*/
+#if !APR_VERSION_AT_LEAST(1, 5, 0)
+
/** Return the key of the hash table entry indexed by @a hi. */
const void *
-svn__apr_hash_index_key(const apr_hash_index_t *hi);
+apr_hash_this_key(apr_hash_index_t *hi);
/** Return the key length of the hash table entry indexed by @a hi. */
apr_ssize_t
-svn__apr_hash_index_klen(const apr_hash_index_t *hi);
+apr_hash_this_key_len(apr_hash_index_t *hi);
/** Return the value of the hash table entry indexed by @a hi. */
void *
-svn__apr_hash_index_val(const apr_hash_index_t *hi);
+apr_hash_this_val(apr_hash_index_t *hi);
+
+#endif
/** @} */
@@ -1001,7 +1071,6 @@ typedef svn_error_t *(*svn_log_message_receiver_t)(
const char *message,
apr_pool_t *pool);
-
/** Callback function type for commits.
*
diff --git a/subversion/include/svn_version.h b/subversion/include/svn_version.h
index ccb5e42105df..254bfc6dc060 100644
--- a/subversion/include/svn_version.h
+++ b/subversion/include/svn_version.h
@@ -61,7 +61,7 @@ extern "C" {
* Modify when new functionality is added or new interfaces are
* defined, but all changes are backward compatible.
*/
-#define SVN_VER_MINOR 8
+#define SVN_VER_MINOR 9
/**
* Patch number.
@@ -70,7 +70,7 @@ extern "C" {
*
* @since New in 1.1.
*/
-#define SVN_VER_PATCH 14
+#define SVN_VER_PATCH 2
/** @deprecated Provided for backward compatibility with the 1.0 API. */
@@ -82,7 +82,7 @@ extern "C" {
/** Version tag: a string describing the version.
*
- * This tag remains " (dev build)" in the repository so that we can
+ * This tag remains " (under development)" in the repository so that we can
* always see from "svn --version" that the software has been built
* from the repository rather than a "blessed" distribution.
*
@@ -93,7 +93,7 @@ extern "C" {
*
* Always change this at the same time as SVN_VER_NUMTAG.
*/
-#define SVN_VER_TAG " (r1692801)"
+#define SVN_VER_TAG " (r1703836)"
/** Number tag: a string describing the version.
@@ -114,12 +114,10 @@ extern "C" {
/** Revision number: The repository revision number of this release.
*
* This constant is used to generate the build number part of the Windows
- * file version. Its value remains 0 in the repository.
- *
- * When rolling a tarball, we automatically replace it with what we
- * guess to be the correct revision number.
+ * file version. Its value remains 0 in the repository except in release
+ * tags where it is the revision from which the tag was created.
*/
-#define SVN_VER_REVISION 1692801
+#define SVN_VER_REVISION 1703836
/* Version strings composed from the above definitions. */
@@ -177,10 +175,25 @@ struct svn_version_t
* Generate the implementation of a version query function.
*
* @since New in 1.1.
+ * @since Since 1.9, embeds a string into the compiled object
+ * file that can be queried with the 'what' utility.
*/
-#define SVN_VERSION_BODY \
- SVN_VERSION_DEFINE(versioninfo); \
- return &versioninfo
+#define SVN_VERSION_BODY \
+ static struct versioninfo_t \
+ { \
+ const char *const str; \
+ const svn_version_t num; \
+ } const versioninfo = \
+ { \
+ "@(#)" SVN_VERSION, \
+ { \
+ SVN_VER_MAJOR, \
+ SVN_VER_MINOR, \
+ SVN_VER_PATCH, \
+ SVN_VER_NUMTAG \
+ } \
+ }; \
+ return &versioninfo.num
/**
* Check library version compatibility. Return #TRUE if the client's
@@ -192,6 +205,8 @@ struct svn_version_t
* unreleased library. A development client is always compatible with
* a previous released library.
*
+ * @note Implements the #svn_ver_check_list2.@a comparator interface.
+ *
* @since New in 1.1.
*/
svn_boolean_t
@@ -201,6 +216,8 @@ svn_ver_compatible(const svn_version_t *my_version,
/**
* Check if @a my_version and @a lib_version encode the same version number.
*
+ * @note Implements the #svn_ver_check_list2.@a comparator interface.
+ *
* @since New in 1.2.
*/
svn_boolean_t
@@ -228,11 +245,32 @@ typedef struct svn_version_checklist_t
* my_version is compatible with each entry in @a checklist. @a
* checklist must end with an entry whose label is @c NULL.
*
- * @see svn_ver_compatible()
+ * @a my_version is considered to be compatible with a version in @a checklist
+ * if @a comparator returns #TRUE when called with @a my_version as the first
+ * parammeter and the @a checklist version as the second parameter.
*
- * @since New in 1.1.
+ * @see svn_ver_compatible(), svn_ver_equal()
+ *
+ * @note Subversion's own code invariably uses svn_ver_equal() as @a comparator,
+ * since the cmdline tools sometimes use non-public APIs (such as utility
+ * functions that haven't been promoted to svn_cmdline.h). Third-party code
+ * SHOULD use svn_ver_compatible() as @a comparator.
+ *
+ * @since New in 1.9.
*/
svn_error_t *
+svn_ver_check_list2(const svn_version_t *my_version,
+ const svn_version_checklist_t *checklist,
+ svn_boolean_t (*comparator)(const svn_version_t *,
+ const svn_version_t *));
+
+/** Similar to svn_ver_check_list2(), with @a comparator set to
+ * #svn_ver_compatible.
+ *
+ * @deprecated Provided for backward compatibility with 1.8 API.
+ */
+SVN_DEPRECATED
+svn_error_t *
svn_ver_check_list(const svn_version_t *my_version,
const svn_version_checklist_t *checklist);
@@ -268,6 +306,11 @@ typedef struct svn_version_extended_t svn_version_extended_t;
* retrieve (for example, the OS release name, list of shared
* libraries, etc.). Use @a pool for all allocations.
*
+ * @note This function may allocate significant auxiliary resources
+ * (memory and file descriptors) in @a pool. It is recommended to
+ * copy the returned data to suitable longer-lived memory and clear
+ * @a pool after calling this function.
+ *
* @since New in 1.8.
*/
const svn_version_extended_t *
diff --git a/subversion/include/svn_wc.h b/subversion/include/svn_wc.h
index 37210ff055e6..010597bd6eeb 100644
--- a/subversion/include/svn_wc.h
+++ b/subversion/include/svn_wc.h
@@ -907,13 +907,15 @@ svn_wc_external_item_dup(const svn_wc_external_item_t *item,
*
* Allocate the table, keys, and values in @a pool.
*
- * Use @a parent_directory only in constructing error strings.
+ * @a defining_directory is the path or URL of the directory on which
+ * the svn:externals property corresponding to @a desc is set.
+ * @a defining_directory is only used when constructing error strings.
*
* @since New in 1.5.
*/
svn_error_t *
svn_wc_parse_externals_description3(apr_array_header_t **externals_p,
- const char *parent_directory,
+ const char *defining_directory,
const char *desc,
svn_boolean_t canonicalize_url,
apr_pool_t *pool);
@@ -1255,8 +1257,24 @@ typedef enum svn_wc_notify_action_t
* copy + delete. The notified path is the move source (the deleted path).
* ### TODO: Provide path to move destination as well?
* @since New in 1.8. */
- svn_wc_notify_move_broken
+ svn_wc_notify_move_broken,
+
+ /** Running cleanup on an external module.
+ * @since New in 1.9. */
+ svn_wc_notify_cleanup_external,
+
+ /** The operation failed because the operation (E.g. commit) is only valid
+ * if the operation includes this path.
+ * @since New in 1.9. */
+ svn_wc_notify_failed_requires_target,
+ /** Running info on an external module.
+ * @since New in 1.9. */
+ svn_wc_notify_info_external,
+
+ /** Finalizing commit.
+ * @since New in 1.9. */
+ svn_wc_notify_commit_finalizing
} svn_wc_notify_action_t;
@@ -1732,6 +1750,7 @@ svn_wc_conflict_version_t *
svn_wc_conflict_version_dup(const svn_wc_conflict_version_t *version,
apr_pool_t *pool);
+
/** A struct that describes a conflict that has occurred in the
* working copy.
*
@@ -1756,8 +1775,10 @@ typedef struct svn_wc_conflict_description2_t
/** The path that is in conflict (for a tree conflict, it is the victim) */
const char *local_abspath;
- /** The node type of the path being operated on (for a tree conflict,
- * ### which version?) */
+ /** The node type of the local node involved in this conflict.
+ * For a tree conflict, this is the node kind of the tree conflict victim.
+ * For the left/right node kinds of the incoming conflicting change see
+ * src_left_version->node_kind and src_right_version->node_kind. */
svn_node_kind_t node_kind;
/** What sort of conflict are we describing? */
@@ -1776,13 +1797,19 @@ typedef struct svn_wc_conflict_description2_t
* (Only if @c kind is 'text', else undefined.) */
const char *mime_type;
- /** The action being attempted on the conflicted node or property.
- * (When @c kind is 'text', this action must be 'edit'.) */
+ /** The incoming action being attempted on the conflicted node or property.
+ * When @c kind is 'text', this action must be 'edit', but generally it can
+ * be any kind of possible change. */
svn_wc_conflict_action_t action;
- /** The state of the target node or property, relative to its merge-left
- * source, that is the reason for the conflict.
- * (When @c kind is 'text', this reason must be 'edited'.) */
+ /** The local change or state of the target node or property, relative
+ * to its merge-left source, that conflicts with the incoming action.
+ * When @c kind is 'text', this must be 'edited', but generally it can
+ * be any kind of possible change.
+ * Note that 'local' does not always refer to a working copy. A change
+ * can be local to the target branch of a merge operation, for example,
+ * and is not necessarily visible in a working copy of the target branch
+ * at any given revision. */
svn_wc_conflict_reason_t reason;
/** If this is text-conflict and involves the merging of two files
@@ -1817,7 +1844,8 @@ typedef struct svn_wc_conflict_description2_t
/** my locally-edited version of the file */
const char *my_abspath;
- /** merged version; may contain conflict markers */
+ /** merged version; may contain conflict markers
+ * ### For property conflicts, this contains 'their_abspath'. */
const char *merged_file;
/** The operation that exposed the conflict.
@@ -1831,8 +1859,44 @@ typedef struct svn_wc_conflict_description2_t
/** Info on the "merge-right source" or "their" version of incoming change. */
const svn_wc_conflict_version_t *src_right_version;
- /* Remember to adjust svn_wc__conflict_description2_dup()
- * if you add new fields to this struct. */
+ /** For property conflicts, the absolute path to the .prej file.
+ * @since New in 1.9. */
+ const char *prop_reject_abspath;
+
+ /** For property conflicts, the local base value of the property, i.e. the
+ * value of the property as of the BASE revision of the working copy.
+ * For conflicts created during update/switch this contains the
+ * post-update/switch property value. The pre-update/switch value can
+ * be found in prop_value_incoming_old.
+ * Only set if available, so might be @c NULL.
+ * @since New in 1.9. */
+ const svn_string_t *prop_value_base;
+
+ /** For property conflicts, the local working value of the property,
+ * i.e. the value of the property in the working copy, possibly with
+ * local modiciations.
+ * Only set if available, so might be @c NULL.
+ * @since New in 1.9. */
+ const svn_string_t *prop_value_working;
+
+ /** For property conflicts, the incoming old value of the property,
+ * i.e. the value the property had at @c src_left_version.
+ * Only set if available, so might be @c NULL.
+ * @since New in 1.9 */
+ const svn_string_t *prop_value_incoming_old;
+
+ /** For property conflicts, the incoming new value of the property,
+ * i.e. the value the property had at @c src_right_version.
+ * Only set if available, so might be @c NULL.
+ * @since New in 1.9 */
+ const svn_string_t *prop_value_incoming_new;
+
+/* NOTE: Add new fields at the end to preserve binary compatibility.
+ Also, if you add fields here, you have to update
+ svn_wc_conflict_description2_dup and perhaps
+ svn_wc_conflict_description_create_text2,
+ svn_wc_conflict_description_create_prop2, and
+ svn_wc_conflict_description_create_tree2. */
} svn_wc_conflict_description2_t;
@@ -1928,7 +1992,7 @@ typedef struct svn_wc_conflict_description_t
} svn_wc_conflict_description_t;
/**
- * Allocate an #svn_wc_conflict_description_t structure in @a result_pool,
+ * Allocate an #svn_wc_conflict_description2_t structure in @a result_pool,
* initialize to represent a text conflict, and return it.
*
* Set the @c local_abspath field of the created struct to @a local_abspath
@@ -1960,7 +2024,7 @@ svn_wc_conflict_description_create_text(const char *path,
apr_pool_t *pool);
/**
- * Allocate an #svn_wc_conflict_description_t structure in @a result_pool,
+ * Allocate an #svn_wc_conflict_description2_t structure in @a result_pool,
* initialize to represent a property conflict, and return it.
*
* Set the @c local_abspath field of the created struct to @a local_abspath
@@ -1994,13 +2058,13 @@ svn_wc_conflict_description_create_prop(const char *path,
apr_pool_t *pool);
/**
- * Allocate an #svn_wc_conflict_description_t structure in @a pool,
+ * Allocate an #svn_wc_conflict_description2_t structure in @a pool,
* initialize to represent a tree conflict, and return it.
*
* Set the @c local_abspath field of the created struct to @a local_abspath
* (which must be an absolute path), the @c kind field to
- * #svn_wc_conflict_kind_tree, the @c node_kind to @a node_kind, the @c
- * operation to @a operation, the @c src_left_version field to
+ * #svn_wc_conflict_kind_tree, the @c local_node_kind to @a local_node_kind,
+ * the @c operation to @a operation, the @c src_left_version field to
* @a src_left_version, and the @c src_right_version field to
* @a src_right_version.
*
@@ -2040,8 +2104,21 @@ svn_wc_conflict_description_create_tree(
/** Return a duplicate of @a conflict, allocated in @a result_pool.
* A deep copy of all members will be made.
*
+ * @since New in 1.9.
+ */
+svn_wc_conflict_description2_t *
+svn_wc_conflict_description2_dup(
+ const svn_wc_conflict_description2_t *conflict,
+ apr_pool_t *result_pool);
+
+
+/** Like svn_wc_conflict_description2_dup(), but is improperly named
+ * as a private function when it is intended to be a public API.
+ *
* @since New in 1.7.
+ * @deprecated Provided for backward compatibility with the 1.8 API.
*/
+SVN_DEPRECATED
svn_wc_conflict_description2_t *
svn_wc__conflict_description2_dup(
const svn_wc_conflict_description2_t *conflict,
@@ -2054,9 +2131,15 @@ svn_wc__conflict_description2_dup(
*/
typedef enum svn_wc_conflict_choice_t
{
+ /** Undefined; for internal use only.
+ This value is never returned in svn_wc_conflict_result_t.
+ * @since New in 1.9
+ */
+ svn_wc_conflict_choose_undefined = -1,
+
/** Don't resolve the conflict now. Let libsvn_wc mark the path
'conflicted', so user can run 'svn resolved' later. */
- svn_wc_conflict_choose_postpone,
+ svn_wc_conflict_choose_postpone = 0,
/** If there were files to choose from, select one as a way of
resolving the conflict here and now. libsvn_wc will then do the
@@ -2069,7 +2152,7 @@ typedef enum svn_wc_conflict_choice_t
svn_wc_conflict_choose_mine_conflict, /**< own (for conflicted hunks) */
svn_wc_conflict_choose_merged, /**< merged version */
- /* @since New in 1.8. */
+ /** @since New in 1.8. */
svn_wc_conflict_choose_unspecified /**< undecided */
} svn_wc_conflict_choice_t;
@@ -2102,6 +2185,14 @@ typedef struct svn_wc_conflict_result_t
NULL) in the user's working copy. */
svn_boolean_t save_merged;
+ /** If not NULL, this is the new merged property, used when choosing
+ * #svn_wc_conflict_choose_merged. This value is prefered over using
+ * merged_file.
+ *
+ * @since New in 1.9.
+ */
+ const svn_string_t *merged_value;
+
} svn_wc_conflict_result_t;
@@ -2111,7 +2202,8 @@ typedef struct svn_wc_conflict_result_t
*
* Set the @c choice field of the structure to @a choice, @c merged_file
* to @a merged_file, and @c save_merged to false. Make only a shallow
- * copy of the pointer argument @a merged_file.
+ * copy of the pointer argument @a merged_file. @a merged_file may be
+ * NULL if setting merged_file is not needed.
*
* @since New in 1.5.
*/
@@ -3743,6 +3835,13 @@ typedef struct svn_wc_status3_t
* @since New in 1.8. */
svn_boolean_t file_external;
+
+ /** The actual kind of the node in the working copy. May differ from
+ * @a kind on obstructions, deletes, etc. #svn_node_unknown if unavailable.
+ *
+ * @since New in 1.9 */
+ svn_node_kind_t actual_kind;
+
/* NOTE! Please update svn_wc_dup_status3() when adding new fields here. */
} svn_wc_status3_t;
@@ -4544,10 +4643,9 @@ svn_wc_delete(const char *path,
* addition to the working copy. The added node will have the properties
* provided in @a props, or none if that is NULL.
*
- * Check and canonicalize the properties in the same way as
- * svn_wc_prop_set4(). Return an error and don't add the node if the
- * properties are not valid on this node. Unlike svn_wc_prop_set4()
- * there is no option to skip some of the checks and canonicalizations.
+ * Unless @a skip_checks is TRUE, check and canonicalize the properties in the
+ * same way as svn_wc_prop_set4(). Return an error and don't add the node if
+ * the properties are not valid on this node.
*
* ### The error code on validity check failure should be specified, and
* preferably should be a single code.
@@ -4559,10 +4657,30 @@ svn_wc_delete(const char *path,
* If @a local_abspath does not exist as file, directory or symlink, return
* #SVN_ERR_WC_PATH_NOT_FOUND.
*
+ * If @a notify_func is non-NULL, invoke it with @a notify_baton to report
+ * the item being added.
+ *
* ### TODO: Split into add_dir, add_file, add_symlink?
*
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_wc_add_from_disk3(svn_wc_context_t *wc_ctx,
+ const char *local_abspath,
+ const apr_hash_t *props,
+ svn_boolean_t skip_checks,
+ svn_wc_notify_func2_t notify_func,
+ void *notify_baton,
+ apr_pool_t *scratch_pool);
+
+/**
+ * Similar to svn_wc_add_from_disk3(), but always passes FALSE for
+ * @a skip_checks
+ *
* @since New in 1.8.
+ * @deprecated Provided for backward compatibility with the 1.8 API.
*/
+SVN_DEPRECATED
svn_error_t *
svn_wc_add_from_disk2(svn_wc_context_t *wc_ctx,
const char *local_abspath,
@@ -5070,6 +5188,12 @@ svn_wc_committed_queue_create(apr_pool_t *pool);
* ### seems to be not a set of changes but rather the new complete set of
* ### props. And it's renamed to 'new_dav_cache' inside; why?
*
+ * If @a is_committed is @c TRUE, the node will be processed as committed. This
+ * turns the node and its implied descendants as the new unmodified state at
+ * the new specified revision. Unless @a recurse is TRUE, changes on
+ * descendants are not committed as changes directly. In this case they should
+ * be queueud as their own changes.
+ *
* If @a remove_lock is @c TRUE, any entryprops related to a repository
* lock will be removed.
*
@@ -5107,7 +5231,25 @@ svn_wc_committed_queue_create(apr_pool_t *pool);
* Temporary allocations will be performed in @a scratch_pool, and persistent
* allocations will use the same pool as @a queue used when it was created.
*
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_wc_queue_committed4(svn_wc_committed_queue_t *queue,
+ svn_wc_context_t *wc_ctx,
+ const char *local_abspath,
+ svn_boolean_t recurse,
+ svn_boolean_t is_committed,
+ const apr_array_header_t *wcprop_changes,
+ svn_boolean_t remove_lock,
+ svn_boolean_t remove_changelist,
+ const svn_checksum_t *sha1_checksum,
+ apr_pool_t *scratch_pool);
+
+/** Similar to svn_wc_queue_committed4, but with is_committed always
+ * TRUE.
+ *
* @since New in 1.7.
+ * @deprecated Provided for backwards compatibility with the 1.8 API.
*/
svn_error_t *
svn_wc_queue_committed3(svn_wc_committed_queue_t *queue,
@@ -7093,7 +7235,7 @@ svn_wc_merge_prop_diffs(svn_wc_notify_state_t *state,
* the copy/move source (even if the copy-/move-here replaces a locally
* deleted file).
*
- * If @a local_abspath refers to an unversioned or non-existing path, return
+ * If @a local_abspath refers to an unversioned or non-existent path, return
* @c SVN_ERR_WC_PATH_NOT_FOUND. Use @a wc_ctx to access the working copy.
* @a contents may not be @c NULL (unlike @a *contents).
*
@@ -7142,19 +7284,59 @@ svn_wc_get_pristine_copy_path(const char *path,
/**
- * Recurse from @a local_abspath, cleaning up unfinished log business. Perform
- * any temporary allocations in @a scratch_pool. Any working copy locks under
- * @a local_abspath will be taken over and then cleared by this function.
+ * Recurse from @a local_abspath, cleaning up unfinished tasks. Perform
+ * any temporary allocations in @a scratch_pool. If @a break_locks is TRUE
+ * Any working copy locks under @a local_abspath will be taken over and then
+ * cleared by this function.
+ * WARNING: If @a break_locks is TRUE there is no mechanism that will protect
+ * locks that are still being used.
*
- * WARNING: there is no mechanism that will protect locks that are still being
- * used.
+ * If @a fix_recorded_timestamps is TRUE the recorded timestamps of unmodified
+ * files will be updated, which will improve performance of future is-modified
+ * checks.
+ *
+ * If @a clear_dav_cache is @c TRUE, the caching of DAV information for older
+ * mod_dav served repositories is cleared. This clearing invalidates some
+ * cached information used for pre-HTTPv2 repositories.
+ *
+ * If @a vacuum_pristines is TRUE, try to remove unreferenced pristines from
+ * the working copy. (Will not remove anything unless the obtained lock applies
+ * to the entire working copy)
*
* If @a cancel_func is non-NULL, invoke it with @a cancel_baton at various
* points during the operation. If it returns an error (typically
* #SVN_ERR_CANCELLED), return that error immediately.
*
+ * If @a notify_func is non-NULL, invoke it with @a notify_baton to report
+ * the progress of the operation.
+ *
+ * @note In 1.9, @a notify_func does not get called at all. This may change
+ * in later releases.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_wc_cleanup4(svn_wc_context_t *wc_ctx,
+ const char *local_abspath,
+ svn_boolean_t break_locks,
+ svn_boolean_t fix_recorded_timestamps,
+ svn_boolean_t clear_dav_cache,
+ svn_boolean_t vacuum_pristines,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ svn_wc_notify_func2_t notify_func,
+ void *notify_baton,
+ apr_pool_t *scratch_pool);
+
+/**
+ * Similar to svn_wc_cleanup4() but will always break locks, fix recorded
+ * timestamps, clear the dav cache and vacuum pristines. This function also
+ * doesn't support notifications.
+ *
* @since New in 1.7.
+ * @deprecated Provided for backward compatibility with the 1.8 API.
*/
+SVN_DEPRECATED
svn_error_t *
svn_wc_cleanup3(svn_wc_context_t *wc_ctx,
const char *local_abspath,
@@ -7379,6 +7561,13 @@ svn_wc_relocate(const char *path,
* changelists. If @a changelist_filter is empty (or altogether @c NULL),
* no changelist filtering occurs.
*
+ * If @a clear_changelists is TRUE, then changelist information for the
+ * paths is cleared.
+ *
+ * If @a metadata_only is TRUE, the working copy files are untouched, but
+ * if there are conflict marker files attached to these files these
+ * markers are removed.
+ *
* If @a cancel_func is non-NULL, call it with @a cancel_baton at
* various points during the reversion process. If it returns an
* error (typically #SVN_ERR_CANCELLED), return that error
@@ -7395,8 +7584,29 @@ svn_wc_relocate(const char *path,
* If @a path is not under version control, return the error
* #SVN_ERR_UNVERSIONED_RESOURCE.
*
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_wc_revert5(svn_wc_context_t *wc_ctx,
+ const char *local_abspath,
+ svn_depth_t depth,
+ svn_boolean_t use_commit_times,
+ const apr_array_header_t *changelist_filter,
+ svn_boolean_t clear_changelists,
+ svn_boolean_t metadata_only,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ svn_wc_notify_func2_t notify_func,
+ void *notify_baton,
+ apr_pool_t *scratch_pool);
+
+/** Similar to svn_wc_revert5() but with @a clear_changelists always set to
+ * FALSE and @a metadata_only set to FALSE.
+ *
* @since New in 1.7.
+ * @deprecated Provided for backward compatibility with the 1.8 API.
*/
+SVN_DEPRECATED
svn_error_t *
svn_wc_revert4(svn_wc_context_t *wc_ctx,
const char *local_abspath,
@@ -7875,7 +8085,8 @@ typedef struct svn_wc_revision_status_t
svn_boolean_t switched; /**< Is anything switched? */
svn_boolean_t modified; /**< Is anything modified? */
- /** Whether any WC paths are at a depth other than #svn_depth_infinity.
+ /** Whether any WC paths are at a depth other than #svn_depth_infinity or
+ * are user excluded.
* @since New in 1.5.
*/
svn_boolean_t sparse_checkout;
@@ -8020,7 +8231,17 @@ typedef svn_error_t *(*svn_changelist_receiver_t) (void *baton,
/**
- * ### TODO: Doc string, please.
+ * Beginning at @a local_abspath, crawl to @a depth to discover every path in
+ * or under @a local_abspath which belongs to one of the changelists in @a
+ * changelist_filter (an array of <tt>const char *</tt> changelist names).
+ * If @a changelist_filter is @c NULL, discover paths with any changelist.
+ * Call @a callback_func (with @a callback_baton) each time a
+ * changelist-having path is discovered.
+ *
+ * @a local_abspath is a local WC path.
+ *
+ * If @a cancel_func is not @c NULL, invoke it passing @a cancel_baton
+ * during the recursive walk.
*
* @since New in 1.7.
*/
diff --git a/subversion/include/svn_x509.h b/subversion/include/svn_x509.h
new file mode 100644
index 000000000000..eabe3ed46c8b
--- /dev/null
+++ b/subversion/include/svn_x509.h
@@ -0,0 +1,201 @@
+/**
+ * @copyright
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ * @endcopyright
+ *
+ * @file svn_x509.h
+ * @brief Subversion's X509 parser
+ */
+
+#ifndef SVN_X509_H
+#define SVN_X509_H
+
+#include <apr_pools.h>
+#include <apr_tables.h>
+#include <apr_time.h>
+
+#include "svn_error.h"
+#include "svn_checksum.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define SVN_X509_OID_COMMON_NAME "\x55\x04\x03"
+#define SVN_X509_OID_COUNTRY "\x55\x04\x06"
+#define SVN_X509_OID_LOCALITY "\x55\x04\x07"
+#define SVN_X509_OID_STATE "\x55\x04\x08"
+#define SVN_X509_OID_ORGANIZATION "\x55\x04\x0A"
+#define SVN_X509_OID_ORG_UNIT "\x55\x04\x0B"
+#define SVN_X509_OID_EMAIL "\x2A\x86\x48\x86\xF7\x0D\x01\x09\x01"
+
+/**
+ * Representation of parsed certificate info.
+ *
+ * @since New in 1.9.
+ */
+typedef struct svn_x509_certinfo_t svn_x509_certinfo_t;
+
+/**
+ * Representation of an atttribute in an X.509 name (e.g. Subject or Issuer)
+ *
+ * @since New in 1.9.
+ */
+typedef struct svn_x509_name_attr_t svn_x509_name_attr_t;
+
+/**
+ * Parse x509 @a der certificate data from @a buf with length @a
+ * buflen and return certificate information in @a *certinfo,
+ * allocated in @a result_pool.
+ *
+ * @note This function has been written with the intent of display data in a
+ * certificate for a user to see. As a result, it does not do much
+ * validation on the data it parses from the certificate. It does not
+ * for instance verify that the certificate is signed by the issuer. It
+ * does not verify a trust chain. It does not error on critical
+ * extensions it does not know how to parse. So while it can be used as
+ * part of a certificate validation scheme, it can't be used alone for
+ * that purpose.
+ *
+ * @since New in 1.9.
+ */
+svn_error_t *
+svn_x509_parse_cert(svn_x509_certinfo_t **certinfo,
+ const char *buf,
+ apr_size_t buflen,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/**
+ * Returns a deep copy of the @a attr, allocated in @a result_pool.
+ * May use @a scratch_pool for temporary allocations.
+ * @since New in 1.9.
+ */
+svn_x509_name_attr_t *
+svn_x509_name_attr_dup(const svn_x509_name_attr_t *attr,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/**
+ * Returns the OID of @a attr as encoded in the certificate. The
+ * length of the OID will be set in @a len.
+ * @since New in 1.9.
+ */
+const unsigned char *
+svn_x509_name_attr_get_oid(const svn_x509_name_attr_t *attr, apr_size_t *len);
+
+/**
+ * Returns the value of @a attr as a UTF-8 C string.
+ * @since New in 1.9.
+ */
+const char *
+svn_x509_name_attr_get_value(const svn_x509_name_attr_t *attr);
+
+
+/**
+ * Returns a deep copy of @a certinfo, allocated in @a result_pool.
+ * May use @a scratch_pool for temporary allocations.
+ * @since New in 1.9.
+ */
+svn_x509_certinfo_t *
+svn_x509_certinfo_dup(const svn_x509_certinfo_t *certinfo,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/**
+ * Returns the subject DN from @a certinfo.
+ * @since New in 1.9.
+ */
+const char *
+svn_x509_certinfo_get_subject(const svn_x509_certinfo_t *certinfo,
+ apr_pool_t *result_pool);
+
+/**
+ * Returns a list of the attributes for the subject in the @a certinfo.
+ * Each member of the list is of type svn_x509_name_attr_t.
+ *
+ * @since New in 1.9.
+ */
+const apr_array_header_t *
+svn_x509_certinfo_get_subject_attrs(const svn_x509_certinfo_t *certinfo);
+
+/**
+ * Returns the cerficiate issuer DN from @a certinfo.
+ * @since New in 1.9.
+ */
+const char *
+svn_x509_certinfo_get_issuer(const svn_x509_certinfo_t *certinfo,
+ apr_pool_t *result_pool);
+
+/**
+ * Returns a list of the attributes for the issuer in the @a certinfo.
+ * Each member of the list is of type svn_x509_name_attr_t.
+ *
+ * @since New in 1.9.
+ */
+const apr_array_header_t *
+svn_x509_certinfo_get_issuer_attrs(const svn_x509_certinfo_t *certinfo);
+
+/**
+ * Returns the start of the certificate validity period from @a certinfo.
+ *
+ * @since New in 1.9.
+ */
+apr_time_t
+svn_x509_certinfo_get_valid_from(const svn_x509_certinfo_t *certinfo);
+
+/**
+ * Returns the end of the certificate validity period from @a certinfo.
+ *
+ * @since New in 1.9.
+ */
+const apr_time_t
+svn_x509_certinfo_get_valid_to(const svn_x509_certinfo_t *certinfo);
+
+/**
+ * Returns the digest (fingerprint) from @a certinfo
+ * @since New in 1.9.
+ */
+const svn_checksum_t *
+svn_x509_certinfo_get_digest(const svn_x509_certinfo_t *certinfo);
+
+/**
+ * Returns an array of (const char*) host names from @a certinfo.
+ *
+ * @since New in 1.9.
+ */
+const apr_array_header_t *
+svn_x509_certinfo_get_hostnames(const svn_x509_certinfo_t *certinfo);
+
+/**
+ * Given an @a oid return a null-terminated C string representation.
+ * For example an OID with the bytes "\x2A\x86\x48\x86\xF7\x0D\x01\x09\x01"
+ * would be converted to the string "1.2.840.113549.1.9.1". Returns
+ * NULL if the @oid can't be represented as a string.
+ *
+ * @since New in 1.9. */
+const char *
+svn_x509_oid_to_string(const unsigned char *oid, apr_size_t oid_len,
+ apr_pool_t *scratch_pool, apr_pool_t *result_pool);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* SVN_X509_H */
diff --git a/subversion/include/svn_xml.h b/subversion/include/svn_xml.h
index 90969be7ecde..8791b143750c 100644
--- a/subversion/include/svn_xml.h
+++ b/subversion/include/svn_xml.h
@@ -312,7 +312,7 @@ svn_xml_make_header(svn_stringbuf_t **str,
* If @a *str is @c NULL, set @a *str to a new stringbuf allocated
* in @a pool, else append to the existing stringbuf there.
*
- * Take the tag's attributes from varargs, a NULL-terminated list of
+ * Take the tag's attributes from varargs, a SVN_VA_NULL-terminated list of
* alternating <tt>char *</tt> key and <tt>char *</tt> val. Do xml-escaping
* on each val.
*
@@ -323,7 +323,7 @@ svn_xml_make_open_tag(svn_stringbuf_t **str,
apr_pool_t *pool,
enum svn_xml_open_tag_style style,
const char *tagname,
- ...);
+ ...) SVN_NEEDS_SENTINEL_NULL;
/** Like svn_xml_make_open_tag(), but takes a @c va_list instead of being
diff --git a/subversion/libsvn_auth_gnome_keyring/libsvn_auth_gnome_keyring.pc.in b/subversion/libsvn_auth_gnome_keyring/libsvn_auth_gnome_keyring.pc.in
new file mode 100644
index 000000000000..a768b6d5bb2f
--- /dev/null
+++ b/subversion/libsvn_auth_gnome_keyring/libsvn_auth_gnome_keyring.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libsvn_auth_gnome_keyring
+Description: Subversion GNOME Keyring Library
+Version: @PACKAGE_VERSION@
+Requires: apr-@SVN_APR_MAJOR_VERSION@ gnome-keyring-1
+Requires.private: libsvn_subr
+Libs: -L${libdir} -lsvn_auth_gnome_keyring
+Cflags: -I${includedir}
diff --git a/subversion/libsvn_auth_kwallet/kwallet.cpp b/subversion/libsvn_auth_kwallet/kwallet.cpp
index e1a345e7d45c..74e4eaf846ff 100644
--- a/subversion/libsvn_auth_kwallet/kwallet.cpp
+++ b/subversion/libsvn_auth_kwallet/kwallet.cpp
@@ -47,6 +47,7 @@
#include "svn_auth.h"
#include "svn_config.h"
#include "svn_error.h"
+#include "svn_hash.h"
#include "svn_io.h"
#include "svn_pools.h"
#include "svn_string.h"
@@ -135,34 +136,36 @@ get_wid(void)
return wid;
}
+/* Forward definition */
+static apr_status_t
+kwallet_terminate(void *data);
+
static KWallet::Wallet *
get_wallet(QString wallet_name,
apr_hash_t *parameters)
{
KWallet::Wallet *wallet =
- static_cast<KWallet::Wallet *> (apr_hash_get(parameters,
- "kwallet-wallet",
- APR_HASH_KEY_STRING));
- if (! wallet && ! apr_hash_get(parameters,
- "kwallet-opening-failed",
- APR_HASH_KEY_STRING))
+ static_cast<KWallet::Wallet *> (svn_hash_gets(parameters,
+ "kwallet-wallet"));
+ if (! wallet && ! svn_hash_gets(parameters, "kwallet-opening-failed"))
{
wallet = KWallet::Wallet::openWallet(wallet_name, get_wid(),
KWallet::Wallet::Synchronous);
- }
- if (wallet)
- {
- apr_hash_set(parameters,
- "kwallet-wallet",
- APR_HASH_KEY_STRING,
- wallet);
- }
- else
- {
- apr_hash_set(parameters,
- "kwallet-opening-failed",
- APR_HASH_KEY_STRING,
- "");
+
+ if (wallet)
+ {
+ svn_hash_sets(parameters, "kwallet-wallet", wallet);
+
+ apr_pool_cleanup_register(apr_hash_pool_get(parameters),
+ parameters, kwallet_terminate,
+ apr_pool_cleanup_null);
+
+ svn_hash_sets(parameters, "kwallet-initialized", "");
+ }
+ else
+ {
+ svn_hash_sets(parameters, "kwallet-opening-failed", "");
+ }
}
return wallet;
}
@@ -171,14 +174,12 @@ static apr_status_t
kwallet_terminate(void *data)
{
apr_hash_t *parameters = static_cast<apr_hash_t *> (data);
- if (apr_hash_get(parameters, "kwallet-initialized", APR_HASH_KEY_STRING))
+ if (svn_hash_gets(parameters, "kwallet-initialized"))
{
KWallet::Wallet *wallet = get_wallet(NULL, parameters);
delete wallet;
- apr_hash_set(parameters,
- "kwallet-initialized",
- APR_HASH_KEY_STRING,
- NULL);
+ svn_hash_sets(parameters, "kwallet-wallet", NULL);
+ svn_hash_sets(parameters, "kwallet-initialized", NULL);
}
return APR_SUCCESS;
}
@@ -236,10 +237,6 @@ kwallet_password_get(svn_boolean_t *done,
KWallet::Wallet *wallet = get_wallet(wallet_name, parameters);
if (wallet)
{
- apr_hash_set(parameters,
- "kwallet-initialized",
- APR_HASH_KEY_STRING,
- "");
if (wallet->setFolder(folder))
{
QString q_password;
@@ -254,9 +251,6 @@ kwallet_password_get(svn_boolean_t *done,
}
}
- apr_pool_cleanup_register(pool, parameters, kwallet_terminate,
- apr_pool_cleanup_null);
-
return SVN_NO_ERROR;
}
@@ -310,10 +304,6 @@ kwallet_password_set(svn_boolean_t *done,
KWallet::Wallet *wallet = get_wallet(wallet_name, parameters);
if (wallet)
{
- apr_hash_set(parameters,
- "kwallet-initialized",
- APR_HASH_KEY_STRING,
- "");
if (! wallet->hasFolder(folder))
{
wallet->createFolder(folder);
@@ -329,9 +319,6 @@ kwallet_password_set(svn_boolean_t *done,
}
}
- apr_pool_cleanup_register(pool, parameters, kwallet_terminate,
- apr_pool_cleanup_null);
-
return SVN_NO_ERROR;
}
diff --git a/subversion/libsvn_auth_kwallet/libsvn_auth_kwallet.pc.in b/subversion/libsvn_auth_kwallet/libsvn_auth_kwallet.pc.in
new file mode 100644
index 000000000000..fa65cfa476b2
--- /dev/null
+++ b/subversion/libsvn_auth_kwallet/libsvn_auth_kwallet.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: libsvn_auth_kwallet
+Description: Subversion KWallet Library
+Version: @PACKAGE_VERSION@
+Requires: apr-@SVN_APR_MAJOR_VERSION@
+Requires.private: libsvn_subr
+Libs: -L${libdir} -lsvn_auth_kwallet @SVN_KWALLET_LIBS@
+Cflags: -I${includedir}
diff --git a/subversion/libsvn_client/add.c b/subversion/libsvn_client/add.c
index f121bc87d17f..ce7891afb27c 100644
--- a/subversion/libsvn_client/add.c
+++ b/subversion/libsvn_client/add.c
@@ -48,6 +48,7 @@
#include "private/svn_client_private.h"
#include "private/svn_wc_private.h"
#include "private/svn_ra_private.h"
+#include "private/svn_sorts_private.h"
#include "private/svn_magic.h"
#include "svn_private_config.h"
@@ -168,8 +169,8 @@ get_auto_props_for_pattern(apr_hash_t *properties,
hi != NULL;
hi = apr_hash_next(hi))
{
- const char *propname = svn__apr_hash_index_key(hi);
- const char *propval = svn__apr_hash_index_val(hi);
+ const char *propname = apr_hash_this_key(hi);
+ const char *propval = apr_hash_this_val(hi);
svn_string_t *propval_str =
svn_string_create_empty(apr_hash_pool_get(properties));
@@ -206,8 +207,8 @@ svn_client__get_paths_auto_props(apr_hash_t **properties,
hi != NULL;
hi = apr_hash_next(hi))
{
- const char *pattern = svn__apr_hash_index_key(hi);
- apr_hash_t *propvals = svn__apr_hash_index_val(hi);
+ const char *pattern = apr_hash_this_key(hi);
+ apr_hash_t *propvals = apr_hash_this_val(hi);
get_auto_props_for_pattern(*properties, mimetype, &have_executable,
svn_dirent_basename(path, scratch_pool),
@@ -316,7 +317,8 @@ add_file(const char *local_abspath,
}
/* Add the file */
- SVN_ERR(svn_wc_add_from_disk2(ctx->wc_ctx, local_abspath, properties,
+ SVN_ERR(svn_wc_add_from_disk3(ctx->wc_ctx, local_abspath, properties,
+ FALSE /* skip checks */,
ctx->notify_func2, ctx->notify_baton2, pool));
return SVN_NO_ERROR;
@@ -378,7 +380,8 @@ add_dir_recursive(const char *dir_abspath,
iterpool = svn_pool_create(scratch_pool);
/* Add this directory to revision control. */
- err = svn_wc_add_from_disk2(ctx->wc_ctx, dir_abspath, NULL /*props*/,
+ err = svn_wc_add_from_disk3(ctx->wc_ctx, dir_abspath, NULL /*props*/,
+ FALSE /* skip checks */,
ctx->notify_func2, ctx->notify_baton2,
iterpool);
if (err)
@@ -424,8 +427,8 @@ add_dir_recursive(const char *dir_abspath,
version control. */
for (hi = apr_hash_first(scratch_pool, dirents); hi; hi = apr_hash_next(hi))
{
- const char *name = svn__apr_hash_index_key(hi);
- svn_io_dirent2_t *dirent = svn__apr_hash_index_val(hi);
+ const char *name = apr_hash_this_key(hi);
+ svn_io_dirent2_t *dirent = apr_hash_this_val(hi);
const char *abspath;
svn_pool_clear(iterpool);
@@ -704,15 +707,12 @@ svn_client__get_all_auto_props(apr_hash_t **autoprops,
for (i = 0; i < inherited_config_auto_props->nelts; i++)
{
- apr_hash_index_t *hi;
svn_prop_inherited_item_t *elt = APR_ARRAY_IDX(
inherited_config_auto_props, i, svn_prop_inherited_item_t *);
+ const svn_string_t *propval =
+ svn_hash_gets(elt->prop_hash, SVN_PROP_INHERITABLE_AUTO_PROPS);
- for (hi = apr_hash_first(scratch_pool, elt->prop_hash);
- hi;
- hi = apr_hash_next(hi))
{
- const svn_string_t *propval = svn__apr_hash_index_val(hi);
const char *ch = propval->data;
svn_stringbuf_t *config_auto_prop_pattern;
svn_stringbuf_t *config_auto_prop_val;
@@ -768,59 +768,6 @@ svn_client__get_all_auto_props(apr_hash_t **autoprops,
return SVN_NO_ERROR;
}
-svn_error_t *svn_client__get_inherited_ignores(apr_array_header_t **ignores,
- const char *path_or_url,
- svn_client_ctx_t *ctx,
- apr_pool_t *result_pool,
- apr_pool_t *scratch_pool)
-{
- svn_opt_revision_t rev;
- apr_hash_t *explicit_ignores;
- apr_array_header_t *inherited_ignores;
- svn_boolean_t target_is_url = svn_path_is_url(path_or_url);
- svn_string_t *explicit_prop;
- int i;
-
- if (target_is_url)
- rev.kind = svn_opt_revision_head;
- else
- rev.kind = svn_opt_revision_working;
-
- SVN_ERR(svn_client_propget5(&explicit_ignores, &inherited_ignores,
- SVN_PROP_INHERITABLE_IGNORES, path_or_url,
- &rev, &rev, NULL, svn_depth_empty, NULL, ctx,
- scratch_pool, scratch_pool));
-
- explicit_prop = svn_hash_gets(explicit_ignores, path_or_url);
-
- if (explicit_prop)
- {
- svn_prop_inherited_item_t *new_iprop =
- apr_palloc(scratch_pool, sizeof(*new_iprop));
- new_iprop->path_or_url = path_or_url;
- new_iprop->prop_hash = apr_hash_make(scratch_pool);
- svn_hash_sets(new_iprop->prop_hash, SVN_PROP_INHERITABLE_IGNORES,
- explicit_prop);
- APR_ARRAY_PUSH(inherited_ignores,
- svn_prop_inherited_item_t *) = new_iprop;
- }
-
- *ignores = apr_array_make(result_pool, 16, sizeof(const char *));
-
- for (i = 0; i < inherited_ignores->nelts; i++)
- {
- svn_prop_inherited_item_t *elt = APR_ARRAY_IDX(
- inherited_ignores, i, svn_prop_inherited_item_t *);
- svn_string_t *ignore_val = svn_hash_gets(elt->prop_hash,
- SVN_PROP_INHERITABLE_IGNORES);
- if (ignore_val)
- svn_cstring_split_append(*ignores, ignore_val->data, "\n\r\t\v ",
- FALSE, result_pool);
- }
-
- return SVN_NO_ERROR;
-}
-
/* The main logic of the public svn_client_add5.
*
* EXISTING_PARENT_ABSPATH is the absolute path to the first existing
@@ -841,7 +788,7 @@ add(const char *local_abspath,
svn_magic__cookie_t *magic_cookie;
apr_array_header_t *ignores = NULL;
- svn_magic__init(&magic_cookie, scratch_pool);
+ SVN_ERR(svn_magic__init(&magic_cookie, ctx->config, scratch_pool));
if (existing_parent_abspath)
{
@@ -876,8 +823,9 @@ add(const char *local_abspath,
parent_abspath, local_abspath);
SVN_ERR(svn_io_make_dir_recursively(parent_abspath, scratch_pool));
- SVN_ERR(svn_wc_add_from_disk2(ctx->wc_ctx, parent_abspath,
+ SVN_ERR(svn_wc_add_from_disk3(ctx->wc_ctx, parent_abspath,
NULL /*props*/,
+ FALSE /* skip checks */,
ctx->notify_func2, ctx->notify_baton2,
scratch_pool));
}
@@ -1169,8 +1117,8 @@ mkdir_urls(const apr_array_header_t *urls,
}
}
}
- qsort(targets->elts, targets->nelts, targets->elt_size,
- svn_sort_compare_paths);
+
+ svn_sort__array(targets, svn_sort_compare_paths);
/* ### This reparent may be problematic in limited-authz-to-common-parent
### scenarios (compare issue #3242). See also issue #3649. */
@@ -1228,53 +1176,58 @@ mkdir_urls(const apr_array_header_t *urls,
pool));
/* Call the path-based editor driver. */
- err = svn_delta_path_driver2(editor, edit_baton, targets, TRUE,
- path_driver_cb_func, (void *)editor, pool);
+ err = svn_error_trace(
+ svn_delta_path_driver2(editor, edit_baton, targets, TRUE,
+ path_driver_cb_func, (void *)editor, pool));
if (err)
{
/* At least try to abort the edit (and fs txn) before throwing err. */
return svn_error_compose_create(
err,
- editor->abort_edit(edit_baton, pool));
+ svn_error_trace(editor->abort_edit(edit_baton, pool)));
+ }
+
+ if (ctx->notify_func2)
+ {
+ svn_wc_notify_t *notify;
+ notify = svn_wc_create_notify_url(common,
+ svn_wc_notify_commit_finalizing,
+ pool);
+ ctx->notify_func2(ctx->notify_baton2, notify, pool);
}
/* Close the edit. */
- return editor->close_edit(edit_baton, pool);
+ return svn_error_trace(editor->close_edit(edit_baton, pool));
}
svn_error_t *
-svn_client__make_local_parents(const char *path,
+svn_client__make_local_parents(const char *local_abspath,
svn_boolean_t make_parents,
svn_client_ctx_t *ctx,
- apr_pool_t *pool)
+ apr_pool_t *scratch_pool)
{
svn_error_t *err;
svn_node_kind_t orig_kind;
- SVN_ERR(svn_io_check_path(path, &orig_kind, pool));
+ SVN_ERR(svn_io_check_path(local_abspath, &orig_kind, scratch_pool));
if (make_parents)
- SVN_ERR(svn_io_make_dir_recursively(path, pool));
+ SVN_ERR(svn_io_make_dir_recursively(local_abspath, scratch_pool));
else
- SVN_ERR(svn_io_dir_make(path, APR_OS_DEFAULT, pool));
+ SVN_ERR(svn_io_dir_make(local_abspath, APR_OS_DEFAULT, scratch_pool));
- /* Should no longer use svn_depth_empty to indicate that only the directory
- itself is added, since it not only constraints the operation depth, but
- also defines the depth of the target directory now. Moreover, the new
- directory will have no children at all.*/
- err = svn_client_add5(path, svn_depth_infinity, FALSE, FALSE, FALSE,
- make_parents, ctx, pool);
+ err = svn_client_add5(local_abspath, svn_depth_empty, FALSE, FALSE, FALSE,
+ make_parents, ctx, scratch_pool);
/* If we created a new directory, but couldn't add it to version
control, then delete it. */
if (err && (orig_kind == svn_node_none))
{
- /* ### If this returns an error, should we link it onto
- err instead, so that the user is warned that we just
- created an unversioned directory? */
-
- svn_error_clear(svn_io_remove_dir2(path, FALSE, NULL, NULL, pool));
+ err = svn_error_compose_create(err,
+ svn_io_remove_dir2(local_abspath, FALSE,
+ NULL, NULL,
+ scratch_pool));
}
return svn_error_trace(err);
@@ -1303,23 +1256,25 @@ svn_client_mkdir4(const apr_array_header_t *paths,
else
{
/* This is a regular "mkdir" + "svn add" */
- apr_pool_t *subpool = svn_pool_create(pool);
+ apr_pool_t *iterpool = svn_pool_create(pool);
int i;
for (i = 0; i < paths->nelts; i++)
{
const char *path = APR_ARRAY_IDX(paths, i, const char *);
- svn_pool_clear(subpool);
+ svn_pool_clear(iterpool);
/* See if the user wants us to stop. */
if (ctx->cancel_func)
SVN_ERR(ctx->cancel_func(ctx->cancel_baton));
+ SVN_ERR(svn_dirent_get_absolute(&path, path, iterpool));
+
SVN_ERR(svn_client__make_local_parents(path, make_parents, ctx,
- subpool));
+ iterpool));
}
- svn_pool_destroy(subpool);
+ svn_pool_destroy(iterpool);
}
return SVN_NO_ERROR;
diff --git a/subversion/libsvn_client/blame.c b/subversion/libsvn_client/blame.c
index 188fdd2bdc2a..b9363e20dd3e 100644
--- a/subversion/libsvn_client/blame.c
+++ b/subversion/libsvn_client/blame.c
@@ -34,6 +34,7 @@
#include "svn_dirent_uri.h"
#include "svn_path.h"
#include "svn_props.h"
+#include "svn_hash.h"
#include "svn_sorts.h"
#include "private/svn_wc_private.h"
@@ -73,16 +74,16 @@ struct diff_baton {
const struct rev *rev;
};
-/* The baton used for a file revision. */
+/* The baton used for a file revision. Lives the entire operation */
struct file_rev_baton {
svn_revnum_t start_rev, end_rev;
+ svn_boolean_t backwards;
const char *target;
svn_client_ctx_t *ctx;
const svn_diff_file_options_t *diff_options;
/* name of file containing the previous revision of the file */
const char *last_filename;
- struct rev *rev; /* the rev for which blame is being assigned
- during a diff */
+ struct rev *last_rev; /* the rev of the last modification */
struct blame_chain *chain; /* the original blame chain. */
const char *repos_root_url; /* To construct a url */
apr_pool_t *mainpool; /* lives during the whole sequence of calls */
@@ -91,22 +92,32 @@ struct file_rev_baton {
/* These are used for tracking merged revisions. */
svn_boolean_t include_merged_revisions;
- svn_boolean_t merged_revision;
struct blame_chain *merged_chain; /* the merged blame chain. */
/* name of file containing the previous merged revision of the file */
const char *last_original_filename;
/* pools for files which may need to persist for more than one rev. */
apr_pool_t *filepool;
apr_pool_t *prevfilepool;
+
+ svn_boolean_t check_mime_type;
+
+ /* When blaming backwards we have to use the changes
+ on the *next* revision, as the interesting change
+ happens when we move to the previous revision */
+ svn_revnum_t last_revnum;
+ apr_hash_t *last_props;
};
-/* The baton used by the txdelta window handler. */
+/* The baton used by the txdelta window handler. Allocated per revision */
struct delta_baton {
/* Our underlying handler/baton that we wrap */
svn_txdelta_window_handler_t wrapped_handler;
void *wrapped_baton;
struct file_rev_baton *file_rev_baton;
+ svn_stream_t *source_stream; /* the delta source */
const char *filename;
+ svn_boolean_t is_merged_revision;
+ struct rev *rev; /* the rev struct for the current revision */
};
@@ -280,6 +291,8 @@ add_file_blame(const char *last_file,
struct blame_chain *chain,
struct rev *rev,
const svn_diff_file_options_t *diff_options,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
apr_pool_t *pool)
{
if (!last_file)
@@ -298,32 +311,28 @@ add_file_blame(const char *last_file,
/* We have a previous file. Get the diff and adjust blame info. */
SVN_ERR(svn_diff_file_diff_2(&diff, last_file, cur_file,
diff_options, pool));
- SVN_ERR(svn_diff_output(diff, &diff_baton, &output_fns));
+ SVN_ERR(svn_diff_output2(diff, &diff_baton, &output_fns,
+ cancel_func, cancel_baton));
}
return SVN_NO_ERROR;
}
-/* The delta window handler for the text delta between the previously seen
- * revision and the revision currently being handled.
- *
- * Record the blame information for this revision in BATON->file_rev_baton.
- *
- * Implements svn_txdelta_window_handler_t.
+/* Record the blame information for the revision in BATON->file_rev_baton.
*/
static svn_error_t *
-window_handler(svn_txdelta_window_t *window, void *baton)
+update_blame(void *baton)
{
struct delta_baton *dbaton = baton;
struct file_rev_baton *frb = dbaton->file_rev_baton;
struct blame_chain *chain;
- /* Call the wrapped handler first. */
- SVN_ERR(dbaton->wrapped_handler(window, dbaton->wrapped_baton));
-
- /* We patiently wait for the NULL window marking the end. */
- if (window)
- return SVN_NO_ERROR;
+ /* Close the source file used for the delta.
+ It is important to do this early, since otherwise, they will be deleted
+ before all handles are closed, which leads to failures on some platforms
+ when new tempfiles are to be created. */
+ if (dbaton->source_stream)
+ SVN_ERR(svn_stream_close(dbaton->source_stream));
/* If we are including merged revisions, we need to add each rev to the
merged chain. */
@@ -334,19 +343,23 @@ window_handler(svn_txdelta_window_t *window, void *baton)
/* Process this file. */
SVN_ERR(add_file_blame(frb->last_filename,
- dbaton->filename, chain, frb->rev,
- frb->diff_options, frb->currpool));
+ dbaton->filename, chain, dbaton->rev,
+ frb->diff_options,
+ frb->ctx->cancel_func, frb->ctx->cancel_baton,
+ frb->currpool));
/* If we are including merged revisions, and the current revision is not a
merged one, we need to add its blame info to the chain for the original
line of history. */
- if (frb->include_merged_revisions && ! frb->merged_revision)
+ if (frb->include_merged_revisions && ! dbaton->is_merged_revision)
{
apr_pool_t *tmppool;
SVN_ERR(add_file_blame(frb->last_original_filename,
- dbaton->filename, frb->chain, frb->rev,
- frb->diff_options, frb->currpool));
+ dbaton->filename, frb->chain, dbaton->rev,
+ frb->diff_options,
+ frb->ctx->cancel_func, frb->ctx->cancel_baton,
+ frb->currpool));
/* This filename could be around for a while, potentially, so
use the longer lifetime pool, and switch it with the previous one*/
@@ -374,6 +387,32 @@ window_handler(svn_txdelta_window_t *window, void *baton)
return SVN_NO_ERROR;
}
+/* The delta window handler for the text delta between the previously seen
+ * revision and the revision currently being handled.
+ *
+ * Record the blame information for this revision in BATON->file_rev_baton.
+ *
+ * Implements svn_txdelta_window_handler_t.
+ */
+static svn_error_t *
+window_handler(svn_txdelta_window_t *window, void *baton)
+{
+ struct delta_baton *dbaton = baton;
+
+ /* Call the wrapped handler first. */
+ if (dbaton->wrapped_handler)
+ SVN_ERR(dbaton->wrapped_handler(window, dbaton->wrapped_baton));
+
+ /* We patiently wait for the NULL window marking the end. */
+ if (window)
+ return SVN_NO_ERROR;
+
+ /* Diff and update blame info. */
+ SVN_ERR(update_blame(baton));
+
+ return SVN_NO_ERROR;
+}
+
/* Calculate and record blame information for one revision of the file,
* by comparing the file content against the previously seen revision.
@@ -402,6 +441,26 @@ file_rev_handler(void *baton, const char *path, svn_revnum_t revnum,
/* Clear the current pool. */
svn_pool_clear(frb->currpool);
+ if (frb->check_mime_type)
+ {
+ apr_hash_t *props = svn_prop_array_to_hash(prop_diffs, frb->currpool);
+ const char *value;
+
+ frb->check_mime_type = FALSE; /* Only check first */
+
+ value = svn_prop_get_value(props, SVN_PROP_MIME_TYPE);
+
+ if (value && svn_mime_type_is_binary(value))
+ {
+ return svn_error_createf(
+ SVN_ERR_CLIENT_IS_BINARY_FILE, NULL,
+ _("Cannot calculate blame information for binary file '%s'"),
+ (svn_path_is_url(frb->target)
+ ? frb->target
+ : svn_dirent_local_style(frb->target, pool)));
+ }
+ }
+
if (frb->ctx->notify_func2)
{
svn_wc_notify_t *notify
@@ -422,72 +481,112 @@ file_rev_handler(void *baton, const char *path, svn_revnum_t revnum,
if (frb->ctx->cancel_func)
SVN_ERR(frb->ctx->cancel_func(frb->ctx->cancel_baton));
- /* If there were no content changes, we couldn't care less about this
- revision now. Note that we checked the mime type above, so things
- work if the user just changes the mime type in a commit.
+ /* If there were no content changes and no (potential) merges, we couldn't
+ care less about this revision now. Note that we checked the mime type
+ above, so things work if the user just changes the mime type in a commit.
Also note that we don't switch the pools in this case. This is important,
since the tempfile will be removed by the pool and we need the tempfile
from the last revision with content changes. */
- if (!content_delta_handler)
+ if (!content_delta_handler
+ && (!frb->include_merged_revisions || merged_revision))
return SVN_NO_ERROR;
- frb->merged_revision = merged_revision;
-
/* Create delta baton. */
- delta_baton = apr_palloc(frb->currpool, sizeof(*delta_baton));
+ delta_baton = apr_pcalloc(frb->currpool, sizeof(*delta_baton));
/* Prepare the text delta window handler. */
if (frb->last_filename)
- SVN_ERR(svn_stream_open_readonly(&last_stream, frb->last_filename,
+ SVN_ERR(svn_stream_open_readonly(&delta_baton->source_stream, frb->last_filename,
frb->currpool, pool));
else
- last_stream = svn_stream_empty(frb->currpool);
+ /* Means empty stream below. */
+ delta_baton->source_stream = NULL;
+ last_stream = svn_stream_disown(delta_baton->source_stream, pool);
- if (frb->include_merged_revisions && !frb->merged_revision)
+ if (frb->include_merged_revisions && !merged_revision)
filepool = frb->filepool;
else
filepool = frb->currpool;
SVN_ERR(svn_stream_open_unique(&cur_stream, &delta_baton->filename, NULL,
svn_io_file_del_on_pool_cleanup,
- filepool, pool));
-
- /* Get window handler for applying delta. */
- svn_txdelta_apply(last_stream, cur_stream, NULL, NULL,
- frb->currpool,
- &delta_baton->wrapped_handler,
- &delta_baton->wrapped_baton);
+ filepool, filepool));
/* Wrap the window handler with our own. */
delta_baton->file_rev_baton = frb;
- *content_delta_handler = window_handler;
- *content_delta_baton = delta_baton;
+ delta_baton->is_merged_revision = merged_revision;
/* Create the rev structure. */
- frb->rev = apr_pcalloc(frb->mainpool, sizeof(struct rev));
+ delta_baton->rev = apr_pcalloc(frb->mainpool, sizeof(struct rev));
- if (revnum < frb->start_rev)
+ if (frb->backwards)
{
- /* We shouldn't get more than one revision before the starting
- revision (unless of including merged revisions). */
- SVN_ERR_ASSERT((frb->last_filename == NULL)
- || frb->include_merged_revisions);
+ /* Use from last round...
+ SVN_INVALID_REVNUM on first, which is exactly
+ what we want */
+ delta_baton->rev->revision = frb->last_revnum;
+ delta_baton->rev->rev_props = frb->last_props;
+
+ /* Store for next delta */
+ if (revnum >= MIN(frb->start_rev, frb->end_rev))
+ {
+ frb->last_revnum = revnum;
+ frb->last_props = svn_prop_hash_dup(rev_props, frb->mainpool);
+ }
+ /* Else: Not needed on last rev */
+ }
+ else if (merged_revision
+ || (revnum >= MIN(frb->start_rev, frb->end_rev)))
+ {
+ /* 1+ for the "youngest to oldest" blame */
+ SVN_ERR_ASSERT(revnum <= 1 + MAX(frb->end_rev, frb->start_rev));
- /* The file existed before start_rev; generate no blame info for
- lines from this revision (or before). */
- frb->rev->revision = SVN_INVALID_REVNUM;
+ /* Set values from revision props. */
+ delta_baton->rev->revision = revnum;
+ delta_baton->rev->rev_props = svn_prop_hash_dup(rev_props, frb->mainpool);
}
else
{
- SVN_ERR_ASSERT(revnum <= frb->end_rev);
+ /* We shouldn't get more than one revision outside the
+ specified range (unless we alsoe receive merged revisions) */
+ SVN_ERR_ASSERT((frb->last_filename == NULL)
+ || frb->include_merged_revisions);
- /* Set values from revision props. */
- frb->rev->revision = revnum;
- frb->rev->rev_props = svn_prop_hash_dup(rev_props, frb->mainpool);
+ /* The file existed before start_rev; generate no blame info for
+ lines from this revision (or before).
+
+ This revision specifies the state as it was at the start revision */
+
+ delta_baton->rev->revision = SVN_INVALID_REVNUM;
}
if (frb->include_merged_revisions)
- frb->rev->path = apr_pstrdup(frb->mainpool, path);
+ delta_baton->rev->path = apr_pstrdup(frb->mainpool, path);
+
+ /* Keep last revision for postprocessing after all changes */
+ frb->last_rev = delta_baton->rev;
+
+ /* Handle all delta - even if it is empty.
+ We must do the latter to "merge" blame info from other branches. */
+ if (content_delta_handler)
+ {
+ /* Proper delta - get window handler for applying delta.
+ svn_ra_get_file_revs2 will drive the delta editor. */
+ svn_txdelta_apply(last_stream, cur_stream, NULL, NULL,
+ frb->currpool,
+ &delta_baton->wrapped_handler,
+ &delta_baton->wrapped_baton);
+ *content_delta_handler = window_handler;
+ *content_delta_baton = delta_baton;
+ }
+ else
+ {
+ /* Apply an empty delta, i.e. simply copy the old contents.
+ We can't simply use the existing file due to the pool rotation logic.
+ Trigger the blame update magic. */
+ SVN_ERR(svn_stream_copy3(last_stream, cur_stream, NULL, NULL, pool));
+ SVN_ERR(update_blame(delta_baton));
+ }
return SVN_NO_ERROR;
}
@@ -572,7 +671,6 @@ svn_client_blame5(const char *target,
struct file_rev_baton frb;
svn_ra_session_t *ra_session;
svn_revnum_t start_revnum, end_revnum;
- svn_client__pathrev_t *end_loc;
struct blame *walk, *walk_merged = NULL;
apr_pool_t *iterpool;
svn_stream_t *last_stream;
@@ -590,44 +688,77 @@ svn_client_blame5(const char *target,
SVN_ERR(svn_dirent_get_absolute(&target_abspath_or_url, target, pool));
/* Get an RA plugin for this filesystem object. */
- SVN_ERR(svn_client__ra_session_from_path2(&ra_session, &end_loc,
- target, NULL, peg_revision, end,
+ SVN_ERR(svn_client__ra_session_from_path2(&ra_session, NULL,
+ target, NULL, peg_revision,
+ peg_revision,
ctx, pool));
- end_revnum = end_loc->rev;
SVN_ERR(svn_client__get_revision_number(&start_revnum, NULL, ctx->wc_ctx,
target_abspath_or_url, ra_session,
start, pool));
- if (end_revnum < start_revnum)
- return svn_error_create
- (SVN_ERR_CLIENT_BAD_REVISION, NULL,
- _("Start revision must precede end revision"));
+ SVN_ERR(svn_client__get_revision_number(&end_revnum, NULL, ctx->wc_ctx,
+ target_abspath_or_url, ra_session,
+ end, pool));
+
+ {
+ svn_client__pathrev_t *loc;
+ svn_opt_revision_t younger_end;
+ younger_end.kind = svn_opt_revision_number;
+ younger_end.value.number = MAX(start_revnum, end_revnum);
+
+ SVN_ERR(svn_client__resolve_rev_and_url(&loc, ra_session,
+ target, peg_revision,
+ &younger_end,
+ ctx, pool));
+
+ /* Make the session point to the real URL. */
+ SVN_ERR(svn_ra_reparent(ra_session, loc->url, pool));
+ }
/* We check the mime-type of the yougest revision before getting all
the older revisions. */
- if (!ignore_mime_type)
+ if (!ignore_mime_type
+ && start_revnum < end_revnum)
{
apr_hash_t *props;
- apr_hash_index_t *hi;
+ const char *mime_type = NULL;
- SVN_ERR(svn_client_propget5(&props, NULL, SVN_PROP_MIME_TYPE,
- target_abspath_or_url, peg_revision,
- end, NULL, svn_depth_empty, NULL, ctx,
- pool, pool));
+ if (svn_path_is_url(target)
+ || start_revnum > end_revnum
+ || (end->kind != svn_opt_revision_working
+ && end->kind != svn_opt_revision_base))
+ {
+ SVN_ERR(svn_ra_get_file(ra_session, "", end_revnum, NULL, NULL,
+ &props, pool));
- /* props could be keyed on URLs or paths depending on the
- peg_revision and end values so avoid using the key. */
- hi = apr_hash_first(pool, props);
- if (hi)
+ mime_type = svn_prop_get_value(props, SVN_PROP_MIME_TYPE);
+ }
+ else
{
- svn_string_t *value;
+ const svn_string_t *value;
+
+ if (end->kind == svn_opt_revision_working)
+ SVN_ERR(svn_wc_prop_get2(&value, ctx->wc_ctx,
+ target_abspath_or_url,
+ SVN_PROP_MIME_TYPE,
+ pool, pool));
+ else
+ {
+ SVN_ERR(svn_wc_get_pristine_props(&props, ctx->wc_ctx,
+ target_abspath_or_url,
+ pool, pool));
- /* Should only be one value */
- SVN_ERR_ASSERT(apr_hash_count(props) == 1);
+ value = props ? svn_hash_gets(props, SVN_PROP_MIME_TYPE)
+ : NULL;
+ }
- value = svn__apr_hash_index_val(hi);
- if (value && svn_mime_type_is_binary(value->data))
+ mime_type = value ? value->data : NULL;
+ }
+
+ if (mime_type)
+ {
+ if (svn_mime_type_is_binary(mime_type))
return svn_error_createf
(SVN_ERR_CLIENT_IS_BINARY_FILE, 0,
_("Cannot calculate blame information for binary file '%s'"),
@@ -643,6 +774,7 @@ svn_client_blame5(const char *target,
frb.diff_options = diff_options;
frb.include_merged_revisions = include_merged_revisions;
frb.last_filename = NULL;
+ frb.last_rev = NULL;
frb.last_original_filename = NULL;
frb.chain = apr_palloc(pool, sizeof(*frb.chain));
frb.chain->blame = NULL;
@@ -655,6 +787,10 @@ svn_client_blame5(const char *target,
frb.merged_chain->avail = NULL;
frb.merged_chain->pool = pool;
}
+ frb.backwards = (frb.start_rev > frb.end_rev);
+ frb.last_revnum = SVN_INVALID_REVNUM;
+ frb.last_props = NULL;
+ frb.check_mime_type = (frb.backwards && !ignore_mime_type);
SVN_ERR(svn_ra_get_repos_root2(ra_session, &frb.repos_root_url, pool));
@@ -675,8 +811,10 @@ svn_client_blame5(const char *target,
if available so that we can know what was actually changed in the start
revision. */
SVN_ERR(svn_ra_get_file_revs2(ra_session, "",
- start_revnum - (start_revnum > 0 ? 1 : 0),
- end_revnum, include_merged_revisions,
+ frb.backwards ? start_revnum
+ : MAX(0, start_revnum-1),
+ end_revnum,
+ include_merged_revisions,
file_rev_handler, &frb, pool));
if (end->kind == svn_opt_revision_working)
@@ -732,7 +870,8 @@ svn_client_blame5(const char *target,
ctx->cancel_baton, pool));
SVN_ERR(add_file_blame(frb.last_filename, temppath, frb.chain, NULL,
- frb.diff_options, pool));
+ frb.diff_options,
+ ctx->cancel_func, ctx->cancel_baton, pool));
frb.last_filename = temppath;
}
@@ -762,7 +901,7 @@ svn_client_blame5(const char *target,
the most recently changed revision. ### Is this really what we want
to do here? Do the sematics of copy change? */
if (!frb.chain->blame)
- frb.chain->blame = blame_create(frb.chain, frb.rev, 0);
+ frb.chain->blame = blame_create(frb.chain, frb.last_rev, 0);
normalize_blames(frb.chain, frb.merged_chain, pool);
walk_merged = frb.merged_chain->blame;
diff --git a/subversion/libsvn_client/cat.c b/subversion/libsvn_client/cat.c
index 7c58f884880e..8c6aac85a591 100644
--- a/subversion/libsvn_client/cat.c
+++ b/subversion/libsvn_client/cat.c
@@ -176,18 +176,21 @@ svn_client__get_normalized_stream(svn_stream_t **normal_stream,
}
svn_error_t *
-svn_client_cat2(svn_stream_t *out,
+svn_client_cat3(apr_hash_t **returned_props,
+ svn_stream_t *out,
const char *path_or_url,
const svn_opt_revision_t *peg_revision,
const svn_opt_revision_t *revision,
+ svn_boolean_t expand_keywords,
svn_client_ctx_t *ctx,
- apr_pool_t *pool)
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
svn_ra_session_t *ra_session;
svn_client__pathrev_t *loc;
svn_string_t *eol_style;
svn_string_t *keywords;
- apr_hash_t *props;
+ apr_hash_t *props = NULL;
const char *repos_root_url;
svn_stream_t *output = out;
svn_error_t *err;
@@ -201,8 +204,6 @@ svn_client_cat2(svn_stream_t *out,
}
else
{
- peg_revision = svn_cl__rev_default_to_head_or_working(peg_revision,
- path_or_url);
revision = svn_cl__rev_default_to_peg(revision, peg_revision);
}
@@ -213,32 +214,39 @@ svn_client_cat2(svn_stream_t *out,
const char *local_abspath;
svn_stream_t *normal_stream;
- SVN_ERR(svn_dirent_get_absolute(&local_abspath, path_or_url, pool));
+ SVN_ERR(svn_dirent_get_absolute(&local_abspath, path_or_url,
+ scratch_pool));
SVN_ERR(svn_client__get_normalized_stream(&normal_stream, ctx->wc_ctx,
- local_abspath, revision, TRUE, FALSE,
+ local_abspath, revision,
+ expand_keywords, FALSE,
ctx->cancel_func, ctx->cancel_baton,
- pool, pool));
+ scratch_pool, scratch_pool));
/* We don't promise to close output, so disown it to ensure we don't. */
- output = svn_stream_disown(output, pool);
+ output = svn_stream_disown(output, scratch_pool);
+
+ if (returned_props)
+ SVN_ERR(svn_wc_prop_list2(returned_props, ctx->wc_ctx, local_abspath,
+ result_pool, scratch_pool));
return svn_error_trace(svn_stream_copy3(normal_stream, output,
ctx->cancel_func,
- ctx->cancel_baton, pool));
+ ctx->cancel_baton, scratch_pool));
}
/* Get an RA plugin for this filesystem object. */
SVN_ERR(svn_client__ra_session_from_path2(&ra_session, &loc,
path_or_url, NULL,
peg_revision,
- revision, ctx, pool));
+ revision, ctx, scratch_pool));
/* Find the repos root URL */
- SVN_ERR(svn_ra_get_repos_root2(ra_session, &repos_root_url, pool));
+ SVN_ERR(svn_ra_get_repos_root2(ra_session, &repos_root_url, scratch_pool));
/* Grab some properties we need to know in order to figure out if anything
special needs to be done with this file. */
- err = svn_ra_get_file(ra_session, "", loc->rev, NULL, NULL, &props, pool);
+ err = svn_ra_get_file(ra_session, "", loc->rev, NULL, NULL, &props,
+ result_pool);
if (err)
{
if (err->apr_err == SVN_ERR_FS_NOT_FILE)
@@ -272,7 +280,7 @@ svn_client_cat2(svn_stream_t *out,
}
- if (keywords)
+ if (keywords && expand_keywords)
{
svn_string_t *cmt_rev, *cmt_date, *cmt_author;
apr_time_t when = 0;
@@ -281,24 +289,45 @@ svn_client_cat2(svn_stream_t *out,
cmt_date = svn_hash_gets(props, SVN_PROP_ENTRY_COMMITTED_DATE);
cmt_author = svn_hash_gets(props, SVN_PROP_ENTRY_LAST_AUTHOR);
if (cmt_date)
- SVN_ERR(svn_time_from_cstring(&when, cmt_date->data, pool));
+ SVN_ERR(svn_time_from_cstring(&when, cmt_date->data, scratch_pool));
SVN_ERR(svn_subst_build_keywords3(&kw, keywords->data,
cmt_rev->data, loc->url,
repos_root_url, when,
cmt_author ?
cmt_author->data : NULL,
- pool));
+ scratch_pool));
}
else
kw = NULL;
/* Interject a translating stream */
- output = svn_subst_stream_translated(svn_stream_disown(out, pool),
- eol_str, FALSE, kw, TRUE, pool);
+ output = svn_subst_stream_translated(svn_stream_disown(out,
+ scratch_pool),
+ eol_str, FALSE, kw, TRUE,
+ scratch_pool);
+ }
+
+ if (returned_props)
+ {
+ /* filter entry and WC props */
+ apr_hash_index_t *hi;
+ const void *key;
+ apr_ssize_t klen;
+
+ for (hi = apr_hash_first(scratch_pool, props);
+ hi; hi = apr_hash_next(hi))
+ {
+ apr_hash_this(hi, &key, &klen, NULL);
+ if (!svn_wc_is_normal_prop(key))
+ apr_hash_set(props, key, klen, NULL);
+ }
+
+ *returned_props = props;
}
- SVN_ERR(svn_ra_get_file(ra_session, "", loc->rev, output, NULL, NULL, pool));
+ SVN_ERR(svn_ra_get_file(ra_session, "", loc->rev, output, NULL, NULL,
+ scratch_pool));
if (out != output)
/* Close the interjected stream */
diff --git a/subversion/libsvn_client/checkout.c b/subversion/libsvn_client/checkout.c
index 41be776f16e2..0d20e24e117a 100644
--- a/subversion/libsvn_client/checkout.c
+++ b/subversion/libsvn_client/checkout.c
@@ -67,6 +67,7 @@ initialize_area(const char *local_abspath,
svn_error_t *
svn_client__checkout_internal(svn_revnum_t *result_rev,
+ svn_boolean_t *timestamp_sleep,
const char *url,
const char *local_abspath,
const svn_opt_revision_t *peg_revision,
@@ -74,18 +75,16 @@ svn_client__checkout_internal(svn_revnum_t *result_rev,
svn_depth_t depth,
svn_boolean_t ignore_externals,
svn_boolean_t allow_unver_obstructions,
- svn_boolean_t *timestamp_sleep,
+ svn_ra_session_t *ra_session,
svn_client_ctx_t *ctx,
- apr_pool_t *pool)
+ apr_pool_t *scratch_pool)
{
svn_node_kind_t kind;
- apr_pool_t *session_pool = svn_pool_create(pool);
- svn_ra_session_t *ra_session;
svn_client__pathrev_t *pathrev;
/* Sanity check. Without these, the checkout is meaningless. */
SVN_ERR_ASSERT(local_abspath != NULL);
- SVN_ERR_ASSERT(svn_uri_is_canonical(url, pool));
+ SVN_ERR_ASSERT(svn_uri_is_canonical(url, scratch_pool));
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
/* Fulfill the docstring promise of svn_client_checkout: */
@@ -94,15 +93,38 @@ svn_client__checkout_internal(svn_revnum_t *result_rev,
&& (revision->kind != svn_opt_revision_head))
return svn_error_create(SVN_ERR_CLIENT_BAD_REVISION, NULL, NULL);
- /* Get the RA connection. */
- SVN_ERR(svn_client__ra_session_from_path2(&ra_session, &pathrev,
- url, NULL, peg_revision, revision,
- ctx, session_pool));
+ /* Get the RA connection, if needed. */
+ if (ra_session)
+ {
+ svn_error_t *err = svn_ra_reparent(ra_session, url, scratch_pool);
+
+ if (err)
+ {
+ if (err->apr_err == SVN_ERR_RA_ILLEGAL_URL)
+ {
+ svn_error_clear(err);
+ ra_session = NULL;
+ }
+ else
+ return svn_error_trace(err);
+ }
+ else
+ {
+ SVN_ERR(svn_client__resolve_rev_and_url(&pathrev,
+ ra_session, url,
+ peg_revision, revision,
+ ctx, scratch_pool));
+ }
+ }
- pathrev = svn_client__pathrev_dup(pathrev, pool);
- SVN_ERR(svn_ra_check_path(ra_session, "", pathrev->rev, &kind, pool));
+ if (!ra_session)
+ {
+ SVN_ERR(svn_client__ra_session_from_path2(&ra_session, &pathrev,
+ url, NULL, peg_revision,
+ revision, ctx, scratch_pool));
+ }
- svn_pool_destroy(session_pool);
+ SVN_ERR(svn_ra_check_path(ra_session, "", pathrev->rev, &kind, scratch_pool));
if (kind == svn_node_none)
return svn_error_createf(SVN_ERR_RA_ILLEGAL_URL, NULL,
@@ -112,31 +134,35 @@ svn_client__checkout_internal(svn_revnum_t *result_rev,
(SVN_ERR_UNSUPPORTED_FEATURE , NULL,
_("URL '%s' refers to a file, not a directory"), pathrev->url);
- SVN_ERR(svn_io_check_path(local_abspath, &kind, pool));
+ SVN_ERR(svn_io_check_path(local_abspath, &kind, scratch_pool));
if (kind == svn_node_none)
{
/* Bootstrap: create an incomplete working-copy root dir. Its
entries file should only have an entry for THIS_DIR with a
URL, revnum, and an 'incomplete' flag. */
- SVN_ERR(svn_io_make_dir_recursively(local_abspath, pool));
- SVN_ERR(initialize_area(local_abspath, pathrev, depth, ctx, pool));
+ SVN_ERR(svn_io_make_dir_recursively(local_abspath, scratch_pool));
+ SVN_ERR(initialize_area(local_abspath, pathrev, depth, ctx,
+ scratch_pool));
}
else if (kind == svn_node_dir)
{
int wc_format;
const char *entry_url;
- SVN_ERR(svn_wc_check_wc2(&wc_format, ctx->wc_ctx, local_abspath, pool));
+ SVN_ERR(svn_wc_check_wc2(&wc_format, ctx->wc_ctx, local_abspath,
+ scratch_pool));
+
if (! wc_format)
{
- SVN_ERR(initialize_area(local_abspath, pathrev, depth, ctx, pool));
+ SVN_ERR(initialize_area(local_abspath, pathrev, depth, ctx,
+ scratch_pool));
}
else
{
/* Get PATH's URL. */
SVN_ERR(svn_wc__node_get_url(&entry_url, ctx->wc_ctx, local_abspath,
- pool, pool));
+ scratch_pool, scratch_pool));
/* If PATH's existing URL matches the incoming one, then
just update. This allows 'svn co' to restart an
@@ -146,24 +172,25 @@ svn_client__checkout_internal(svn_revnum_t *result_rev,
SVN_ERR_WC_OBSTRUCTED_UPDATE, NULL,
_("'%s' is already a working copy for a"
" different URL"),
- svn_dirent_local_style(local_abspath, pool));
+ svn_dirent_local_style(local_abspath, scratch_pool));
}
}
else
{
return svn_error_createf(SVN_ERR_WC_NODE_KIND_CHANGE, NULL,
_("'%s' already exists and is not a directory"),
- svn_dirent_local_style(local_abspath, pool));
+ svn_dirent_local_style(local_abspath,
+ scratch_pool));
}
/* Have update fix the incompleteness. */
- SVN_ERR(svn_client__update_internal(result_rev, local_abspath,
- revision, depth, TRUE,
+ SVN_ERR(svn_client__update_internal(result_rev, timestamp_sleep,
+ local_abspath, revision, depth, TRUE,
ignore_externals,
allow_unver_obstructions,
TRUE /* adds_as_modification */,
- FALSE, FALSE,
- timestamp_sleep, ctx, pool));
+ FALSE, FALSE, ra_session,
+ ctx, scratch_pool));
return SVN_NO_ERROR;
}
@@ -186,10 +213,12 @@ svn_client_checkout3(svn_revnum_t *result_rev,
SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
- err = svn_client__checkout_internal(result_rev, URL, local_abspath,
+ err = svn_client__checkout_internal(result_rev, &sleep_here,
+ URL, local_abspath,
peg_revision, revision, depth,
ignore_externals,
- allow_unver_obstructions, &sleep_here,
+ allow_unver_obstructions,
+ NULL /* ra_session */,
ctx, pool);
if (sleep_here)
svn_io_sleep_for_timestamps(local_abspath, pool);
diff --git a/subversion/libsvn_client/cleanup.c b/subversion/libsvn_client/cleanup.c
index b15e824d3490..e3fffdcaf0db 100644
--- a/subversion/libsvn_client/cleanup.c
+++ b/subversion/libsvn_client/cleanup.c
@@ -32,32 +32,234 @@
#include "svn_client.h"
#include "svn_config.h"
#include "svn_dirent_uri.h"
+#include "svn_hash.h"
#include "svn_path.h"
#include "svn_pools.h"
#include "client.h"
#include "svn_props.h"
#include "svn_private_config.h"
+#include "private/svn_wc_private.h"
/*** Code. ***/
+struct cleanup_status_walk_baton
+{
+ svn_boolean_t break_locks;
+ svn_boolean_t fix_timestamps;
+ svn_boolean_t clear_dav_cache;
+ svn_boolean_t vacuum_pristines;
+ svn_boolean_t remove_unversioned_items;
+ svn_boolean_t remove_ignored_items;
+ svn_boolean_t include_externals;
+ svn_client_ctx_t *ctx;
+};
+
+/* Forward declararion. */
+static svn_error_t *
+cleanup_status_walk(void *baton,
+ const char *local_abspath,
+ const svn_wc_status3_t *status,
+ apr_pool_t *scratch_pool);
+
+static svn_error_t *
+do_cleanup(const char *local_abspath,
+ svn_boolean_t break_locks,
+ svn_boolean_t fix_timestamps,
+ svn_boolean_t clear_dav_cache,
+ svn_boolean_t vacuum_pristines,
+ svn_boolean_t remove_unversioned_items,
+ svn_boolean_t remove_ignored_items,
+ svn_boolean_t include_externals,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *scratch_pool)
+{
+ SVN_ERR(svn_wc_cleanup4(ctx->wc_ctx,
+ local_abspath,
+ break_locks,
+ fix_timestamps,
+ clear_dav_cache,
+ vacuum_pristines,
+ ctx->cancel_func, ctx->cancel_baton,
+ ctx->notify_func2, ctx->notify_baton2,
+ scratch_pool));
+
+ if (fix_timestamps)
+ svn_io_sleep_for_timestamps(local_abspath, scratch_pool);
+
+ if (remove_unversioned_items || remove_ignored_items || include_externals)
+ {
+ struct cleanup_status_walk_baton b;
+ apr_array_header_t *ignores;
+
+ b.break_locks = break_locks;
+ b.fix_timestamps = fix_timestamps;
+ b.clear_dav_cache = clear_dav_cache;
+ b.vacuum_pristines = vacuum_pristines;
+ b.remove_unversioned_items = remove_unversioned_items;
+ b.remove_ignored_items = remove_ignored_items;
+ b.include_externals = include_externals;
+ b.ctx = ctx;
+
+ SVN_ERR(svn_wc_get_default_ignores(&ignores, ctx->config, scratch_pool));
+
+ SVN_WC__CALL_WITH_WRITE_LOCK(
+ svn_wc_walk_status(ctx->wc_ctx, local_abspath,
+ svn_depth_infinity,
+ TRUE, /* get all */
+ remove_ignored_items,
+ TRUE, /* ignore textmods */
+ ignores,
+ cleanup_status_walk, &b,
+ ctx->cancel_func,
+ ctx->cancel_baton,
+ scratch_pool),
+